今回はNGUIのFlashビルドでのメモリリーク報告について。
公式フォーラムの投稿より翻訳します:
http://www.tasharen.com/forum/index.php?topic=1471
August 24, 2012 at 05:16:46 AM
質問
ゲーム開発においてUnityの標準UIコンポーネントからNGUI2.1.4に切替をしている。残念ながらFlash開発に課題がある。内容はFlashで実行するときに発生して、アイドル状態でもメモリが膨れ上がり続けるものだ。
たとえばプレイヤーが何もせず、メインのゲームオブジェクト作成が行われていないにも関わらず。使用メモリは1GBを10分で超えてしまうんだ!同一条件(ゲームがアイドル状態)でNGUIを外すと(シーンから全ての
NGUIゲームオブジェクトを外す)メモリ使用は安定していてメモリリークは見られない。
短時間の調査(TheMinerプロファイラ)でNGUIがUINode.HasChanged()メソッドを頻繁に使用していてこれがUnityエンジンのコード内部でメモリをコピーしているようだ。テスト目的でこのボディ部分をコメントアウトしたところ
メモリ使用は抑えられたようだ。UINode.HasChanged()以外で同様にNGUIコンポーネントでUnityエンジンのメモリコピーにつながるものがある様子。
まだまだNGUIは愛してやまなくて、使用し続けたいのだけど、何か良いアドバイスないですか?
回答
FlashバグだからUnityに知らせてもらうしかないね。HasChanged関数ではいくつかのイコールチェックのほかないよ。
コードをつけるね:
#if UNITY_3_5
bool isActive = mGo.active && (widget == null || (widget.enabled && widget.color.a > 0.001f));
#else
bool isActive = mGo.activeSelf && (widget == null || (widget.enabled && widget.color.a > 0.001f));
#endif
if (lastActive != isActive || (isActive &&
(lastPos != trans.localPosition ||
lastRot != trans.localRotation ||
lastScale != trans.localScale)))
{
lastActive = isActive;
lastPos = trans.localPosition;
lastRot = trans.localRotation;
lastScale = trans.localScale;
return true;
}
-------
んー。Flashでメモリリークかー。Unity仕様といっているけどもうちょっとNGUI側でも調べてもらいたいものだけど仕方ないのかな。
バグフィックスされたらちゃんと知らせてね!NGUI!
0 件のコメント:
コメントを投稿