circle-loader
by
54/ 0

今回の主な話題:CSV配置ファイルの最適化策、単数回setactiveがコントローラーの初期化を導く、WWWでアセットをロードするとクラッシュする、Unityバージョンのアップグレード後にテクスチャ形式が変更され、すべての.metaが自動的に変更されます。


Monoメモリ

Q1: UWAのレポートによると、Mono GCの割り当ては30MBに達し、存続メモリは約20MBです。直接Splitすることもindexof+substringをすることも試しましたが、あまり改善されませんでした。CSV配置ファイルの最適化策ありませんか?

C#文字列は変更できないため、文字列操作によって多数の一時変数が生成することが多く、一般的な操作で回避しにくいです。問題主は、以下の二つの方法を考慮できます。

1)CSVを他のストレージ構造に変換します。例えば、protobufまたはMessagePackなど。

2)unsafeポインタを使用して文字列を操作します(少し面倒かもしれません)。

基本的な考え方は、文字列が[idx0,idx1]間のcharを手動的にint、float、boolまたはstringに変更します。Stringとboolは比較的簡単で、次にint、floatにはさらに考慮事項があります。unsafeポインタを使用して文字列を操作します(少し面倒かもしれません)。基本的な考え方は、文字列が[idx0,idx1]間のcharを手動的にint、float、boolまたはstringに変更します。Stringとboolは比較的簡単で、次にint、floatにはさらに考慮事項があります。C++の経験があれば、このようなコードを書くにはより簡単はずです。次のステップは配列です。最初に配列の長さを確定して、後で配列を構造することは一部のGCを減らすことをできます。最終的な問題はDictionaryです。


アニメーション

Q2: 動作コントローラーで特殊効果を表現する時に、表示中にコントローラーの初期化が発生するため、そのフレームの時間コストが大幅に大きくなります。さらに、毎回SetActiveすると、コントローラーを初期化し、毎回も初期化の時間コストがあります。何か良い解決策ありませんか?

GameObjectを非表示にするために、必ずしもSetActiveが必要なわけではありません。すべてのRendererコンポーネントのEnableをFalseに設定できます。

 

Animatorコンポーネントを含むGameObjectsのActiveな操作は、間違いなくAnimator.InitializeのCPUコストを引き起こします。


クラッシュ

Q3: Unity 4.xでWWWを使用してアセットをロードしますと、クラッシュします。表示された内容は以下になります。

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR)。

最後に確認した、コールされたインターフェイスは、

MemoryProfiler::RegisterRootAllocation(void*, BaseAllocator*, char const*, char const*)+124

どのように処理すれば良いですか?

Development BuildバージョンでクラッシュLogが発生したら、実際には処理しなくでも大丈夫です。なぜなら、このCrashはUnity 4.x以上のDevバージョンのみで出現し、Releaseバージョンではありません。問題主がReleaseバージョンでも同じ位置でクラッシュが発生したら、原因は他の問題はずで、このCrash Logと関係ありません。このBugはUnity 5.0以降修正されましたが、Unity 4.xでまた存在しています。


アセット管理

Q4: 私たちのプロジェクトがUnity5.6から2017.4.3にアップグレードされた後、アーティストのテクスチャファイルが全部変更されました。主にMetaは自動的に変更されました。変更は次のとおりです。これは、Unityバージョン自身の問題で、テクスチャの一部の情報が変更されましたか?

問題を解決しました。この原因は、私たちのプロジェクトに後処理スクリプトがあり、OnPostprocessTextureでアーティストのテクスチャのサイズを制限し、2048を超えるテクスチャを提出することを防ぎます。インポートされたテクスチャにインポート修正をしなければ大丈夫です。


Monoメモリ

Q5: ManagedHeap.ReservedUnUsedSizeのメモリ占用は2GBで、これはなぜですか?このパラメータは一般的にどの範囲に制御しますか?

これは、ゲームが特定の段階まで実行しましたから、大きなMonoメモリの割り当てが発生し、全体的なMonoメモリを高めました。後でここのMonoメモリがGCされましたが、全体的なMonoメモリはシステムに返りません。これが、ManagedHeap.ReservedUnusedSizeが非常に大きい理由です。これに対して、問題主にこのような状況があるかどうかを確認することをお勧めします。一般的には、ゲーム、スキルリストまたは地形ナビメッシュをロードする時に発生します。これらの方面から確認することをお勧めします。


UWA公式サイト:https://jp.uwa4d.com

UWA公式ブログ:https://blog.jp.uwa4d.com

UWA公式Q&Aコミュニティ(中国語注意)https://answer.uwa4d.com