2011-01-31 21 views
0

プロジェクトの中にゲームプレイレコーディング機能を実装すると、レベルの始めにプレーヤーの入力とRNGの種が記録されます。私はそのような記録を取って、それを正当性をテストするために私のコンピュータで再生することができました。異なるシステムでの浮動小数点数の精度

私は、異なるFlash Playerのバージョン、オペレーティングシステム、またはCPU(または影響を受ける可能性のあるもの)の間に表示される数値の相違にのみ関心があります。このプロジェクトは、Flash Player 10.0.0以上用に書かれています。私が関心を持っていること:

  • 数値の操作:乗算、除算;ビット操作(ビットシフトも可能です)。加減;モジュロ
  • 数学クラス:sin、cosおよびatan2;回転に
  • それぞれlocalToGlobal/globalToLocalを丸めて、私はhitTest、getObjectsUnderPoint、hitTestPoint、その上のgetBoundsと同じようなものを使用されることはありません

スケーリング、すべての衝突は、幾何学的になります。

上記の指摘されたものを使用すると、異なるシステムで異なる結果が生じる可能性はありますか?もしそうなら、私はそれらを避けるために何ができますか?

答えて

0

(可能ではありますが)さまざまなコンピュータでは動作が著しく異なることはほとんどありません。彼らが行ったとしても、非常にまれな出来事であり、ゲームプレイにとっては絶対に重要でない限り心配することをお勧めしません。

+0

ゲームプレイではなく、ユーザーが不正行為をしているかどうかをチェックするために、フロートの関連する非互換性が原因で、プレーヤーが最初にピットに落ちたかどうかを確認するのは難しいでしょう。最後の半分ピクセルから飛び越えて全体のリプレイを効果的に破り、私が検証することが不可能になる)。 – Maurycy

+0

私は、これらの出来事は効果がないとは思えないほど稀であると信じています。私はエンジンを作り、それについて心配することはなく、何度も試合をして、実際の試合とシミュレーションの両方で同じ位置(例えば0.01単位)で終了することをテストすることで試します。もしそうでなければ問題を切り分けることができますが、Number(倍精度、64ビット)の四捨五入の違いが出てきたら非常に驚くでしょう。 – StapleGun

+0

私も疑問に思っていますが、テストされたことのないところであなたの腸を信頼することは、重大な問題につながることがあることを学びました。私は主に三角関数に関わっています。 – Maurycy

1

面白い質問ですね...

それが質問を「シミュレートするときにユーザー入力の記録が正確に同じ出力を生成します」だ、「このゲームは、複数のプラットフォームで同じように再生されます」ではありません。

私の嫌なことは、フラッシュVMが違いを抽象化することを心配しないでください。しかし、私がもっと考えると、問題があるかもしれないいくつかの領域があります。

まず、私は時間ベースで何も記録しません。 1.21秒でキーを押すユーザーは、特に、記録または再生コンピュータの負荷がかかっている場合に、フレームの計算の前または後に発生するかどうかを予測するのは難しいかもしれません。おそらく失敗のためのレシピは、ユーザー入力によるトゥイーンの試行です。

浮動小数点の精度は問題ありません。いつラウンドするかを定義するアルゴリズムは、IEEE-754で十分に文書化されており、実行中のOSに関係なくすべてのVMは64ビットの数値を使用しています。私は、算術演算が同じように理解されていると推測しています。

hitTestなどを避けるのが良いと思います。理論的には、ハードウェアアクセラレーションが使用されているかどうかによって影響を受ける可能性があると私は考えています。しかし、私は専門家ではないので、そうではないかもしれません。

今、localToGlobal/globalToLocal ...私は分かりません。彼らは理論的なハードウェアアクセラレーションの問題を抱えているかもしれませんが、私はそれを疑う傾向があります。

私は本当の答えを出していないと思います。

+0

私はデルタを使用していないので、問題はないタイミングについて。私はちょうどいくつかのテストを準備し、データを取得するためにそれをどこかに投稿すると思います。とにかくありがとう :)。 – Maurycy

1

トリガー機能は動作しません! acos、asin、atan、atan2、cos、exp、log、pow、sin、およびsqrtのカスタム実装を作成する必要があります。そして明らかに、random()。

私はまだNumberクラスをテスト中です。私はadditon/subtraction/etcのどちらが確実かどうかは言えません。すべてのマシンで一貫しています。

+0

他の情報はありませんか?トリグはCPUによって計算されるので、信頼できないと思いますか?何年も前に、これらは通常CPUによって実行されていることを読んで、少なくともそれぞれがどのようにそれを処理するかは不明です。とにかく私はMarsenne Twisterのカスタム実装を使用するので、ランダムは問題ではありませんが、Numberの動作にはまだ興味があります。 – Maurycy

関連する問題