Overlays
-
Hallo Leute,
ich stamme noch einem Jahrhundert, in dem die XOR-Raster-Op der Weg war, um temporäre Sachen über den Hintergrund zu zeichnen.
Heutzutage ist es nun aber so, GDI und XOR wohl nicht mehr so richtig beschleunigt werden (irgendwie glaube ich, dass vorher immer der Fenster-Puffer aus dem Grafikspeicher geladen wird, dann Software-Rasterisierung, dann wieder hochladen).
Überhaupt geht mir die alte API sowieso auf den Senkel, daher bin ich gerade am Evaluieren ob ich auf Direct2D umsteigen (da reizt mich halt der gute Font-Support) oder mir etwas mit OpenGL (da reizt mich der Font-Support nicht, aber das gibts immerhin auch auf anderen Plattformen) hinfrickele.
Worüber ich mir im speziellen Gedanken mache ist, wie man heutzutage solche Overlays angeht oder ob man wirklich brute-force immer alles neu zeichnet. Oder verwendet man Offscreenpuffer für Hintergrund und Overlay, und Blendet die beim Neuzeichnen übereinander? Das kommt mir wiederum wie große Speicherverschwendung vor, weil der dwm ja wiederum einen Offscreenpuffer für jedes Fenster bereithält.Also kurzum: Wie geht man die Sache mit den Overlays an?
Viele Grüße,
Deci
-
Egal aus welchem Jahrhundert du kommst. Die WinApi kommt auch aus dem letzten Jahrhundert.
Hintergrunddinge - auch aufwendige - lassen sich durchaus im Hintergrund betreiben. Wann sie sichtbar werden sollen - weil fertig -
entscheidest allein du mit WinApi-Funktionen, Messages und was es da noch so gibt.Ohne Senkel lässt man aber besser alles bleiben!
-
Ich verstehe dein Problem nicht.
-
Ja Du hast natürlich Recht, ich meinte das ganze etwas spezieller, als es vielleicht rüberkam.
Ich habe mal einen Screenshot aus der VC++2012-IDE gemacht, wo ich einen Pane-Splitter mit der der Maus rumfuchtele:
http://s14.postimage.org/4mhmedptt/moderne_kunst.png
Meine Frage ist: Wie wird diese vertikale Linie gezeichnet? Zeichnen die das, was davon verdeckt wird, auch immer wieder neu? Den Maus-Cursor müsst ihr euch da jetzt hindenken...
-
GDI, GDI+ und Direct2D sind auf neueren Systemen sehr langsam, gucke z.B. hier:
http://stackoverflow.com/questions/4055456/is-tdirect2dcanvas-slow-or-am-i-doing-something-wrong
In all my benchmark tests OpenGL (with and without MSAA antialiasing) is faster than GDI, GDI+ or Direct2D, for the particular case of drawing 2D elements like polygons, lines, rectangles, etc.
OpenGL und Direct3D sind von der Performance her sehr ähnlich, sind aber Lowlevel APIs, wo man sehr viel selber machen muß
bei OpenGL und Direct3D arbeitet man i.a. mit Doublebuffering, d.h. man zeichnet in einem Hintergrundbuffer, und wenn man fertig ist, macht man ein Swapbuffer. das bedeutet aber auch, daß man immer einen kompletten Buffer zeichnet, auch wenn man nur eine transparente Linie über ein stehendes Bild zieht
-
Das Problem ist halt bei OpenGL, dass ich mir wirklich alles irgendwie zutraue, damit zeichentechnisch umzusetzen (zumindest soweit ich das für meine Zwecke überhaupt benötige, aber firlefanz und schnickschnack sind ja eh out), aber vor Fonts habe ich meinen Respekt. Ganz besonders damit, das hinterher so aussehen zu lassen, wie das Betriebssystem es dann vorsieht, damit die Schrift nicht total anders aussieht.
-
... du kannst z.B. mit WinAPI DrawText in eine DIB zeichnen und das dann in eine OpenGL Textur kopieren ...
-
Decimad schrieb:
Ich habe mal einen Screenshot aus der VC++2012-IDE gemacht, wo ich einen Pane-Splitter mit der der Maus rumfuchtele:
http://s14.postimage.org/4mhmedptt/moderne_kunst.png
Meine Frage ist: Wie wird diese vertikale Linie gezeichnet? Zeichnen die das, was davon verdeckt wird, auch immer wieder neu? Den Maus-Cursor müsst ihr euch da jetzt hindenken...
Visual Studio basiert auf WPF, welches sich darum kümmert, dass bei derartigen Verdeckungen mit Transparenz möglichst nur notwendige Dinge und in der richtigen Reihenfolge neu gezeichnet werden. Aber ja, man zeichnet den Hintergrund in der Regel einfach neu, anstatt sich erstmal irgendwie hochkompliziert mit dem den Radiergummi auszutoben...
Decimad schrieb:
Das Problem ist halt bei OpenGL, dass ich mir wirklich alles irgendwie zutraue, damit zeichentechnisch umzusetzen (zumindest soweit ich das für meine Zwecke überhaupt benötige, aber firlefanz und schnickschnack sind ja eh out), aber vor Fonts habe ich meinen Respekt. Ganz besonders damit, das hinterher so aussehen zu lassen, wie das Betriebssystem es dann vorsieht, damit die Schrift nicht total anders aussieht.
Wenn Direct2D alles bietet, was du willst, dann verwend es doch einfach!?
Ansonsten erklär uns doch mal, was genau du eigentlich zeichnen willst, also was für eine Anwendung du hast.