#1 14.01.2008 16:23:42

gekko
Member
Registriert: 02.05.2007
Beiträge: 15

Double Buffer mit GDI

hallo, möchte immer noch in meiner Vollbildanwendungen rum malen, ohne dabei d3d oder openGL zu hooken. Dabei habe ich was von double buffering gelesen, was ich mit der GDI anwenden kann um Flackerfrei zu zeichnen, kann mit das einer mal bissel genauer erklären?

Offline

 

#2 14.01.2008 17:40:54

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Double Buffer mit GDI

DoubleBuffering heißt einfach nur das du zwei Buffer hast:

  • einen Buffer zum drin zeichnen
  • einen Buffer der gerade dargestellt wird


Mit einem speziellen Befehl kannst du dann die Buffer "flipen", d.h. man vertauscht einfach die Pointer der beiden Buffer.

Ohne diesen zweiten Buffer würde jede Änderung möglicherweise sofort gerendert, was sich natürlich in komischen Effekten zeigt.


My software never has bugs. It just develops random features.

Offline

 

#3 14.01.2008 20:09:13

DragonFlyOfGold
ProMember
Ort: Berlin
Registriert: 09.11.2005
Beiträge: 139

Re: Double Buffer mit GDI

Aber dieses DoubleBuffering ist doch sehr sehr langsam oder? Überhaupt das Zeichnen in der GDI geht doch ehr gemächlich von statten.

Offline

 

#4 14.01.2008 21:39:16

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Double Buffer mit GDI

DirectX und OpenGL machen auch nix anderes als DoubleBuffering. Das ist nicht lahm, braucht nur halt Speicher.
GDI ist lahm, weil nicht die Grafikhardware direkt angesprochen wird sondern das ganze über Windows geht.


My software never has bugs. It just develops random features.

Offline

 

#5 15.01.2008 08:05:15

artzuk
GodlikeMember
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 1164

Re: Double Buffer mit GDI

Man merkt aber schon einen großen Unterschied in der Reaktionszeit, wenn man das DoubleBuffered anschaltet.


Mein kleiner .NET Blog: http://artzuk-interactive.de/

Offline

 

#6 15.01.2008 08:31:20

JorEl
ExtremeMember
Registriert: 29.01.2005
Beiträge: 894

Re: Double Buffer mit GDI

Zitat:

Man merkt aber schon einen großen Unterschied in der Reaktionszeit, wenn man das DoubleBuffered anschaltet.

Klar, weil in diesem Fall der gesamte Speicher kopiert werden muss. In der Hardwareimplementierung ist das natürlich nicht der Fall, da hat Coolcat also schon recht, dass das Verfahren prinzipiell sinnvoll ist. Allerdings ist DoubleBuffered soweit es die VCL betrifft nur sinnvoll um sichtbares flimmern zu vermeiden, für die performance ist es eine Katastrophe - was allerdings für die meisten apps keine Rolle spielt.

JorEl


Jesus hat gesagt - selig sind die, die da Leid erfahren, denn sie sollen getröstet werden... Ford Prefect hat gesagt - es ist unheimlich wichtig, dass wir miteinander reden und einen trinken.

Offline

 

#7 15.01.2008 20:49:44

efilnukefesin
Member
Ort: Bayreuth
Registriert: 12.04.2007
Beiträge: 50
Web-Seite

Re: Double Buffer mit GDI

kann es sein dass ich was verpeile aber mit "double buffering" meint ihr doch das Anlegen von einer temp-Bitmap, auf die man zeichnet und dann zeichnet mans einfach aufn Canvas während ja die andere ja noch angezeigt wird, oder? Wie hier quasi: http://www.hsg-kl.de/faecher/inf/materi … /index.php

Oder gibts hierfür auch noch spezielle Verfahren die hier noch etwas "Performance" (lol) rausquetschen? Weil ich was gelesen hab von nem speziellen Befehl, und

Code: delphi

canvas.draw(0, 0, bitmap);

ist jetz ja nicht soo speziell tongue

Beitrag geändert von efilnukefesin (15.01.2008 20:50:07)

Offline

 

#8 16.01.2008 07:19:43

Lotipats
UltraMember
Registriert: 17.05.2005
Beiträge: 395

Re: Double Buffer mit GDI

Delphi bietet für einige Componenten eine Eigenschaft DoubleBuffered an, was ein booleanwert ist.

Ich persönlich habe es ein paar mal so gemacht, dass ich 2 Bitmaps angelegt habe, in die habe ich gezeichnet und dann habe ich in einem Image die Bitmap geändert, also einfach von einer zur anderen gewechselt.

EDIT: Bei dem, was du hast, zeichnest du das ja noch drauf, weshalb es vermutlich (stark) flackern wird.

LOTIPATS

Beitrag geändert von Lotipats (16.01.2008 07:21:08)

Offline

 

#9 04.04.2008 13:01:53

gekko
Member
Registriert: 02.05.2007
Beiträge: 15

Re: Double Buffer mit GDI

ich habe mal weiterprobiert mit db.. aber in Spielen die OpenGL oder D3D benutzen flackert es trotzdem noch.
Und hooken möchte ich nicht.

Code: delphi

var
c,e:tcanvas;
memhdc,d:hdc ;
hmembmp,holdbmp  :hbitmap ;
x:integer;
begin


//DC  vom Desktop holen und was draus schreiben per canvas
d:=getdc(0);
c:=tcanvas.create ;
c.handle :=d;
c.font.color:=clred;
c.font.size:=12;
c.brush.style:=bsclear;
c.textout(10, 10, 'Test');


memhdc :=createcompatibledc(d);
hmembmp :=createcompatiblebitmap(d,1024,768)  ;
holdbmp :=selectobject(memhdc,hmembmp );

//in den 2. DC malen
memhdc :=getdc(0);
e:=tcanvas.create ;
e.handle :=memhdc ;
e.font.color:=clred;
e.font.size:=12;
e.brush.style:=bsclear;
e.textout(10, 10, 'Test
//den 1. DC mit 2. tauschen "Copieren"
BitBlt(d,0,0,1024,768,memhdc,0,0,SRCCOPY  );

//den speicher dc löschen
SelectObject(memhdc,hOldBmp );
DeleteObject(hMemBmp )  ;
DeleteDC(memhdc );
ReleaseDC(0,d);



koennte mir jemand sagen ob das nun geht Flackerfrei zu Zeichnen?

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson