Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DoubleBuffered -> CPU überlastet!? (https://www.delphipraxis.net/17634-doublebuffered-cpu-ueberlastet.html)

maximi 7. Mär 2004 17:15


DoubleBuffered -> CPU überlastet!?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!
Ich mache zurzeit ein Wario-game, das ich unten angehängt hab! :lol:
Ich habe nämlich ein Problem mit meinem DubbleBuffered. Wenn ich in die Nähe vieler "Gegner" komme, ist meine CPU vollkommen überlastet.
Wenn ich aber DubbleBuffered ausschalte (was eigentlich nicht möchte) läuft alles reibungslos. Was kann ich tun??

Max

SirThornberry 7. Mär 2004 17:22

Re: DoubleBuffered -> CPU überlastet!?
 
wie ist das spiel derzeit realsiert? hast du mehrere TImages die du verschiebst oder zeichnest du direkt auf die Canvas des formulares? wenn du direkt auf die canvas zeichnest könntest du doublebuffered auf false setzen weil es dann nciht mehr benötigt wird

maximi 7. Mär 2004 17:27

Re: DoubleBuffered -> CPU überlastet!?
 
Nee, ich verschiebe mehrere TImages!

SirThornberry 7. Mär 2004 17:56

Re: DoubleBuffered -> CPU überlastet!?
 
anstelle des imageverschiebens mal lieber direkt auf die canvas vom formular. natürlich vorher den hintergrund sichern damit, wenn das object weiterrückt, der hintergrund wieder da ist

maximi 7. Mär 2004 18:14

Re: DoubleBuffered -> CPU überlastet!?
 
hä? das hab ich nicht so ganz verstanden. also was soll ich deiner meinung nach machen?

LoW_FloW 7. Mär 2004 18:20

Re: DoubleBuffered -> CPU überlastet!?
 
Zitat:

Zitat von maximi
Wenn ich aber DubbleBuffered ausschalte (was eigentlich nicht möchte) läuft alles reibungslos.

Mal eine Frage von einem n00b, was ist DoubleBuffered und wie benutzt man das? Ich habe nämlich auch schon ein paar Spiele progerammiert, bei denen ich TImages verschoben habe. Dabei habe ich nie davon gehört. Naja, ich bin auch ein napp :wink:

SirThornberry 7. Mär 2004 18:42

Re: DoubleBuffered -> CPU überlastet!?
 
@LoW_FloW: wenn du in der hilfe nach doublebufferd suchst wirst du ne erklärung finden die in etwa aussagt das wenn doublebuffered auf true gesetzt wird das flimmern reduziert wird aber gleichzeitig die cpu-last zunimmt weil halt das bild nicht direkt gemalt wird sondern im speicher gemalt wird und dan unterschiedlichen ebenen übereinander gelegt werden und das dann komplett auf die form gemalt wird...

Ich meinte das du anstelle der TImages das ganze direkt auf die Canvas vom formular malen sollst.
Also:
Delphi-Quellcode:
  draw(xpos,ypos, Spielfigurbild);
und bevor du das ausführst sollst du die fläsche wo die Figur drauf gemalt wird sichern weil du ja wenn die figur weiterrückt du den hintergrund neu malen musst (weil die figur ja dann nicht mehr an der stelle ist)

Mirilin 7. Mär 2004 18:45

Re: DoubleBuffered -> CPU überlastet!?
 
:hi:

Die Hilfe (F1...) fühlt sich hintergangen und meint
Hat DoubleBuffered den Wert False, wird das fensterorientierte Steuerelement direkt in das Fenster gezeichnet. Ist DoubleBuffered True, zeichnet sich das fensterorientierte Steuerelement in ein Speicher-Bitmap, das dann zum Zeichnen des Fensters verwendet wird. Durch die Doppelpufferung tritt weniger Flimmern beim Neuzeichnen des Steuerelements auf. Auf der anderen Seite wird jedoch mehr Speicher benötigt.


mfg Tobias

//Edit da war wer schneller.

maximi 8. Mär 2004 08:53

Re: DoubleBuffered -> CPU überlastet!?
 
Ich habe ja verschiedene Wandgrößen und somit auch verschiedene Bildergrößen und ich jedes Wand Image trotdem laden muss, damit ich dann in Delphi schreiben kann:

Delphi-Quellcode:
form1.canvas.draw(wand[0].left,wand[0].top,wand[0].picture.bitmap);
Kann man das vielleicht anders schreiben, oder gibt es noch ne bessere Lösung?

Max

Gandalfus 8. Mär 2004 12:41

Re: DoubleBuffered -> CPU überlastet!?
 
Zitat:

Zitat von maximi
Nee, ich verschiebe mehrere TImages!

:kotz:

Delphi-Quellcode:
var
  backpuffer: TBitmap:
  Einheiten: array [0..12]: TBitmap:
oncreate:
Delphi-Quellcode:
backpuffer := TBitmap.create;
  backpuffer.width := width;
  backpuffer.height := height;

  for i:=0 to heigh(Einheiten)
  begin
    Einheiten[i] := TBitmap.create;
  end;
  Einheiten[2].loadfromfile(XXXXXXXXXXXXXX);
  .....
timer mit kleinem INtervall:

Delphi-Quellcode:
//Zeichen Einheiten auf Backpuffer........

BitBlt(canvas.handle, 0, 0, backpuffer.Width, backpuffer.Height, backpuffer.Canvas.Handle, 0, 0, srccopy);//Backpuffer aufs Formular

maximi 8. Mär 2004 15:15

Re: DoubleBuffered -> CPU überlastet!?
 
das hab ich jetzt noch nicht ausprobiert. Deinen Vorschlag kann man doch vergleichen mit einem Backpuffer!? Beansprucht das nicht so die CPU? :?:

Gandalfus 8. Mär 2004 15:25

Re: DoubleBuffered -> CPU überlastet!?
 
Zitat:

Zitat von maximi
das hab ich jetzt noch nicht ausprobiert. Deinen Vorschlag kann man doch vergleichen mit einem Backpuffer!? Beansprucht das nicht so die CPU? :?:

Jo das Prinzip ist das gleiche nur es ist schneller.
z.B.: BitBlt ist schneller als canvas.draw

maximi 8. Mär 2004 15:57

Re: DoubleBuffered -> CPU überlastet!?
 
Wahrscheinlich labber ich jetzt irgendein mist, aber kann ich das jetzt immer noch mit den mehreren Images machen?! :roll:

Max

Gandalfus 8. Mär 2004 16:15

Re: DoubleBuffered -> CPU überlastet!?
 
Nein natürlich nicht.
TImage haben bei spielen nichts zu suchen.

TImages kannst du noch als einfachen speicher für Bilder benutzen.
z.B.:
Das bild für Einheit ein ist in Image1. Image1 ist aber auf visible false.
Jetzt zeichnest du das bild so:
Delphi-Quellcode:
backpuffer.canvas.draw(x,y,Image1.picture.bitmap);
nach dem alle zeichen operationen durchgeführt wurden zeichnest du das fertige Bild dann auf das formular:
Delphi-Quellcode:
BitBlt(canvas.handle, 0, 0, backpuffer.Width, backpuffer.Height, backpuffer.Canvas.Handle, 0, 0, srccopy);//Backpuffer aufs Formular

maximi 8. Mär 2004 16:22

Re: DoubleBuffered -> CPU überlastet!?
 
ok verstanden, werde ich glecih mal testen!! :coder:

Jörn 8. Mär 2004 16:38

Re: DoubleBuffered -> CPU überlastet!?
 
Naja du solltest lieber TBitmap's als Speicher für die Bilder verwenden weil du dann Speicher sparst.

MfG

maximi 8. Mär 2004 16:56

Re: DoubleBuffered -> CPU überlastet!?
 
noch eine letzte frage: wie kann ich denn das von Canvas gezeichnete Bild wieder löschen? :?

maximi 8. Mär 2004 18:20

Re: DoubleBuffered -> CPU überlastet!?
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, jetzt habe ich diesen Code:
Delphi-Quellcode:
procedure TForm1.zeichnen;
var i:integer;
begin

  backpuffer.Canvas.Rectangle(0,0,800,600);
  for i := 0 to max do
  begin
    if(wand[i] <> nil) then
    begin
      backpuffer.canvas.draw(wand[i].Left,wand[i].Top,Image_wand[i].picture.bitmap);
    end;
    if(wario[i] <> nil) then
    begin
      backpuffer.canvas.draw(wario[i].Left,wario[i].Top,Image_wario[i].picture.bitmap);
    end;
  end;

BitBlt(canvas.handle, 0, 0, backpuffer.Width, backpuffer.Height, backpuffer.Canvas.Handle, 0, 0, srccopy);//Backpuffer aufs Formular
end;
und dazu ein Screenshot, wenn ich mich nach rechts bewege! Die grauen Stellen auf dem Bild sind die Gegner!

Kann mir jemand helfen??
Danke! Max


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz