パフォーマンスのヒント
このページでは、UdonSharpスクリプトのパフォーマンスを向上させるためのヒントをいくつか紹介します。
UdonSharpはC#よりも低速です
実行内容にもよりますが、Udonでコードを実行すると、通常のC#で同等の処理を行う場合に比べて約200倍から1000倍の時間がかかることがあります。
- 数千個の要素を反復処理するような、大規模で複雑なアルゴリズムは避けてください。
- 非常に長い配列を毎フレーム反復処理することは避けてください。
- 毎フレーム処理する配列の要素数を制限し、「タイムスライス(分散処理)」を行うことを検討してください。
- 可能な限り、Unity標準のコンポーネントやVRChat SDKのコンポーネントを使用してください。
- 例: Udonで40個のGameObjectを回転させる代わりに、アニメーションを使用してください。
- パフォーマンスを向上させるために、メソッドの結果をキャッシュしてください。
- 例: 毎フレーム
GameObject.transformやNetworking.LocalPlayerを取得するのではなく、Start()イベントを使用してそれらを変数に保存し、再利用してください。
- 例: 毎フレーム
private メソッドの使用
他のスクリプトから呼び出されないメソッドには private を指定してください。Udonが呼び出し対象のメソッドを検索する仕組み上、公開されているメソッド(public method)は少ないほど、カスタムイベントのパフォーマンスが向上します。
異なるBehaviour間での呼び出しは、ローカルなメソッド呼び出しよりも低速です。可能な限り、関連する処理は複数のUdonSharpBehaviourに分けるのではなく、1つのUdonSharpBehaviourにまとめるようにしてください。
CustomNetworkEvent を送信するには、対象のメソッドが public でなければならない点に注意してください。非公開メソッドの場合、イベントは発生しません。また、_MyLocalMethod のようにアンダースコアで始まるメソッドは、ネットワークイベントを受け取ることができません。
GetComponent<T> を頻繁に使用しない
GetComponent<T> は、Start() イベントや、頻繁に発生しないイベント内でのみ使用してください。
GetComponent<T>() は処理が遅く、特にUdonで UdonSharpBehaviour 型を取得する際には顕著です。これは、UdonSharp がすべての UdonBehaviour をチェックして正しい UdonSharpBehaviour 型であることを確認するループを挿入する必要があるためです。
最終更新: