Einzelnen Beitrag anzeigen

Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#1

Suche Schnelle Alternative zu "CopyRect"

  Alt 18. Okt 2008, 15:43
Hi Leuts,

Ich hab da mal vor Langer Zeit nen Screensaver geschrieben. Dieser geht auch richtig rockig schnell und hat 0 % CPU Load auf all meinen Systemen.

Wie der das Erreicht ist ganz Einfach, ich lagere alle Aufgaben Dank OpenGL auf die Grake aus.

Auf meinem Desktop Rechner ist das OK, den die Gforce 8800 gts von mir läuft eh immer mit Voller Rate.

Doch nu hab ich ja auch ein Notebook, da hab ich ebenfalls 0 % CPU load, aber da die Grake Gforce 8400 M wohl zwischen 3D und 2D mode umschalten kann ändert sich die Temperatur doch deutlich.

Soviel zum Hintergrund.

Nu Dachte ich mir, der Screensaver macht eh nur 2D ( nutzt also OpenGL eigentlich gar nicht in seiner eigentlichen 3D Eigenschaft )

Schreibe ich den Source einfach um, auf Ohne OpenGL und hab dafür dann ein bischen mehr CPU Load.

Also habe ich nun ein TBitmap genommen das in das ich "Reinrendere" und das ich am Ende dann mittels Canvas.draw auf meine Form1 ausgebe.

Zum Eigentlichen Problem.

Mein Screensaver geht her und Kopiert nun aus 10 weiteren ( deutlich kleineren ) Tbitmaps Teile in 1:1 auf das Temp TBitmap

Das macht er aber viel zu langsam, in der OpenGL variante machte ich das mit GlCallLists und da gings rockig.

Mit meinem Bisherigen Ansatz kriege ich gerade mal 16 FPS hin, ich will aber schon 60 ( und die braucht der Effeckt auch )haben ...

Bisher hab ich es mit 2 varianten probiert, einmal mittels Copyrect und einmal mittels Scanline ( scanline brachte dabei gerade mal 7 FPS ).

Hat von euch noch jemand ne Idee wie ich das hier beschleunigen könnte.

Delphi-Quellcode:
Procedure CopyRect(Const Source, Dest: Tbitmap; SourceX, SourceY, DestX, DestY: Integer);
Type
  PBGR = ^TBGR;

  TBGR = Record
    B, G, R: Byte;
  End;
Var
  p1, p2: PBGR;
  i, j: Integer;
  w, h: Integer;
Begin
  w := Dest.Width - 1;
  h := dest.height - 1;
  For j := 0 To 11 Do Begin
    If h >= DestY + j Then Begin
      p1 := source.ScanLine[SourceY + j];
      inc(p1, sourceX);
      p2 := Dest.ScanLine[DestY + j];
      inc(p2, DestX);
      For i := 0 To 7 Do
        If w >= DestX + i Then Begin
          p2^.B := p1^.B;
          p2^.G := p1^.G;
          p2^.R := p1^.R;
          inc(p2);
          inc(p1);
        End;
    End;
  End;
End;

Procedure TASCII_Font.RenderChar(Const Canvas: TBitmap; x, y: Integer; Number: integer; Color: Integer);
Var
  vx, vy: Integer;
Begin
  // vx := (Number Mod 32) * Fcharwidth;
  vx := (Number Mod 32) Shl 3;// Fcharwidth = 8
  // vy := (number Div 32) * FCharHeight;
  vy := (number Shr 5) * FCharHeight;// FCharHeight = 12

  // Das hier gibt 7 FPS
  // copyrect(fonts[color], Canvas, vx, vy, x, y);

  // Das hier gibt 16 FPS
  canvas.canvas.CopyRect(
    rect(x, y, x + FCharwidth, y + FCharHeight),
    fonts[color].canvas,
    rect(vx, vy, vx + FCharwidth, vy + FCharHeight));
End;
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat