von dem, was ich gelesen habe hier scheint es, dass die meisten Windows GDI-Funktionen beschleunigt werden. So verwendet beispielsweise ein Aufruf von BitBlt
oder AlphaBlend
die Hardwarebeschleunigung, falls verfügbar. Es erwähnt auch, dass der Inhalt eines Fensters nur im Videospeicher gehalten wird. Nun, das ist alles gut und richtig für ein Fenster DC , aber wie kann ich einen Speicher DC im Grafikkartenspeicher verwenden? Und sobald wir erreicht haben, wie man direkten Zugang zu den Pixeln erhält, denke ich, dass das 1. vorübergehendes Kopieren der Daten in den Systemspeicher 2, Ändern der Pixeldaten, 3. Kopieren in den Videospeicher, beinhalten würde.
Ich habe zwei Ansätze ausprobiert, beide weisen Systemspeicher zu, wie ich im Taskmanager sehen kann ...
CreateCompatibleBitmap
%Vor%und dann aufrufen, um die Bits
zu erhalten %Vor% nach verschiedenen Kommentaren sollte dies in der Tat die kompatible Bitmap im Videospeicher erstellen, aber warum kann ich immer noch einen Anstieg im Systemspeicher sehen (auch wenn ich GetBitmapBits
nicht anrufe)?
CreateDIBSection
%Vor% In diesem Fall erhalten wir sofort den Zeiger auf die Bits ( m_pBits
), so dass es offensichtlich ist, dass diese im Systemspeicher liegen ...
Oder ist es eine Kopie, die für beide Methoden im Systemspeicher gehalten wird? Aber wenn ich die Bits im Systemspeicher ändere, müsste ein Aufruf von BitBlt
immer noch aus dem Systemspeicher prüfen / kopieren ... nicht sehr optimiertes IMHO.
BEARBEITEN: Ich habe auch versucht, Speicher-DCs zu erstellen, indem ich BeginBufferedPaint
und GetBufferedPaintBits
verwende. Es weist auch Systemspeicher zu, also nehme ich an, dass es nur ein Wrapper für die obigen Methoden ist, aber die DCs zwischenspeichert, so dass ein nächster Aufruf nicht unbedingt einen Speicher DC neu erstellen muss. Siehe Raymond Chens Artikel .
EDIT # 2: Ich denke, die eigentliche Frage lautet: Mache ich die Speicher-DC-Erstellung in Methode 1 oder 2, um Hardware-beschleunigte GDI-Operationen zu erhalten? Mir scheint alles schnell, und beides Methoden bieten auch die gleiche Geschwindigkeit, so gibt es nicht wirklich eine Möglichkeit, es zu überprüfen ...
Speicher-DCs werden nicht auf einem Gerät erstellt. Sie sind entworfen, um GDI-Ausgabe in den Speicher zu legen.
Von Speichergerätekontexte auf MSDN:
So aktivieren Sie Anwendungen, um Ausgaben im Speicher zu platzieren, anstatt sie zu senden Verwenden Sie für ein tatsächliches Gerät einen speziellen Gerätekontext für Bitmap Operationen, die als Speichergerätekontext bezeichnet werden. Ein Speicher DC ermöglicht die System, um einen Teil des Speichers als virtuelles Gerät zu behandeln.
Wenn Sie hardwarebeschleunigte 2D-Grafiken wünschen, sollten Sie Direct2D .