B
hmm.... ich weiss nicht, ob (und wieviel) schneller das wie das DoubleBuffered aus der VCL ist, aber ich hab selber mal eine Art DoubleBufferung geschrieben. (ich les in diesem Thread grad zum 1. mal dass ein Canvas schon von vorn herein DoubleBuffer unterstuetzt )
Wie auch immer, vielleicht hilfts dir ja:
Wie jemand schon gesagt hat: beim DoubleBuffering werden 2 statt nur 1 Framebuffer gezeichnet... noch waehrend der erste Framebuffer auf den Schirm gezeichnet wird, wird der zweite berechnet... anschliessend werden die beiden Schirme getauscht (d.h. der 2. wird gezeichnet und der 1. vorbereitet)
Definieren der 2 Oberflaechen:
class TMainForm : public TForm
{
private: // Anwender-Deklarationen
// ....
Graphics::TBitmap* mDrawSurface[2];
int mActualSurface;
Erstellen der Oberflaechen
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner),
mActualSurface(0)
{
// erstelle die Oberflaeche
for (int i = 0; i < 2; ++i)
{
mDrawSurface[i] = new Graphics::TBitmap();
mDrawSurface[i]->Width = Surface->Width;
mDrawSurface[i]->Height = Surface->Height;
}
// ......
}
in der Hauptschleife des Programmes wird immer wieder auf die Bitmaps gezeichnet:
{
// mSim::draw() veraendert die aktuelle Oberflaeche
mSim.draw(mDrawSurface[mActualSurface]);
// kopiere die bearbeitete Oberflaeche auf das Canvas
Surface->Canvas->CopyRect(Surface->Canvas->ClipRect,
mDrawSurface[mActualSurface]->Canvas,
mDrawSurface[mActualSurface]->Canvas->ClipRect);
// switche Oberflaeche
mActualSurface = !mActualSurface;
}
Surface->Canvas->Refresh();
Ich bin ziemlicher VCL-Anfaenger (oder war's, mitterweile auf anderen Compiler gewechselt), und weiss nicht, wieviel Speed (wenn ueberhaupt) dir das bringt, aber 'n Versuch ists vielleicht wert....
EDIT: Code-Cleanup