Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi Cross-Platform Game Loop (https://www.delphipraxis.net/189855-cross-platform-game-loop.html)

milos 31. Jul 2016 02:23

Cross-Platform Game Loop
 
Hi,

Meine kleine Spiele Engine hat momentan noch so einen loop mit Application.ProcessMessages:

Delphi-Quellcode:
begin
  while Running do
  begin
    Input;
    Update;
    Draw;
    Application.ProcessMessages;
  end;
end;
Mir ist bewusst dass das so nicht gut ist, jedoch habe ich es bisher so gemacht weil ich mich nur mit den form messages in windoof auskenne und nicht weiss wie ich sonst eine Schleife kriege ohne alle anderen Messages zu blockieren. Sollte man das lieber in einen weiteren Thread auslegen und dann von dort aus z.b. das Canvas neu zeichnen? Wie bekommt man das am besten hin ohne das es mal knallt? :stupid:

Freundliche Grüsse

Sir Rufo 31. Jul 2016 08:47

AW: Cross-Platform Game Loop
 
Gleiche Frage => Gleiche Antwort
http://www.delphipraxis.net/1243108-post2.html

Ok, der Link läuft ins Leere (auch wenn man über die Homepage dahin navigiert) - aktuell muss man sich das SmartMobileStudio installieren um an die Demos zu kommen. Eine Registrierung oder ein Trial Key ist für die reine Installation nicht erforderlich.

milos 31. Jul 2016 09:43

AW: Cross-Platform Game Loop
 
Naja die Frage ist nicht die selbe. Hier frage ich wie ich die vorhandene Game Loop verbessere die auch auf Vorschläge im von dir verlinkten Thread basiert. Ausserdem scheint der Link tot zu sein... Und zwar möchte ich das anders machen, sodass während des "Loops" auch alle Form Events feuern ohne das ich unsichere aufrufe wie Application.ProcessMessages machen muss und das auf Windows UND iOS/Android...

Freundliche Grüsse

mkinzler 31. Jul 2016 09:46

AW: Cross-Platform Game Loop
 
Ich habe den Link im anderen Thread an die Änderung der Homepage angepasst.

Sir Rufo 31. Jul 2016 09:48

AW: Cross-Platform Game Loop
 
Dann mach es doch so wie es da steht ... Für die Taktung nimmst du einen Timer und los geht es

milos 31. Jul 2016 11:10

AW: Cross-Platform Game Loop
 
Zitat:

Zitat von Sir Rufo (Beitrag 1343819)
Dann mach es doch so wie es da steht ... Für die Taktung nimmst du einen Timer und los geht es

Du willst mir doch nicht ernsthaft TTimer dafür vorschlagen? Soweit ich weiss ist der von Natur aus ungenau und das etwa zu 15ms. Mal mehr mal weniger und schon verabschiedet sich das flüssige Bild... Ich dachte eher an Window-Messages oder so ähnlich... Da ist mir gerade TApplication.OnIdle in den Sinn gekommen. Vielleicht geht es ja damit wie ich es mir vorstelle.

Freundliche Grüsse

Sir Rufo 31. Jul 2016 11:23

AW: Cross-Platform Game Loop
 
Schau dir das Konzept einmal genau an, dann siehst du dass diese "Ungenauigkeit" überhaupt nicht interessiert. Den Rest erledigt das "träge" Auge des Betrachters :stupid:

Und egal wie genau dein Timer ist es bleibt immer eine Zeitspanne x zwischen Signalisierung durch den Timer und der Darstellung. Dieses x ist abhängig von der allgemeinen Systemperformance, der aktuellen Systemauslastung, ...

Meinst du wirklich, das da ein 15ms Delta ins Gewicht fällt? Das ist im Übrigen eine Zeitspanne, die das menschliche Auge nicht wahrnehmen kann

BUG 31. Jul 2016 11:50

AW: Cross-Platform Game Loop
 
Zitat:

Zitat von Sir Rufo (Beitrag 1343828)
Meinst du wirklich, das da ein 15ms Delta ins Gewicht fällt?

Auf jeden Fall. 15ms entsprechen ungefähr 60fps, was nach heutigen Standard die Mindestanforderung an ein Spiel auf dem PC ist.

Zitat:

Zitat von Sir Rufo (Beitrag 1343828)
Das ist im Übrigen eine Zeitspanne, die das menschliche Auge nicht wahrnehmen kann

Das ist ein Gerücht. Das Auge ist schneller, nur das Gehirn ist lahm. Wer schon mal 60 vs. 120fps Vergleichmaterial gesehen hat, merkt dass doch mehr Information rüber kommen ... vor allem bei schnellen Bewegungen und Drehungen.

Zitat:

Zitat von milos (Beitrag 1343826)
Ich dachte eher an Window-Messages oder so ähnlich...

Soweit ich weiß ist TTimer ein Wrapper um die Timer-Messages.

Ich würde auch auf die Messages verzichten und eine hochauflösende Uhr in einer Schleife (bzw. in onIdle) verwenden. Wenn du dann merkst, das noch viel Zeit über ist, kannst du ja immer noch schlafen. Alternativ könnte man sich Waitable Timer Objects angucken, die sehen ziemlich gut aus. SDL2 scheint QueryPerformanceCounter zu benutzen.

Zitat:

Zitat von Sir Rufo (Beitrag 1343828)
Dieses x ist abhängig von der allgemeinen Systemperformance, der aktuellen Systemauslastung, ...

Wenn da im Hintergrund noch etwas anderes aufwendiges läuft, sollte man vielleicht kein Spiel starten.


Für konventionelle Anwendungen würde ich SirRufo zustimmen, aber Multimedia ist doch etwas anderes.

milos 31. Jul 2016 12:23

AW: Cross-Platform Game Loop
 
Danke Bug. Habe nun ein wenig mit OnIdle gespielt, das scheint mir ein Vernünftiger Weg zu sein. :thumb:

Danke für den Link der Waitable Timer Object, das sieht sehr interessant aus und könnte sich als Nützlich erweisen.

Und ja, den Unterschied zwischen 30 - 60 - 120 (- 144 [nicht mehr so stark von 120 zu unterscheiden aber doch ein wenig]) sieht man mit einem geübten Auge sofort und wenn man sich 144hz gewöhnt ist (so wie ich) tun 30 FPS schon fast weh in den Augen. 60 wäre ertragbar aber nicht mit zusätzlichen TTimer rucklern, ist nämlich fast genau so schlimm x)

Freundliche Grüsse

HolgerX 31. Jul 2016 12:41

AW: Cross-Platform Game Loop
 
Hmm..

Ich hab zwar keine Ahrnung von Spielprogrammierung, aber..

Delphi-Quellcode:
begin
  while Running do
  begin
    Input;
    Update;
    Draw;
    Application.ProcessMessages;
  end;
end;
Wenn die Funktionen hier zum Teil von SubThreads ausgeführt werden, kann sich der MainThread alleine um ProcessMessages und Draw kümmern..

Jeder Thread 'liest' den Input und 'berechnet' das Update eigenständig.
Da hier nur das 'lesen' z.B. per CriticalSection geschützt werden muss, ist auch kein Thread-Problem zu erwarten.

Der MainThread rüft dann zyklisch (z.B. alle x ms) das Draw der SubThreads auf und lässt dort das reine Zeichnen laufen, welche (interner Zugriff ebenfalls über CS geschützt) die vorab bereits berechneten Position des Objektes im Thread des MainThread zeichnet.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:28 Uhr.
Seite 1 von 2  1 2      

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