UE4 では比較的あまり知られていない機能なのですが、物理サブステップを有効にすることができます。これを有効化すると、より正確で安定した物理シミュレーションを実現することができます。ラグドールのジッターやその他の複雑な物理アセットが、際立ってよく改善されるはずです。
サブステップは、プロジェクト固有の物理の設定で有効化できます。
この機能は現在も開発中です。APEX 破壊表現のサポートも完全ではありません。また、モバイルデバイスでのサポートもまだです。しかしながら、この機能によって外見と感覚が大幅に向上されるため、私たちはその完成に向けて鋭意努力しています。
どのような機能なのか?
UE4 は可変フレームレートを使用しています。可変フレームレートは、ハードウェアの拡張性に対応できる点が長所ですが、物理エンジンにとっては問題です。物理エンジンは短い固定した時間のステップで最もよく機能するからです。サブステップ機能は、トータルのフレーム時間をサブステップに分割します。そして、物理シミュレーションが、フレーム毎に複数回ティックします。サブステップの数は、サブステップのデルタタイムがどれくらい小さく設定されているかということによります。最大サブステップ時間が小さくなるほど、シミュレーションが安定します。ただし、CPU のコストは大きくなります。
実際にはどのように機能するか?
サブステップ機能は、ユーザーからは完全に隠蔽されています。したがって、物理エンジンへのコールが、補間または維持される必要があります。たとえば、ユーザーがアクタに 1 つのフレームの間に力を加え、そのフレームが内部的に N 回サブステップされるとします。その場合は、N 回連続するシミュレーションのステップの間に力を加えることによって、同じ加速を実現する必要があります。また、ユーザーがアクタのターゲット位置をセットしたとします。その場合は、複数のサブステップに渡ってそのターゲット位置を補間することによって、望ましい速度を維持しなければなりません。これらの細かな事柄はすべて、UE4 によって内部的にすでに処理されています。ただし、必要なブックキーピングに関連して CPU とメモリのコストがかかります。
もう一つ注意したい技術上の詳細があります。それは、サブステップ中におけるコリジョンのコールバックの動作です。UE4 では物理サブステップが別の物理スレッドで実行されることによって、ゲームスレッドが継続して稼働できるようにしています。最高のパフォーマンスを実現するために、最後のサブステップが実行されるまでコリジョンのコールバックを遅らせます。つまり、同一のコリジョンについて複数のコールバックを受け取る可能性があるのです。たとえば、A が B と衝突して跳ね返った場合、A と B がオーバーラップした時のコールバックと、A と B がオーバーラップしなくなった時のコールバックの 2 つを受け取る場合があります。内部的には、すべてのコールバックがキューにプッシュされます。そのため、サブステップ 1 からのコールバックが、サブステップ 2 からのコールバックより前に処理されることになります。
この機能を有効にすべきか?
その答は、あなたのゲームで何が必要かということによります。複雑な物理アセットを使用している場合は、サブステップ機能を有効化することによって、クオリティが著しく向上するはずです。一方、物理シミュレーションが他の機能に比べてそれほど重要ではない場合は、CPU 時間を他のところに当てるべきでしょう。いずれにしても、この機能によってゲームがどのような改善が見られるかぜひ試してみてください。
質問はありませんか?フォーラムでお待ちしております!