Schnelles Fillrect ?
-
Hi

Habe herrausgefunden das das Fillrect aus der GDI+ ziemlich lahm ist. Lass ichs
weg läuft mein Programm um einiges besser aber leider schmiert dann halt alles über
den Bildschirm wenn ich ihn ned vorher lösche. Deshalb meine Frage, gibts eine
andere Möglichkeit oder eine effizientere Fastfill Methode als Fillrect ?!
Hätte ja gern Hardware Beschleunigung aber ich glaub das ist eine ungeheure Arbeit
alles umzuschreiben (3000 Zeilen Code
), aber vielleicht kann man DirectDraw
oder so nur zum füllen eines Rechtecks nehmen ?!Freu mich auf eure Tips

-
1. GDI hat eigentlich hardwarebeschleunigung soweit ich weiß
2. du mußt ja nicht alles umschreiben, sondern nur die kapselung des apis... du hast doch schön sauber gekapselt, oder? *evilGrinz*naja, ansonsten würde ich dir empfehlen, falls es wirklich kritisch ist, entweder dir nen apiwrapper zu schreiben, den du dann mit anderen apis ausfüllen könntest (ich nutze da gerne oGL für
)oder du überzeichnest einfach immer den ganzen screen neu und müßtest so nicht den hintergrund löschen.
alternativ kannst du dir ja auch nur die bereiche merken in denen etwas verändert wurde und nur das neu zeichnen.
oder ich verschiebe dich ins WinApi forum wo man dir vielleicht optimierungstips geben kann?
btw. ja an sich ist es möglich WinApi und DirectDraw zu mischen, jedenfalls konnte ich mal programme sehen die das gemacht haben, aber das GDI zeug hat dann warnsinnig darauf geflimmert irgendwie.
rapso->greets();
-
Hi !
erstmal danke für deine Antwort, auch wenn ich nicht viel davon verstanden habe

GDI+ hat leider keine Hardware Beschleunigung. Soviel Arbeit will ich aber auch gar ned reinstecken, ist ja nur ein Puzzle, alles was ich bräuchte wär eine schnellere Fillrect() Funktion. Das mit dem Bildschirmflimmern ist normal, da verwende ich schon einen Double Buffer, damit sowas ned zustande kommt
Kannst mich ja verschieben wenn du magst, ich weiß das ich mit der Funktion Lockbits() zum Bleistift direkten Speicherzugriff auf mein Bitmap hab. Vielleicht
lässt sich da was optimieren. Ich probier mal ein wenig rum !Bin für weitere Tips dennoch sehr offen

Grüße
paddy
-
Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Du kannst noch die Funktionen PatBlt und ExtTextOut ausprobieren. Die sollen schneller sein als FillRect habe ich in Newsgroups gelesen.
-
Ansonsten könntest du auch mal testen einen 2. Backbuffer-DC zu erstellen (mit dem Hintergrund-Brush gefüllt), denn du dann einfach nur immer auf deinen bisher schon vorhandenen Backbuffer-DC blittest

-
Hab eure Vorschläge mal getestet. PatBlt bringt die Grafikausgabe zum flackern

Und der 2. Double Buffer ist leider auch nicht schneller.Ich habe in den MSDN jetzt noch folgendes gefunden :
Ich arbeite ja mit Bitmap Objekten aus der GDI+, und da gibt es einen
überladenen Konstruktor :Bitmap(IDirectDrawSurface7 surface);*
Creates a Bitmap object based on a DirectDraw surface. The Bitmap object maintains a reference to the DirectDraw surface until the Bitmap object is deleted or goes out of scope.
Kann man damit nicht was anstellen ?! In Zusammenhang mit DirectX7 & DirectDraw.
Aber da habe ich leider zu wenig Ahnung von
-
Wie oft pro Sekunde zeichnest du denn neu, dass BitBlt zu langsam ist

-
PatBlt ging schon, es war schneller als Fillrect. Ich zeichne das Bild bei jeder Maus Bewegung neu (sofern gerade ein Puzzle Teil verschoben wird).
Nehme ich jetzt FillRect() um den Backbuffer vor jedem Zeichnen zu löschen geht das zwar, ist allerdings nicht sehr schnell.
Führe ich PatBlt auf den Bildschirm aus flackert alles beim Teile bewegen.
Ich habe es auch schon mit Lockbits() probiert, damit habe ich direkten Speicherzugriff auf das Bitmap, aber das ist auch nicht schneller als Fillrect (komischerweise ?!).
-
Ich würde das so machen, dass du in einem DC alles vorzeichnest, was gerade nicht bewegt wird. Dann blittest du einfach während des Verschiebens / Bewegens eines Teils diesen DC (der alles bis auf dein zu bewegendes Teil enthält) auf deinen Backbuffer-DC und zeichnest noch das aktuell zu verschiebende Teil hinein
