Baike.dev
Anmelden
> 返回资讯列表
news_article.exe
Mein Determinismus-Test bestand monatelang, während die beiden Builds verschiedene Spiele spielten

Mein Determinismus-Test bestand monatelang, während die beiden Builds verschiedene Spiele spielten

My determinism test passed for months while the two builds played different games

2026年8月1日13 次浏览来源:Dev.to 阅读原文

Ich habe die regeln-engine eines ausgelieferten android-spiels in den browser zusammengestellt. Gleiches Java, zwei Compiler. Dann habe ich geprüft, ob die beiden einverstanden waren. Sie taten es nicht - und der Test, den ich bereits für genau das hatte, war die ganze Zeit grün gewesen. Der gleiche Befehl zweimal: Grün gegen den aktuellen Motor, dann gegen die engagierte Aufzeichnung des defekten Builds. Spielen Sie es als Terminalsitzung ab, wenn Sie den Text auswählen möchten. Der Aufbau Die Regeln leben in einem Modul ohne Android auf seinem Klassenpfad, was es mir ermöglicht, sie ein zweites Mal mit TeaVM zu kompilieren und die gleiche Logik auf einer Canvas in einem Browser-Tab auszuführen. Ein Seed-Lauf sollte reproduzierbar sein. Geben Sie dem Engine Seed 42 und einer festen Sequenz von Eingaben, und Sie sollten jedes Mal das gleiche Spiel erhalten - das macht einen Lauf wiederspielbar und zwei Builds vergleichbar. Hier ist...

Ich habe die regeln-engine eines ausgelieferten android-spiels in den browser zusammengestellt. Gleiches Java, zwei Compiler. Dann habe ich geprüft, ob die beiden einverstanden waren. Sie taten es nicht - und der Test, den ich bereits für genau das hatte, war die ganze Zeit grün gewesen. Der gleiche Befehl zweimal: Grün gegen den aktuellen Motor, dann gegen die engagierte Aufzeichnung des defekten Builds. Spielen Sie es als Terminalsitzung ab, wenn Sie den Text auswählen möchten. Der Aufbau Die Regeln leben in einem Modul ohne Android auf seinem Klassenpfad, was es mir ermöglicht, sie ein zweites Mal mit TeaVM zu kompilieren und die gleiche Logik auf einer Canvas in einem Browser-Tab auszuführen. Ein Seed-Lauf sollte reproduzierbar sein. Geben Sie dem Engine Seed 42 und einer festen Sequenz von Eingaben, und Sie sollten jedes Mal das gleiche Spiel erhalten - das macht einen Lauf wiederspielbar und zwei Builds vergleichbar. Hier ist, was ich tatsächlich bekommen habe, gleiche Seed, gleiche Eingaben: JVM Browser erstes Hindernis x, Frame 60 405.426 304.426 noch am Leben bei Frame 360 ja kein Endergebnis 9 6 Kein Rundungsunterschied. Ein anderes Spiel. Die Ursache ist langweilig. Der Testfehler ist es nicht. verwendet. Sein Algorithmus ist bis auf die Konstanten spezifiziert - Sie können den genauen linearen Kongruentialgenerator im Javadoc lesen. Ein Seed sollte also genau eine Sequenz benennen. Aber mein Code hat diesen Algorithmus nicht ausgeführt. Es wurde ausgeführt, welche Implementierung die Laufzeit geliefert hat, und TeaVM ist nicht die JVM. Die Spezifikation beschreibt, was funktioniert; sie zwingt die Reimplementierung einer fremden Laufzeit nicht zur Übereinstimmung. Der Fix dauerte zehn Minuten: Schreiben Sie die LCG-Longhand, so dass beide Builds die gleiche Arithmetik ausführen, anstatt darauf zu vertrauen, dass sie es tun werden. Der interessante Teil ist der Test. Der Test, der es nicht hätte fangen können, hatte ich einen Test genannt. Es lief der Motor zweimal, mit dem gleichen Seed, und behauptete, die Ergebnisse übereinstimmen. Es gab jeden Commit weiter, einschließlich jedes Commits, bei dem der Browser ein anderes Spiel spielte. Es musste passieren. Es läuft der Motor zweimal in der gleichen Laufzeit. Ein so geformter Test kann keine Unstimmigkeit zwischen Laufzeiten beobachten

> 分享:
Baike.dev

baike.dev hilft dir, starke Sprachen, Frameworks, Datenbanken, DevOps- und Cloud-Native-Tools zu entdecken.

Schnellzugriff

Über uns

Mitmachen

Kennst du ein starkes Entwickler-Tool? Teile es.

Tool einreichen
© 2026 baike.dev Entwickler-EnzyklopädieTäglich aktualisiert · Entdecke starke Entwickler-Tools