BerickCookはアイデアを正しく表現しています。現在正しく機能している場合は、計算をそのままにしておきます。
以前に計算を行うことができ、ゲームの途中でそれらを必要としないと確信している場合は、前に計算してください。それ以外の場合は、ロード後に行います。ゲーム中の計算が目立たない場合は、そこで行うことができます。ある時点で複雑さが進化し、計算が重くなりすぎたら、最適化を開始します。
ただし、1つ重要なのは、ゲームの途中で実行するように計算が実装されている場合は、ロード中に常に強制的に実行することです。
多数のソリューションがあります。
- レベルの作成/ロード中にパスを計算/ロードする
- 2番目のスレッドを使用してパスを計算する
- アルゴリズムを最適化する
- スレッディングにアクセスできない場合は、割り込み可能なシステムを使用してください。
私はマスマーケットゲームで最後のオプションを見て使用しました。計算を再開するために必要なすべてのデータを適切に保存し、計算中の残り時間/操作を定期的に確認するだけです。
あなたのケースに応じて、割り込み可能なシステムは、計算が終了する前にイベントを使用できる予備的および部分的なソリューションを提供できます。
編集:@Keeperに応答する
「割り込み可能なアルゴリズム」は、私たちが持っていた制約のためにのみ有用でした。基本的には、マルチスレッド化の欠如を緩和しました。
ある時点で、AIが複数の辞書に基づいて大量の動きを計算しなければならないゲームがありました。この計算中にすべてのアニメーションが停止します。これは、より多くのデータでディクショナリが拡張され、データを保持するデータセットが変更され、ゲームがマルチプレイヤー(AIがプレイヤーの動きに対しても相互作用する必要があった)に適応したときに効率が低下したためです。ゲームループで使用できるスレッドは1つだけでした(マルチプラットフォームコードはサポートされているすべてのプラットフォームで実行する必要があることが必須です)。この時点で、計算アルゴリズムを中断して中断できるようにすることにしました。そのため、変数を保存できなかったため、配置されていた再帰システムをそのまま使用することはできません。関数は、必要なすべての変数と親オブジェクトと子オブジェクトへのポインターを単に保持するオブジェクトに置き換えられました。私はしません
- 現在の計算のステータスを保存する
- ループの終了時またはループ中(子オブジェクトが中断したとき)に割り込みます
- タイムアウトしたときに終了する
- 正しいインデックスでループを再開するか、現在子スタックの最上位にある子オブジェクトを呼び出すのを停止したところから再開します。
- 計算が中断された場合、すべてをクリーンアップします
- 最良の部分的な結果を与える。
最も高価な操作のみが個別のオブジェクトに分割され、計算を停止できる適切な場所を見つけるのにしばらく時間がかかりましたが、最終的には非常にうまく機能しました。
パフォーマンスは低下しましたが、アニメーションはすべてのプラットフォームでスムーズに実行されたため、ユーザーにとってパフォーマンスははるかに優れていました。すべてのプラットフォームで、アニメーションが途切れたりフリーズしたりすることなく、より大きな辞書を使用できました。また、これにより、後で必要になったときに複数のインスタンスを並行して実行できました。
もちろん、現在iPhoneとiPadではゲームにこれは必要ありません。2番目のスレッドを使用するのが理想的です。しかし、コードはまだそこにあると思います。