Toon posts:

[Delphi] Doublebuffered <==> snelheid

Pagina: 1
Acties:
  • 133 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb voor een windows control DoubleBuffered nodig, omdat anders het beeld staat te knipperen.

Maar nu zag ik dat als ik dat component vrij groot maak dat het dan enorm traag wordt.

Dit is gewoon echt te traag. Het draait dan op een Intel P3 700 met 128 MB RAM.

Weet iemand een andere oplossing die wel snel is?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Kan je niet zelf een simpele doublebuffering maken?
2 singlebuffers, changes eerst aan de eerste singlebuffer maken.
En dat allemaal kopieren (in een keer dus) naar de andere buffer en die optekenen.

Verwijderd

Topicstarter
Heb je daar een voorbeeld van?

(en DoubleBuffered zit standaard in Delphi. Je zou dan toch zeggen dat dat niet slecht zou zijn. Dus is het wel mogelijk om het sneller te krijgen met zo'n techniek?)

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 21-09 21:55

Gerco

Professional Newbie

Op zondag 09 september 2001 12:09 schreef tokkie het volgende:
(en DoubleBuffered zit standaard in Delphi. Je zou dan toch zeggen dat dat niet slecht zou zijn. Dus is het wel mogelijk om het sneller te krijgen met zo'n techniek?)
Sterker nog, met een double buffer wordt je programma vaak sneller ervaren dan met 1 buffer.

En zoals ACM al zei: Een double buffer is niets anders dan 2 buffers waarbij buffer B gebruikt wordt op te tekenen en wanneer een frame klaar is wordt 'ie in zijn geheel naar buffer A geBitBlt().

Van delphi weet ik het niet, maar in C zou je 2 Device Contexts maken 1 onscreen en 1 offscreen, je tekent in de offscreen DC en als je klaar bent, BitBlt je alles naar de on screen DC. Tenzij je DirectX gebruikt, dan moet je 2 DirectDraw Surfaces maken en met 1 of andere functie de backbuffer als screenbuffer opgeven en andersom.

Voorbeelden heb ik helaas niet liggen en zeker niet in Delphi.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Als je iets nouwkeuriger vertelt wat je doet, dan kunnen we je waarschijnlijk iets beter helpen.
teken je op een canvas, op een bitmap of op een DXsurface, is het een animatie, of iets statics?

Localhost, sweet localhost


Verwijderd

Topicstarter
Het zijn allemaal cellen (grid) en die tekent die op het canvas van een TWinControl.

Als de afmetingen van het control bijv beneden de 1000 en 600 zijn, is de snelheid gewoon goed.

Zodra het groter wordt, gaat het echt TE traag.

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Techniek die ik toe zou passen.
Maak een TBitmap
Teken op TBitmap.canvas
BitBlt(tcontrol.canvas.handle,cell.top,cel.left,bitmap.width,bitmap.height,bitmap.handle,0,0,0);
destroy je bitmap als je die niet meer nodig hebt.
klaar(!)

nog even wat info ove bitblt
code:
1
2
3
4
5
6
7
8
9
10
11
BOOL BitBlt(
  HDC hdcDest, // handle to destination DC
  int nXDest,  // x-coord of destination upper-left corner
  int nYDest,  // y-coord of destination upper-left corner
  int nWidth,  // width of destination rectangle
  int nHeight, // height of destination rectangle
  HDC hdcSrc,  // handle to source DC
  int nXSrc,   // x-coordinate of source upper-left corner
  int nYSrc,   // y-coordinate of source upper-left corner
  DWORD dwRop  // raster operation code
);

Localhost, sweet localhost


Verwijderd

Topicstarter
Doet DoubleBuffered niet precies hetzelfde?

Zo niet wat is dan precies het verschil?

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

geen flauw idee wat double buffered doet. Moet je even in de VCL source bladeren...
Maar zelfs al doet double buffered hetzelfde, je hebt het niet onder controle.
vergelijk maar eens...

eigen double buffer:
Jij tekent op offscreen
Onscreen update request: bitblt oude bitmap
Jij tekent (nog steeds) op offscreen
Jij bitblt offscreen naar onscreen

delphi double buffer:
Jij tekent op offscreen
Onscreen update request: bitblt nieuwe bitmap (nog niet af)
Jij tekent (nog steeds) op offscreen
Jij bitblt offscreen naar onscreen

Doordat je geen invloed hebt op wanneer je update plaats vindt gaat je scherm eerderknipperen, of onjuiste beelden weergeven...
Althans dat denk ik.

Localhost, sweet localhost


Verwijderd

Topicstarter
Ik heb nu een TBitmap gebruikt om er tijdelijk op te tekenen en vervolgens in 1 keer te kopiëren naar het zichtbare control. Alleen hij tekent nu niet alles meer. Kan het zijn dat sommige functies er niet op werken, bijv:

PolyPolyLine(FTempCanvas.Canvas.Handle, Points^, StrokeList^, Index shr 2);


FTempCanvas is een TBitmap

Verwijderd

Topicstarter
Niemand?

Ik krijg nu alleen maar tekst te zien en geen lijnen of gevulde vlakken.
Pagina: 1