Autor Beitrag
VT
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Di 13.01.04 21:52 
Hi,

kennt sich hier jemand richtig gut mit DirectDraw aus? Dann bitte helft mir. Ok jetzt kommt der Hammerpost, bitte nicht erschrecken :P

Problem ist folgendes. Ich zeichne derzeit eine kleine Vorschau in ein Fenster. Nun ist aber die Ausgabe dermassen langsam das die CPU Last dabei schon auf 100% springt. Die GDI is einfach zu langsam. Gut dacht ich mir, versuch ichs mit DirectDraw.

Habe mir x Tutorials angeschaut, alle schreiben das selbe. Ich habe die Sachen auch genauso initialisiert wie es dort drin steht. Geht.

Nun das Problem. Sobald ich DirectDraw initialisiert habe, ist meine Anwendung dermaßen langsam, das ist unzumutbar. Ich meine damit speziell ein einfaches Verschieben des Fensters sieht jetzt so aus wie damals mit ner 256k VGA Grafikkarte unter HiColor. Was ist das?

Dann habe ich ein Surface als Frontbuffer initialisiert (PRIMARYSURFACE). Hier stoße ich mich schon das erste mal. Ist es denn nicht möglich dieses Surface auf eine kleine Fläche von sagen wir 100x100 Pixel zu begrenzen? Alle Tutorials initialisieren auf volle Bildschirmgröße und auch ich bekomm es nicht hin. Wenn es kleiner wäre würde doch einiges an Geschwindigkeit rausspringen.

Desweiteren habe ich ein Backbuffer initialisiert (OFFSCREENPLAIN) auf den ich zeichnen will und dann auf den Frontbuffer blitten will. Und hier wieder ein Problem. Da ich Speicher sparen will initialisiere ich doch den Backbuffer nicht auch wieder auf volle Bildschirmgröße sondern das was ich brauche (320x240). So nun kommt es zum Zeichnen. Ich mache folgendes:

(1) Backbuffer.Lock
(2) hohle mir den Pointer vom Backbuffer Surface (Pointer auf Longword bei 32bit Farbtiefe)
(3) Zeichne eine Linie von 0 bis 319 und erhöhe dabei den Pointer immer mit Inc (inc sollte den Pointer immer um 4 erhöhen da sizeof(longword) =32)
(4) Wiederhohle (3) das 239 mal immer mit abwechselnd schwarz und dann wieder weisse Linie

Nun ein Blit auf den Frontbuffer mit dem Frontbuffer-"Rahmen" (ich weiß nicht wie ich das sonst sagen soll) von 0,0,319,239 (die Koordinaten natuerlich auf das Fenster angepasst) und einem Backbuffer-"Rahmen" von dem selben Außmaß (hier aber nur 0,0,319,239)

Nun ist auch fast das zu sehen was ich wollte nur ist das ganze Verzogen so wie wenn man ein Bitmap einließt und bei der Breite immer ein Byte vergißt. Ihr wisst sicher was ich meine. Das ganze ist dann so schräg.

Irgendwie will mir das nicht in den Kopf warum er das so macht. Ich habe dann eine Lösung gefunden das er das richtig anzeigt indem ich den Backbuffer auf 382 Pixel Breite initialisiere, dann geht es auf einmal.

Hat das irgendwas mit irgendwelchen Seitenverhältnissen zu tun oder so? Ich sehe keine Zusammenhang z.w. 382 und meine Auflösung von 1024x768 32bit und den initialisierten andern Werten.

Kennt das Phänomen jemand? Ich sitz jetzt schon 2 Tage...ich werd mich gleich zu OpenGL umorientieren, das ist wenigstens 100% Fensterbezogen und nicht so ne Art Overlay wie DirectDraw.

So lonG
Daniel
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: Di 13.01.04 23:03 
VT hat folgendes geschrieben:
ich werd mich gleich zu OpenGL umorientieren,

wieso sollte ich dir dann als OpenGL anhänger eine Frage auf deine Antwort geben (ich weiß es so oder so nicht) :mrgreen:
VT Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25



BeitragVerfasst: Mi 14.01.04 01:26 
jo ich find opengl auch schöner obwohl es vom initialisierungsaufwand viel schlimmer ist, aber das kann man wenigstens 100% fenstergebunden benutzen.
Currywurst
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 50

Win XP Pro
D3 Pro, D5 Std, D6 Pers
BeitragVerfasst: Mi 14.01.04 07:00 
also ich habe mich letztens auch viel damit beschäftigt, dein prob hatte ich auch erstens, inzwischen aber gelöst... (was genau es war weiss ich aber nich mehr)

du könntest mir ja deinen source (der möglichst vcl und übersichtlich ist *g*) mal schicken, dann schau ich mal...

ausserdem hab ich eine kleine dll die viele funktionen bietet um mit directdraw superleicht zu arbeiten, linien zeichnen gehören aber noch nicht dazu :-), die dll und beispielprojekte zum nutzen könnte ich dir mal schicken, aber ohne source der dll
Da_Knuddelbaer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 485



BeitragVerfasst: Mi 14.01.04 09:09 
Die Breite von deinen 382 entspricht fast der Hälfte der Breite deiner Auflösung (768). Erhöhe den Wert auf 384 und es wird genauso gut gehen :wink: Vorschlag: Schau dir die DirectX 9 SDK von Microsoft an, es gibt auch irgendwo eine Version wo nur Delphi-Beispiele sind, weiss grad aber leider nicht wo. Naja, notfalls halt mit den C++-Beispielen arbeiten. :wink:
In der SDK gibt es auch DirectShow und DirectDraw-Beispiele, die würde ich mir dann einfach mal anschauen. Die werden nämlich alle im Fenstermodus gestartet und können meistens auch im Vollbild-Modus betrachtet werden.

Was jetzt natürlich nicht heissen soll dass du nicht auch auf OpenGL umsteigen könntest :lol:

Greetz,
Knuddelbaer