2012年8月30日木曜日

NGUI Flashビルドのメモリリーク


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

コメントを投稿

ブックマークに追加

このエントリーをはてなブックマークに追加

自己紹介

自分の写真
Unity3D公式マニュアル翻訳やってる人がスマホ(iPhone, Android)のゲーム開発しています。気軽に面白く初心者が遊べる内容がモットー。Blogでは開発情報をひたすら、Twitterではゲーム作成の過程で参考にしている情報を中心につぶやきます

ページビューの合計

過去7日間の人気投稿

ブログ アーカイブ