![]() |
Cross-Platform Game Loop
Hi,
Meine kleine Spiele Engine hat momentan noch so einen loop mit Application.ProcessMessages:
Delphi-Quellcode:
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:
begin
while Running do begin Input; Update; Draw; Application.ProcessMessages; end; end; Freundliche Grüsse |
AW: Cross-Platform Game Loop
Gleiche Frage => Gleiche Antwort
![]() 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. |
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 |
AW: Cross-Platform Game Loop
Ich habe den Link im anderen Thread an die Änderung der Homepage angepasst.
|
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
|
AW: Cross-Platform Game Loop
Zitat:
Freundliche Grüsse |
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 |
AW: Cross-Platform Game Loop
Zitat:
Zitat:
Zitat:
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 ![]() ![]() ![]() Zitat:
Für konventionelle Anwendungen würde ich SirRufo zustimmen, aber Multimedia ist doch etwas anderes. |
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 |
AW: Cross-Platform Game Loop
Hmm..
Ich hab zwar keine Ahrnung von Spielprogrammierung, aber..
Delphi-Quellcode:
Wenn die Funktionen hier zum Teil von SubThreads ausgeführt werden, kann sich der MainThread alleine um ProcessMessages und Draw kümmern..
begin
while Running do begin Input; Update; Draw; Application.ProcessMessages; end; end; 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 02:57 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