最適化のヒント
制限とキャッシュコールバックターゲット
便宜上、PUNコールバックは任意のMonoBehaviourおよび任意のGameObjectで実装することができます。
これらのコールバックの頻度は低いため、通常は問題にはなりません(カスタムプロパティの更新を除く)。
内部的にはUnityのSendMessage
はコールバックをディスパッチに使用され、それがパフォーマンスに影響する可能性があります。
さらに大きな問題としては、コンポーネントを見つけるためにFindObjectsOfType()
が必要であるということです(これはコールバックを実装、または実装しない可能性があります)。
PhotonNetwork.SendMonoMessageTargets
を使用すると、どのGameObjectが呼び出されるかを定義できます。
PhotonNetwork.CacheSendMonoMessageTargets(Type t)
では、どのタイプのコンポーネントをターゲットにするかを定義することでSendMonoMessageTargetsを設定できます。
必要に応じてSendMonoMessageTargetsを更新することができます。
デフォルトの強引なアプローチよりも高速に処理がおこなえます。
OnPhotonSerializeViewとIPunObservable
デフォルトでは、PhotonViewはリフレクションとキャッシングを使用して、コンポーネント上のOnPhotonSerializeView
実装を見つけて呼び出します。
MonoBehavioursで IPunObservable
インタフェースを実装することで、OnPhotonSerializeView
の呼び出しを最適化できます。
RPCターゲットをキャッシュ
場合によっては、ゲームで多くのRPCを使用することがあります。
ターゲットGameObject上のどのコンポーネントもRPCを実装できるため、PUNはリフレクションを使用して適切なメソッドを見つけます。
もちろんコンポーネントが変更されない場合には、これは負荷がかかり無駄なことになります。
デフォルトでは、PUNはスクリプトのタイプごとにMethodInfoリストをキャッシュします。
PUNは、GameObject上で潜在的なターゲットであるMonoBehavioursはキャッシュしません。
PhotonNetwork.UseRpcMonoBehaviourCache = true
を設定して、RPC用のPhotonViewごとのMonoBehavioursをキャッシュすることができます。
これにより、呼び出すコンポーネントの検索が高速化されます。
GameObjectのスクリプトが変更された場合は、必要に応じてphotonView.RefreshRpcMonoBehaviourCache()
を呼び出して必要に応じて更新してください。
RaiseEventのローカルログを回避
RaiseEventを呼び出す場合、データは即時でソケットには書き込まれません。その代わりに、SendOutgoingCommands()
が呼び出されるまでデータは待ち行列に入れられます。
ローカルラグを回避するには、RaiseEventをトリガーにしてLateUpdate()
でSendOutgoingCommands()
を呼び出します。
これは、必要に応じて実行すれば十分です。