(ユーモラスな精神的イメージ以外の何ものでもない場合は、「サルのパッチング」または「アヒルのパンチ」という用語について知りたいかもしれません。)
それはさておき、もしあなたの目標が「振る舞い」の変更のための反復時間を減らすことであるなら、そこにあなたを最大限に導くいくつかのアプローチを試してください。
(これは少し接線上に出ますが、私はそれが戻ると約束します!)
- dataから始めて小さく始めます:境界(「レベル」など)でリロードしてから、OS機能を使用してファイル変更通知を取得するか、定期的にポーリングします。
- (ボーナスポイントとより短いロード時間(繰り返し時間の減少)については、データベイキングを調べてください。)
- スクリプトはデータであり、動作を繰り返すことができます。スクリプト言語を使用する場合、通知またはコンパイルされたスクリプトをリロードする機能があります。インタープリターをゲーム内のコンソール、ネットワークソケットなどにフックして、実行時の柔軟性を高めることもできます。
- コードもデータである可能性があります。コンパイラは、オーバーレイ、共有ライブラリ、DLLなどをサポートします。そのため、手動または自動に関係なく、オーバーレイまたはDLLをアンロードおよび再ロードする「安全な」時間を選択できるようになりました。他の回答については、ここで詳しく説明します。これのいくつかの変形は、暗号署名の検証、NX(no-execute)ビット、または同様のセキュリティメカニズムを台無しにする可能性があることに注意してください。
- 深い、バージョン管理された保存/読み込みシステムを検討してください。コードが変更された場合でも、状態を堅牢に保存および復元できる場合は、ゲームをシャットダウンして、まったく同じ時点で新しいロジックでゲームを再起動できます。言うよりも簡単ですが、それは実行可能です。また、命令を変更するためにメモリを突くよりも著しく簡単でポータブルです。
- ゲームの構造と決定性によっては、記録と再生ができる場合があります。その記録が「ゲームコマンド」のすぐ上にある場合(カードゲームなど)、必要なレンダリングコードをすべて変更し、記録を再生して変更を確認できます。一部のゲームでは、これはいくつかの開始パラメーター(ランダムシードなど)を記録してからユーザーアクションを記録するのと同じくらい「簡単」です。一部の人にとってははるかに複雑です。
- コンパイル時間を短縮する努力をしてください。前述の保存/ロードまたは記録/再生システムと組み合わせて、またはオーバーレイやDLLと組み合わせても、これは他のどの製品よりもターンアラウンドを減少させる可能性があります。
これらのポイントの多くは、データまたはコードをリロードする方法がすべてわからなくても有益です。
逸話のサポート:
大規模なPC RTS(〜120人のチーム、ほとんどがC ++)には、少なくとも3つの目的で使用される非常に深い状態保存システムがありました。
- 「浅い」保存がディスクではなくCRCエンジンに送られ、マルチプレイヤーゲームが10〜30フレームごとに1 CRCのロックステップシミュレーションを確実に維持できるようにしました。これにより、誰も不正行為を行わず、数フレーム後に非同期バグをキャッチしました。
- マルチプレーヤーの同期解除バグが発生した場合、フレームごとに余分な深さの保存が実行され、CRCエンジンに再び供給されましたが、今回はCRCエンジンがバイトの小さいバッチごとに多くのCRCを生成します。このようにして、最後のフレーム内で状態のどの部分が発散し始めたかを正確に知ることができます。これを使用して、AMDプロセッサとIntelプロセッサの間に「デフォルトの浮動小数点モード」という厄介な違いを見つけました。
- 通常の深度保存では、ユニットが再生していたアニメーションの正確なフレームは保存されないかもしれませんが、すべてのユニットの位置、ヘルスなどが取得され、ゲームプレイ中いつでも保存および再開できます。
それ以来、DSのC ++およびLuaカードゲームで確定的な記録/再生を使用しました。AI用に設計したAPI(C ++側)にフックし、ユーザーとAIのすべてのアクションを記録しました。ゲームでこの機能を使用して(プレーヤーにリプレイを提供するため)、問題を診断するために:クラッシュまたは奇妙な動作があった場合、保存ファイルを取得してデバッグビルドで再生するだけでした。
それ以来、オーバーレイを数回以上使用し、「このディレクトリを自動的にスパイダーし、新しいコンテンツをハンドヘルドにアップロードする」システムと組み合わせました。私たちがしなければならないのは、カットシーン/レベル/何でも残して戻ってくることです。新しいデータ(スプライト、レベルレイアウトなど)だけでなく、オーバーレイの新しいコードもロードされます。残念なことに、最近のハンドヘルドでは、コードを特別に扱うコピー防止機能とハッキング防止メカニズムにより、それはさらに難しくなっています。それでも、luaスクリプトに対してはそれを行っています。
最後になりましたが、命令オペコードに直接パッチを当てることで、少しアヒルのパンチを行うことができます(非常に小さな特定の状況では可能です)。ただし、これは、固定プラットフォームとコンパイラーを使用している場合に最適です。また、ほとんど維持できず、非常にバグが発生しやすく、すぐに達成できることも限られているため、ほとんどの場合、デバッグ中にコードを再ルーティングするためにのみ使用します。それはないけれども、あなたに急いで自分の命令セット・アーキテクチャについて多くの地獄を教えます。