Autor Beitrag
schnig
Hält's aus hier
Beiträge: 12

winxp
d6
BeitragVerfasst: Sa 28.06.03 12:16 
Ich hab vor ein paar Tagen angefangen mit DelphiX zu programieren...

Mein erstes Projekt war ein kleines 2d Spiel in dem mein Held und paar "gegner" zu finden waren.. NUR: Wieso bewegen sich die nicht gleichmässig? ;) Naja die fps sind am schwanken und alles läuft durch die geschwindigkeits veränderungen mehr schlecht als recht :( Gibt es da irgendwas was man beachten soll? Wenn wer meinen aktuellen source haben möchte um mir zu helfen: einfach email hinterlassen X)

thx sNg :-)

Moderiert von user profile iconTino: Titel geändert.
mortus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Sa 28.06.03 13:48 
du koenntest die framerate begrenzen, indem du am ende des frames eine while-schleife laufen laesst und misst, wann die gewuenschte frame-dauer (1000/fps [in ms]) erreicht ist.
z.b. so:
ausblenden Delphi-Quelltext
1:
while (GetCurrentTime()-FrameStartTime < Framedauer) do;					

oder du machst die bewegung deiner objekte abhaengig von der framedauer, z.b. so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
var 
StartTime,EndTime,Frequency:TLargeInteger;
TimeThisFrame: Single;
...
begin
 //Initialisieren
 QueryPerformanceFrequency(Frequency);
 QueryPerformanceCounter(StartTime); 
 ...
 ...
 // in der Game-Loop

 // bei sehr sehr hoher fps-zahl
 repeat
   QueryPerformanceCounter(EndTime);
 until (EndTime <> StartTime);

 // oder einfach 
 // QueryPerformanceCounter(EndTime);
 
 // dauer des letzten frames
 TimeThisFrame:=(EndTime-StartTime)/Frequency;
 StartTime:=EndTime;

 // bewegung der objekte, SpeedX = zurueckzulegende strecke pro sekunde
 PositionX:=PositionX+SpeedX*TimeThisFrame; 
        
end;


Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Sa 28.06.03 20:37 
ja: DXTimer1.Interval:=0
poste doch mal code den du ins dxtimer ereignis geschrieben hast.

_________________
MFG
Michael Springwald, "kann kein englisch...."
Mr_T
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 73

Win XP, Fedora Core RC 1

BeitragVerfasst: Sa 28.06.03 20:42 
Also ich würde am ehesten Mortus 2. Vorschlag beachten, da das das einzig sichere ist....
Den ersten Vorschlag, die Framerate zu bremsen hilft auch nur, wenn zuviele Frames da sind... erreicht das ganze eine zu niedrige FPs, kann man das vergessen....
Die Sache mit dem DX-Timer würde ich auch nicht probieren... versucht man das, dann rendert der Rechner einfach so schnell wie gerade bei der Szene möglich... diese Speed ist logischerweise auf jedem Rechner anders und innerhalb einer Szene sogar Schwankend, so dass diese unbraucbar zur Problemlösung sein dürfte.....

_________________
Es gibt 10 Arten Binäre Zahlen zu interpretieren: 0 und 1
Wer nicht kämpft, hat schon verloren!
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 29.06.03 12:28 
das wäre mir neu: wenn du den interval auf 1000 ms läst wird nur jede sekunde das bild neu gemalen, und das führt dazu das es ruckelt und so....

_________________
MFG
Michael Springwald, "kann kein englisch...."
schnig Threadstarter
Hält's aus hier
Beiträge: 12

winxp
d6
BeitragVerfasst: So 29.06.03 16:08 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
     if not DXDraw1.CanDraw then Exit;
     punkte:= punkte+1;
     DXInput1.Update;
     DXDraw1.Flip;
     DXSpriteEngine1.Move(1);
     DXDraw1.Surface.Fill(0);
     DXSpriteEngine1.Draw;
    with DXDraw1.Surface.Canvas do
    begin
      Brush.Style := bsClear;
      Font.Color := clWhite;
      Font.Size := 12;
      Textout(0,0'ESC to quit');
      Textout(6800,'Punkte: '+inttostr(punkte));
      release;
   end;

So hatte ichs am anfang...

Moderiert von user profile iconTino: Code- durch Delphi-Tag ersetzt.
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 29.06.03 17:11 
auf was steht bei dir der DXTimer ?

_________________
MFG
Michael Springwald, "kann kein englisch...."
schnig Threadstarter
Hält's aus hier
Beiträge: 12

winxp
d6
BeitragVerfasst: So 29.06.03 17:50 
intervaltechnisch auf 10.. läuft am besten so wies aussieht
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 29.06.03 18:15 
setzt ihn doch mal auf 0 das wird er immer akualliesiert:)
aber man müsste irgwie den besten wert errechnen können....

_________________
MFG
Michael Springwald, "kann kein englisch...."
schnig Threadstarter
Hält's aus hier
Beiträge: 12

winxp
d6
BeitragVerfasst: So 29.06.03 18:33 
naja da isser scho schneller nur nicht gleichmässig...
Und das ist imho das wichtigste :(
Aber vielelicht schick ich dir einfach mal alles und du schaust mal? .. wenn du lust und zeit hast :p
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: So 29.06.03 18:39 
habe dir ne PM gesendet, ich will mir mal angewönen meine mail addresse hier nicht mehr einfach ins forum zu schreiben:) wegen der Spam gefahr :evil:

_________________
MFG
Michael Springwald, "kann kein englisch...."
mortus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: So 29.06.03 19:57 
ich kann dir nur zu der 2. methode aus meinem post raten. habe schon mehrere kleine spiele programmiert und damit nie groessere probleme gehabt. die implementation ist einfach und die performance leidet aufgrund der hinzukommenden multiplikationen auch nur leicht (kommt natuerlich immer auf das spiel an). die vorteile ueberwiegen imho stark.
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Mo 30.06.03 17:54 
es liegt an seinen grafikkarten treiber, bei mir läuft das programm problem los:)

_________________
MFG
Michael Springwald, "kann kein englisch...."
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Mo 30.06.03 18:01 
Hi,

also zu der sache mit dem TimerIntervall.. das wird dein Problem in keinster weise lösen.. ;)
Denn auch wenn du den Intervall auf 0 stellst kommt dein Rechner einfach nicht mit Rendern hinterher = es fängt an zu ruckeln.

Ich würde dir ebenfalls dazu raten die 2te Methode von Mortus zu benutzen (Also die Bewegung der Objekte abhängig von der FPS zu machen, dazu kannst du auch gern nochmal in mein tutorial hier im Forum oder bei mir auf der Seite (www.Koshigaya.de) schauen).

Au'revoir,
Aya~

PS: @Mimi.. du möchtest deine eMail Adresse nicht angeben??? Dann solltest du auch den eMail-Knopf unter deinem Post wegmachen... ;)

_________________
Aya
I aim for my endless dreams and I know they will come true!
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: Mo 30.06.03 18:45 
habe ich doch:)
du bis mod, dran liegt das...

_________________
MFG
Michael Springwald, "kann kein englisch...."
Aya
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1964
Erhaltene Danke: 15

MacOSX 10.6.7
Xcode / C++
BeitragVerfasst: Mo 30.06.03 19:24 
mimi hat folgendes geschrieben:
du bis mod, dran liegt das...

oh... *grinst verlegen*

_________________
Aya
I aim for my endless dreams and I know they will come true!