AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Wäre DirectX/OpenGL hiefür sinnvoll ?
Thema durchsuchen
Ansicht
Themen-Optionen

Wäre DirectX/OpenGL hiefür sinnvoll ?

Ein Thema von henrik · begonnen am 7. Jan 2008 · letzter Beitrag vom 7. Jan 2008
Antwort Antwort
henrik

Registriert seit: 25. Nov 2003
36 Beiträge
 
Delphi 2007 Professional
 
#1

Wäre DirectX/OpenGL hiefür sinnvoll ?

  Alt 7. Jan 2008, 15:47
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 BitBlt 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 Canvas FillRect LineTo... erstellt) im Hintergrundbuffer an der neuen Position neu gemalt und anschließend dieser gezeigt.

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
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#2

Re: Wäre DirectX/OpenGL hiefür sinnvoll ?

  Alt 7. Jan 2008, 17:03
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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
henrik

Registriert seit: 25. Nov 2003
36 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Wäre DirectX/OpenGL hiefür sinnvoll ?

  Alt 7. Jan 2008, 19:27
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#4

Re: Wäre DirectX/OpenGL hiefür sinnvoll ?

  Alt 7. Jan 2008, 20:15
Zitat von henrik:
Wie kann ich eine Mausbewegung anders registrieren als ihre Position in regelmäßigen Zeitabstanden abzufragen
Wie wäre es TPaintBox.onMouseMove dafür zu benutzen (siehe Objektinspektor>Ereignisse)?

MfG,
Bug
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
henrik

Registriert seit: 25. Nov 2003
36 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Wäre DirectX/OpenGL hiefür sinnvoll ?

  Alt 7. Jan 2008, 20:55
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) ?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz