今回は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 件のコメント:
コメントを投稿