Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi GetTickCount (https://www.delphipraxis.net/65619-gettickcount.html)

ontorius 18. Mär 2006 22:22


GetTickCount
 
Ich habe folgendes geschrieben:

Delphi-Quellcode:
procedure TForm1.trash;
var start:longint;
    i:integer;
begin
  repeat
    start:=gettickcount;
    if start+50=gettickcount then image4.picture.LoadFromFile('.\pics\trash_open1.bmp');
    if start+100=gettickcount then image4.Picture.loadfromfile('.\pics\trash_open2.bmp');
    if start+150=gettickcount then image4.Picture.LoadFromFile('.\pics\trash_blum.bmp');
    if start+2150=gettickcount then image4.Picture.loadfromfile('.\pics\trash.bmp');
    inc(i);
  until i=10;
end;
An der Stelle wo das Programm die oben genannte Prozedur aufruft, bleibt es einfach stehen und man kann darin nichts mehr machen. Wie muss man mit "GettickCount" umgehen?

3_of_8 18. Mär 2006 22:23

Re: GetTickCount
 
Wie wäre es, wenn du statt dem = ein <= nimmst? So wie es jetzt ist, geht das nur, wenn der Computer es exakt in der richtigen Millisekunde schafft.

EDIT: Der Fehler liegt noch wo ganz anders. Du musst es so machen:

Delphi-Quellcode:
procedure TForm1.trash;
var start:longint;
    i:integer;
begin
  repeat
    start:=gettickcount;
    repeat Application.ProcessMessages until GetTickCount>=start+50;
    image4.picture.LoadFromFile('.\pics\trash_open1.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+100;
    image4.Picture.loadfromfile('.\pics\trash_open2.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+150;
    image4.Picture.LoadFromFile('.\pics\trash_blum.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+250;
    image4.Picture.loadfromfile('.\pics\trash.bmp');
    inc(i);
  until i=10;
end;

ontorius 18. Mär 2006 22:36

Re: GetTickCount
 
Zitat:

Zitat von 3_of_8
Wie wäre es, wenn du statt dem = ein <= nimmst? So wie es jetzt ist, geht das nur, wenn der Computer es exakt in der richtigen Millisekunde schafft.

EDIT: Der Fehler liegt noch wo ganz anders. Du musst es so machen:

Delphi-Quellcode:
procedure TForm1.trash;
var start:longint;
    i:integer;
begin
  repeat
    start:=gettickcount;
    repeat Application.ProcessMessages until GetTickCount>=start+50;
    image4.picture.LoadFromFile('.\pics\trash_open1.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+100;
    image4.Picture.loadfromfile('.\pics\trash_open2.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+150;
    image4.Picture.LoadFromFile('.\pics\trash_blum.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+250;
    image4.Picture.loadfromfile('.\pics\trash.bmp');
    inc(i);
  until i=10;
end;

Was ist "Application.ProcessMessages"? Ich will versuchen, möglichst ohne dass das Programm aussetzt, dass die Bilder nach einer bestimmten zeit angezeigt werden.

3_of_8 18. Mär 2006 22:40

Re: GetTickCount
 
Application.ProcessMessages ist in diesem Fall nur ein Füller und heißt so viel wie "nichts tun bis 50 ms um sind."

Da ruckelt absolut gar nix. So wie du das gemacht hast, geht er das durch:

start:=GetTickCount; //also ist start der Anfangswert
if start+50=GetTickCount... //Hier ist höchstens eine Millisekunde vergangen, also ist die Bedingung nicht erfüllt und so geht das auch bei den anderen Bedingungen.

Du musst praktisch WARTEN bis die 50 ms um sind, und das passiert bei meinem Code.

Basilikum 18. Mär 2006 22:40

Re: GetTickCount
 
Zitat:

Zitat von ontorius
Delphi-Quellcode:
procedure TForm1.trash;
var start:longint;
    i:integer;
begin
  repeat
    start:=gettickcount;
    if start+50=gettickcount then image4.picture.LoadFromFile('.\pics\trash_open1.bmp');
    if start+100=gettickcount then image4.Picture.loadfromfile('.\pics\trash_open2.bmp');
    if start+150=gettickcount then image4.Picture.LoadFromFile('.\pics\trash_blum.bmp');
    if start+2150=gettickcount then image4.Picture.loadfromfile('.\pics\trash.bmp');
    inc(i);
  until i=10;
end;
An der Stelle wo das Programm die oben genannte Prozedur aufruft, bleibt es einfach stehen und man kann darin nichts mehr machen. Wie muss man mit "GettickCount" umgehen?

das "Stehenbleiben" hängt vermutlich damit zusammen, dass du i nicht initialisierst.... wenn nun i vor repeat zufälligerweise genau 11 ist, so wird die Schlaufe ca. 4'000'000'000 durchlaufen... und das dauert seine Zeit...
füge mal ein i:=0 vor repeat ein....

Daniel G 18. Mär 2006 22:43

Re: GetTickCount
 
Zitat:

Zitat von ontorius
Was ist "Application.ProcessMessages"?

Mit dieser Anweisung verarbeitet eine Anwendung die Nachrichten, die an das Fenster geschickt werden. Auf gut deutsch:

Dat inner Schleife und die Anwendung friert für die Dauer der Schleife nicht ein.

//Edit: roter Kasten, ick vermiss dir.. :zwinker:

ontorius 18. Mär 2006 22:52

Re: GetTickCount
 
Zitat:

Zitat von Daniel G
Zitat:

Zitat von ontorius
Was ist "Application.ProcessMessages"?

Mit dieser Anweisung verarbeitet eine Anwendung die Nachrichten, die an das Fenster geschickt werden. Auf gut deutsch:

Dat inner Schleife und die Anwendung friert für die Dauer der Schleife nicht ein.

//Edit: roter Kasten, ick vermiss dir.. :zwinker:

Und ob. Ich habs vorher mit 4 timern ausprobiert, da hats nichts geruckelt. Aber jetzt mit dem "Application.ProcessMessages" kann man das Ruckeln nich mehr übersehn.

ontorius 18. Mär 2006 23:05

Re: GetTickCount
 
Zitat:

Zitat von 3_of_8
Application.ProcessMessages ist in diesem Fall nur ein Füller und heißt so viel wie "nichts tun bis 50 ms um sind."

Da ruckelt absolut gar nix. So wie du das gemacht hast, geht er das durch:

start:=GetTickCount; //also ist start der Anfangswert
if start+50=GetTickCount... //Hier ist höchstens eine Millisekunde vergangen, also ist die Bedingung nicht erfüllt und so geht das auch bei den anderen Bedingungen.

Du musst praktisch WARTEN bis die 50 ms um sind, und das passiert bei meinem Code.

Vielleicht sollte ich noch dazo sagen, dass ich nebenbei noch einen timer habe, der auch einige delays beinhaltet. Können diese in verbindung mit dem gettickcount zu übermäßigen ruckeln führen?

3_of_8 18. Mär 2006 23:05

Re: GetTickCount
 
Jetzt tu mir nen Gefallen und benutze diesen Code. Einfach ausprobieren, bevor du mögliche Fehler kritisierst. Nebenbei würde ich die Bilder eher in eine ImageList laden, die Dinger 16 mal in der Sekunde aus der Datei zu laden ist ineffizient.

EDIT: Was meinst du, wie ein Timer funktioniert? Das ist nichts anderes als GetTickCount schön in ne Klasse verpackt.

Delphi-Quellcode:
procedure TForm1.trash;
var start:longint;
    i:integer;
begin
  i:=0;
  repeat
    start:=gettickcount;
    repeat Application.ProcessMessages until GetTickCount>=start+50;
    image4.picture.LoadFromFile('.\pics\trash_open1.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+100;
    image4.Picture.loadfromfile('.\pics\trash_open2.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+150;
    image4.Picture.LoadFromFile('.\pics\trash_blum.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+250;
    image4.Picture.loadfromfile('.\pics\trash.bmp');
    inc(i);
  until i=10;
end;

ontorius 18. Mär 2006 23:18

Re: GetTickCount
 
Zitat:

Nebenbei würde ich die Bilder eher in eine ImageList laden
Kannst du mir das mit der ImageList erklären?
Den Code hab ich ausprobiert und es ruckelt, das hats bei den 4 timern für jedes bild nich getan.

3_of_8 18. Mär 2006 23:21

Re: GetTickCount
 
Pack ne TImageList auf die Form. Doppelklick drauf, Bilder hinzufügen.

Und dann nur noch mit der DrawMethode auf das Bild zeichnen, Codebeispiel dürfte in der OH stehen.

Daniel G 18. Mär 2006 23:22

Re: GetTickCount
 
Mal ne doofe Frage:

Wozu brauchst du das?

3_of_8 18. Mär 2006 23:30

Re: GetTickCount
 
Ich glaube, er will zu einem Löschvorgang eine Art Animation eines Mülleimers abspielen.

ontorius 18. Mär 2006 23:31

Re: GetTickCount
 
Zitat:

Wozu brauchst du das?
Ich programmier ein Jump'n'run game
---jaja, paintbox wäre besser, aber das is mir zu kompliziert---

3_of_8 18. Mär 2006 23:35

Re: GetTickCount
 
Das meinst du nicht ernst, oder?

Mit mehreren Imageboxen und dann auch noch in einzelnen Prozeduren und die Bilder aus Dateien laden?

Dass das ruckelt, glaube ich gerne.

Master_RC 19. Mär 2006 00:15

Re: GetTickCount
 
Zitat:

Zitat von ontorius
Zitat:

Wozu brauchst du das?
Ich programmier ein Jump'n'run game
---jaja, paintbox wäre besser, aber das is mir zu kompliziert---

Lol, für sowas reicht selbst eine Paintbox nicht mehr :)

Ich selbst bin auch so eilig gewesen und wollte ein Spiel proggen, aber aus Erfahrung sag ich dir:
DAT WIRD NICHTS ;)

Fang erst mit was Kleinerem an und erst, wenn du dir wirklich sicher bist, dass du dich gut auskennst (wie z. B. mit DelphiX oder dergleichen), dann mach das hier nochmal ;)

Alexander Roth 19. Mär 2006 06:37

Re: GetTickCount
 
Zitat:

Delphi-Quellcode:
procedure TForm1.trash;
var start:longint;
    i:integer;
begin
  repeat
    start:=gettickcount;
    repeat Application.ProcessMessages until GetTickCount>=start+50;
    image4.picture.LoadFromFile('.\pics\trash_open1.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+100;
    image4.Picture.loadfromfile('.\pics\trash_open2.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+150;
    image4.Picture.LoadFromFile('.\pics\trash_blum.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+250;
    image4.Picture.loadfromfile('.\pics\trash.bmp');
    inc(i);
  until i=10;
end;

Also, wozu die until i=10 ?
Dann macht er die selbe animation ja nicht 10 mal da die Zeit um ist.
Einfach so:
Delphi-Quellcode:
procedure TForm1.trash;
var start:longint;
begin
    start:=gettickcount;
    repeat Application.ProcessMessages until GetTickCount>=start+50;
    image4.picture.LoadFromFile('.\pics\trash_open1.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+100;
    image4.Picture.loadfromfile('.\pics\trash_open2.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+150;
    image4.Picture.LoadFromFile('.\pics\trash_blum.bmp');
    repeat Application.ProcessMessages until GetTickCount>=start+250;
    image4.Picture.loadfromfile('.\pics\trash.bmp');
end;
Für ein spiel ist Paintox nicht ganz so schlecht wie Image aber immer noch grotten schelcht.

nee..
da musst du direkt aufs Canvas Malen mit bitblt
Delphi-Quellcode:
BitBlt(form1.Canvas.Handle,x,y, bild.Width, bild.Height, bild.canvas.Handle,0 ,0,srccopy);
Das ist, so weit ich weis, die schnelltste Möglichkeit fürs 2d malen.

Dann musst du natürlicxh noch bei jedem ONPaint der Form neu Zeichen, damit nix flackert. :wink:

3_of_8 19. Mär 2006 09:08

Re: GetTickCount
 
Falsch. Am schnellsten gehts mit DirectX oder OpenGL. Allerdings schätze ich mich selbst jetzt mal etwas fortgeschrittener als den Ersteller dieses Threads ein, und OpenGL ist für mich noch "zu hoch".

ontorius 19. Mär 2006 10:21

Re: GetTickCount
 
So ich habs jetzt gelöst:

Delphi-Quellcode:
procedure TForm1.trash;
begin
  if gettickcount>=start+1000 then start:=gettickcount;
  if (start+50)<=gettickcount then image4.picture.LoadFromFile('.\pics\trash_open1.bmp');
  if (start+100)<=gettickcount then image4.Picture.loadfromfile('.\pics\trash_open2.bmp');
  if (start+150)<=gettickcount then image4.Picture.LoadFromFile('.\pics\trash_blum.bmp');
  if (start+1000)<=gettickcount then image4.Picture.loadfromfile('.\pics\trash.bmp');
end;
start wird dann in der Startprozedur deklariert. Also, es doch. Vielen Danke für eure Beiträge.

Airblader 19. Mär 2006 11:54

Re: GetTickCount
 
Trotzdem, nochmal:
  • Dein Spiel wird auf jedem Rechner anders schnell laufen
  • Die Performance ist die schlechteste, die du nur erzielen kannst
  • Es gibt absolut 0 Dynamik in dieser Methode (Stichwort OOP)
  • Du wirst ziemlich schnell tausende Zeilen Code haben, die sich mit wenigen lösen ließen
  • Ein paar dieser Sachen und du kommst selbst auf modernen Rechnern schnell wieder ins Stocken
  • Wenn du Delphi noch nicht so gut beherrschst, lern dir lieber kleinere Sachen an - ein Spiel ist einfach zu aufwendig und ich prophezeihe dir mit 100%iger Wahrscheinlichkeit, dass du ohne Kenntnisse und mit dieser Methode sicher kein halbwegs auch nur annähernd mittelwertiges Spiel hinbekommst ;)

=> Lass es sein und lerne Delphi erstmal grundlegend ;)

MfG, air

Alexander Roth 19. Mär 2006 13:23

Re: GetTickCount
 
Zitat:

Falsch. Am schnellsten gehts mit DirectX oder OpenGL. Allerdings schätze ich mich selbst jetzt mal etwas fortgeschrittener als den Ersteller dieses Threads ein, und OpenGL ist für mich noch "zu hoch".
Deshalb hab ichs nicht empfohlen.

zer00 20. Mär 2006 11:34

Re: GetTickCount
 
Wenn Du einen wirklich schnellen und genauen Timer willst, versuchst mit QueryPerformanceCounter.

grz zer00


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:35 Uhr.

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