1

Mac で Unity3D バージョン 3.x を使用して、ネットワーク接続されたコンピューター ゲームを作成しています。ゲームクライアントとゲームサーバーがあります。データがサーバーからクライアントに到着するたびに、クライアントは少しの間 (~0.5 秒) フリーズし、新しいデータをレンダリングしてから続行します。着信データがユーザーのゲーム クライアントとのやり取りに影響しないように、ゲームを最適化する方法はありますか?

これが私が今していることです:

  1. サーバーからデータをプルするための新しいスレッドを作成しました。
  2. データが到着したら、相互排他ロックで保護されたバッファーに入れます。
  3. Unity スレッドでは、すべてのフレームで、バッファーが空かどうかを確認します。空でない場合は、相互排他ロックでデータを処理する許可を待ちます。許可を得たら、データを解析してレンダリングします。

GameObjectUnity では、作成したネットワーク スレッドで新しい を作成できないため、これを行っています。しかし、ユーザー エクスペリエンスを最適化するために何かできることはないかと考えています。

4

1 に答える 1

1

凍結の原因を知るために、最初にプロファイリングするのが常に最善です。解析のため?ゲームオブジェクトのインスタンス化が原因ですか? 3つすべて?

Unity プロファイラー (Pro のみ)

一般的な解決策:

  • 一時停止がロックによるものである場合は、バッファリングを別のビンに分割してみてください。これにより、メイン スレッドは、ロックまたは少なくともそのような粗粒度のロックを取得することなく、次の空でないビンにアクセスできます。

  • 解析が遅くなる場合でも、バックグラウンド スレッドですべてを実行できます。最終的にゲームオブジェクトをインスタンス化する必要がある前に、できる限り多くのことを実行してください。

  • これがゲームオブジェクトのインスタンス化の最終ステップである場合は、新しいネットワーク データでオブジェクトを再構成するだけで、期待どおりのオブジェクトを事前にインスタンス化することができます。または、完全に再構築されるまで、インスタンス化プロセスを個別の増分フェーズに分割します。たとえば、最初にルート ノード、次に次のフェーズの子、というように、目立たない程度の一時停止があります。

于 2013-07-02T23:44:46.653 に答える