![]() |
Wäre DirectX/OpenGL hiefür sinnvoll ?
Hallo,
bei meiner Anwendung unter Win XP werfe ich in manchen Situationen ca. alle 50 ms ein 700 * 600 großes - im Hintergrund dynamisch erstelles - Bitmap mittles
Delphi-Quellcode:
auf eine Paintbox : Mit der Maus kann man auf dieser Fläche "Objekte verschieben", d.h. in einer OnTimer Methode wird die Mausposition ca. alle 50 ms abgefragt, dann das darunterliegende Objekt (teilweise schon fertige kleine Bilder, teils einfache geometrische 2D-Figuren mittels
BitBlt
Delphi-Quellcode:
erstellt) im Hintergrundbuffer an der neuen Position neu gemalt und anschließend dieser gezeigt.
Canvas FillRect LineTo...
Das ganze funktioniert prinzipiell gut bei realtiv geringer CPU Auslastung. Die Berechnung des 700*600 Bildes dauert ca. 15 ms, d.h. eine RefreshRate von ca. 20 ms müsste theoretisch drin sein. Doch hier ist das problem : selbst wenn ich das Timer Interval von 50 auf 20-30 ms setze, spürt man keine Verbesserung (verwende den MMTimer welcher eine Genbauigkeit von ca. 1 ms hat) : Die bewegten Objekte hängen dem Mauszeiger immer deutlich hinterher. Liegt da eine prinzipielle Einschränkung bei dieser Art von Grafikprogrammierung (Canvas) vor, d.h. die nicht direkt auf die Grafikkarte zugreift ? Wäre DirectX/OpenGL hiefür sinnvoll (es werden keine 3D Sachen und sonstige Effekte benötigt) ? Es geht ja eigentlich "nur" das schnelle Darstellen eines größeren Bitmaps auf einer Fläche (Paintbox). Die Operationen zur Berechnung des Bildes im Hintergrund (Bitmap Manipulationen) lassen sich wohl nicht beschleunigen (verwende auch kein langsames Canvas.Pixels[x,y]) ? Gruss Henrik |
Re: Wäre DirectX/OpenGL hiefür sinnvoll ?
Warum zeichnest du denn das Bild in einem Timer? Allein die Tatsache, dass die Objekte der Maus hinterherhängen, könnte dir schon den Tipp geben, dass du das Bild vielleicht einfach bei jeder Mausbewegung oder Änderung neu zeichnen könntest - eventuell dabei nur den Ausschnitt, der sich tatsächlich geändert hat.
BitBlt ist schon sehr schnell, eine Verbesserung über Scanline würde ich eher nicht erwarten. Ein intelligenteres Zeichnen (wie gesagt, nur die Dinge, die sich tatsächlich geändert haben - bei vielen Objekten vielleicht auch einfach alles, was hinter dem Objekt liegt und alles was davor liegt in jeweils eine Bitmap, dann musst du nicht alles neu zusammensetzen sondern immer nur Hintergrund, Objekt und Vordergrund zeichnen) könnte jedoch eine erhebliche Beschleunigung bewirken. Davon abgesehen, je nachdem, wie du dein Bild zusammensetzt, insbesondere wenn es sich um eine hohe Anzahl von Bitmaps, eventuell auch noch mit Transparenz, handelt, kannst du das mit Direct3D oder OpenGL natürlich drastisch beschleunigen. Die hier im Forum herumwuselnde 2D-Engine Andorra2D dürfte auf jeden Fall einen Blick wert sein. |
Re: Wäre DirectX/OpenGL hiefür sinnvoll ?
Nur den Hintergrund, Objekt und Vordergrund zu zeichnen war schon ein wertvoller Tip...Danke.
Deinen ersten Gedanken kann ich aber nicht ganz nachvollziehen : Wie kann ich eine Mausbewegung anders registrieren als ihre Position in regelmäßigen Zeitabstanden abzufragen (=Timer) um DANN das Zeichnen zummindest für das zu bewegende Objekt zu veranlassen ? Da JETZT die Maus da und da ist muss das Objekt auch JETZT gezeichnet werden, oder (steh ich auf dem Schlauch;-) ? |
Re: Wäre DirectX/OpenGL hiefür sinnvoll ?
Zitat:
MfG, Bug |
Re: Wäre DirectX/OpenGL hiefür sinnvoll ?
OnMouseMove könnte ich auch benutzen, doch warum sollte das das Problem mit den "hinterherhinkenden" Objekten lösen ? Ist das nicht das gleiche Prinzip wie mit einem Timer alle X Millisekunden die Mausposition abzufragen (wobei der Timer nur beim Drücken der Maustaste (=>OnMouseDown) gestartet wird und dann je nach angeklicktem Objekt der entsprechende Timer gestartet wird) ?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz