★お知らせ(2023/12/27)
いつもLive2D公式コミュニティをご利用いただき誠にありがとうございます。
本コミュニティは2023年12月27日 11:00をもって閉鎖いたしました。
今後の運営はすべて新Live2D公式クリエイターズフォーラムに移行します。
閉鎖に伴い、以下機能は利用不可となります。
・アカウントの新規作成
・トピック投稿、返信
たくさんのご利用誠にありがとうございました。

新Live2D公式クリエイターズフォーラムは以下バナーよりご利用いただけます。
Live2D公式クリエイターズフォーラム

なお、本コミュニティに投稿されたトピックはすべて残りますが、今後削除する可能性がございますので予めご了承ください。
閉鎖に関するお問い合わせにつきましてはLive2D公式クリエイターズフォーラムへご連絡ください。

動的にテクスチャ登録の切り替えについて質問

ご存知の方、いらっしゃいましたらご教示お願い致します。

Live2DModelD3D::setTexture関数を使用して毎フレーム、
テクスチャ登録の切り替えを行ったのですが、プログラム終了時にメモリリークが発生しました。
作成したテクスチャのメモリの解放は行っています。
Live2DModelD3D::setTexture関数は毎フレーム呼び出す仕様ではないということでしょうか。
また、動的にテクスチャ登録を切り替える正しい方法はあるのでしょうか。

現状の使用の手順を以下に挙げます。

○プログラム起動時の処理

テクスチャを2枚使用
LPDIRECT3DTEXTURE9 texture[2];

~テクスチャの読込み、モデルの登録など一連の初期化処理~

使用するモデルに0番のテクスチャを登録
Live2DModelD3D::setTexture(0, texture[0])


○毎フレームの処理

1番のテクスチャに切り替え
Live2DModelD3D::setTexture(0, texture[1])

描画
Live2DModelD3D::draw()

0番のテクスチャに戻す
Live2DModelD3D::setTexture(0, texture[0])


※終了時のリーク結果
Detected memory leaks!
Dumping objects ->
{180} normal block at 0x03938028, 2144 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.


使用しているソース
Live2D_SDK_DirectX 2.0.05_1
┗sample\\Simple\\main.cpp

素材は別サンプルの「miku」を使用しています。

以上、よろしくお願い致します。

コメント

  • 編集済: 1月 2015
    仰るとおり、Live2DModelD3D::setTextureは毎フレーム呼ぶものではありません。
    初期化時に、テクスチャそれぞれで一度呼べばいい関数です。
    動的なテクスチャ変更も、再度setTextureでテクスチャを再度設定すれば大丈夫です。
  • ご回答ありがとうございます。

    >仰るとおり、Live2DModelD3D::setTextureは毎フレーム呼ぶものではありません。
    >初期化時に、テクスチャそれぞれで一度呼べばいい関数です。
    >動的なテクスチャ変更も、再度setTextureでテクスチャを再度設定すれば大丈夫です。

    上記、了解しました。
    毎フレーム呼び出せる仕様ではないということで、
    以後、使用には注意します。

    1点、ご確認したいことがあります。
    質問させて頂いた内容にメモリリークの件を挙げさせて頂きました。
    メモリチェックに_CrtSetDbgFlag関数を使用していたのですが、
    再度、live2d::UtDebug::addMemoryDebugFlags関数を使用してメモリチェックを行ないました。
    やはり、メモリリークが発生しており、今だ解決しておりません。
    出来る範囲で調査したのですが、原因は分かっていません。
    調査した結果分かったことは、
    Live2DModelD3D::setTexture関数を使用するとプログラム終了後に
    Live2DModelD3D::deleteTextures関数でテクスチャを破棄してもメモリリークが発生することです。
    LPDIRECT3DTEXTURE9で作成したテクスチャを単独で破棄しても同様のことが起こります。
    もともとご提供頂いているLive2D_SDK_DirectX 2.0.05_1のサンプルにメモリリークが、
    発生しているようですのでそのことと関係があるかもしれません。
    出来るだけ取り除いた状態で調査したのですが、私の技術不足でこれ以上追跡が出来ませんでした。

    何かご教示を頂ければと思います。
    以上、よろしくお願い致します。
  • 編集済: 1月 2015
    横から失礼します。

    Live2D_SDK_DirectX_2.0.05_1_jpのサンプル「simple」をダウンロードしたそのままの状態で
    使った場合にメモリリークが見られるのは、終了処理にlive2DModelインスタンスのdeleteと
    live2d::Live2D::dispose()が抜けているせいかと思われます。
    まずはg_pDirect3D->Release()の下辺りに、この二つを追加して、初期状態でメモリリークが
    なくなるかどうかを試してみてください。

    またsetTexture()でメモリリークが発生するとのことですが、WndProc()のWM_PAINTなどの、
    本当に毎時呼ばれるような場所でsetTexture()を連続して呼んでおられたりはしないでしょうか?
    例えばですが、WndProc()にWM_KEYDOWNを追加して、wParamがVK_SPACEのとき、
    (この場合はスペースキーが押されたとき)に一回ずつsetTexture()を呼ぶようにしたりすれば、
    特にメモリが漏れることなくテクスチャを切り替えられます。

    自分の確認した環境はWindows7のVisualStudio2013です。
  • ご丁寧にありがとうございます。

    >Live2D_SDK_DirectX_2.0.05_1_jpのサンプル「simple」をダウンロードしたそのままの状態で
    >使った場合にメモリリークが見られるのは、終了処理にlive2DModelインスタンスのdeleteと
    >live2d::Live2D::dispose()が抜けているせいかと思われます。
    >まずはg_pDirect3D->Release()の下辺りに、この二つを追加して、初期状態でメモリリークが
    >なくなるかどうかを試してみてください。

    仰るとおり、live2DModelインスタンスのdeleteとlive2d::Live2D::disposeがサンプルでは抜けています。
    こちらはすでに対応はしております。
    対応した場合は_CrtSetDbgFlag関数でのメモリリークの表示はなくなります。

    >またsetTexture()でメモリリークが発生するとのことですが、WndProc()のWM_PAINTなどの、
    >本当に毎時呼ばれるような場所でsetTexture()を連続して呼んでおられたりはしないでしょうか?
    >例えばですが、WndProc()にWM_KEYDOWNを追加して、wParamがVK_SPACEのとき、
    >(この場合はスペースキーが押されたとき)に一回ずつsetTexture()を呼ぶようにしたりすれば、
    >特にメモリが漏れることなくテクスチャを切り替えられます。

    こちらはWM_PAINTではなくサンプルのコメントにある「メッセージ・ループ」内で呼び出すようにしておりました。
    ただ先日、毎フレーム呼び出す仕様ではないとのご回答を頂いておりましたので、
    現在はテクスチャの切り替えは行なっていません。

    上記、問題を取り除いた上で調査しておりました。
    以下、live2d::UtDebug::addMemoryDebugFlags関数でのメモリチェックのログを記載しておきます。


    D3DX: (INFO) Using SSE2 optimizations
    ----------------- Live2D Memory Info -----------------
    Warning! memory leaks found!!

    local malloc count : remaining : 3
    local malloc count : total : 3552
    local malloc memory : current : 96 byte
    local malloc memory : peak : 523 KB
    local malloc memory : total : 529 KB

    allocator malloc count : remaining : 0
    allocator malloc count : total : 54
    allocator malloc memory : current : 0 byte
    allocator malloc memory : peak : 578 KB
    allocator malloc memory : total : 578 KB

    LDObject instance count : 3
    LDObject total count : 1781
    LDUnmanagedObject instance count : 0
    LDUnmanagedObject total count : 1
    ------------------------------------------------------
    ===================== MEMORY LEAKS =====================
    [local]
    [no.3600 0x003F6A80] [no.3601 0x003F6AC0] [no.3602 0x003F6B00]
    //for memory debugging , call below before Live2D::init() ; (DEBUG mode only)
    #include "memory/UtDebug.h"
    live2d::UtDebug::addMemoryDebugFlags( UtDebug::MEMORY_DEBUG_MEMORY_INFO_ALL ) ;
    ===========================================================


    気になる点は以下の部分です。

    >[local]
    > [no.3600 0x003F6A80] [no.3601 0x003F6AC0] [no.3602 0x003F6B00]

    こちらはサンプル「Simple」のテクスチャ
     "res\\haru\\haru.1024\\texture_00.png"
     "res\\haru\\haru.1024\\texture_01.png"
     "res\\haru\\haru.1024\\texture_02.png"
    を初期化時にロードして、setTexture()に登録した場合に発生します。

    より詳細なログをlive2d::UtDebug::MEMORY_DEBUG_MEMORY_INFO_ALLで調べると以下の部分が実行時に出力されます。

    malloc [no.3600] 0x003F6A80 size( 32) , using 294 KB , peak 523 KB , DrawParam_D3D.cpp @ 166
    malloc [no.3601] 0x003F6AC0 size( 32) , using 294 KB , peak 523 KB , DrawParam_D3D.cpp @ 166
    malloc [no.3602] 0x003F6B00 size( 32) , using 294 KB , peak 523 KB , DrawParam_D3D.cpp @ 166

    プログラム実行中に[no.3600]、[no.3601]、[no.3602]のメモリが確保されているようです。
    プログラム終了時に以下の内容でメモリが解放されますが、上記の[no.3600]、[no.3601]、[no.3602]が見当たりませんでした。

    free [no.****]~

    余談ですが、[no.3600]、[no.3601]、[no.3602]の後に以下のメモリを確保する動作があります。
    上記の問題と何か関係があるのかどうか分かりませんが、気になりました。

    malloc [no.3603] 0x012FFB54 size( 1202) , using 295 KB , peak 523 KB , LDVector.h @ 461
    malloc [no.3604] 0x0130000C size( 1202) , using 297 KB , peak 523 KB , LDVector.h @ 461
    malloc [no.3605] 0x013004C4 size( 156) , using 297 KB , peak 523 KB , LDVector.h @ 461


    また、setTexture()でテクスチャの登録をしない場合のログも記載しておきます。

    D3DX: (INFO) Using SSE2 optimizations
    ----------------- Live2D Memory Info -----------------
    Successfully cleaned (no memory leaks found).

    local malloc count : remaining : 0
    local malloc count : total : 3549
    local malloc memory : current : 0 byte
    local malloc memory : peak : 523 KB
    local malloc memory : total : 529 KB

    allocator malloc count : remaining : 0
    allocator malloc count : total : 54
    allocator malloc memory : current : 0 byte
    allocator malloc memory : peak : 578 KB
    allocator malloc memory : total : 578 KB

    LDObject instance count : 0
    LDObject total count : 1778
    LDUnmanagedObject instance count : 0
    LDUnmanagedObject total count : 1
    ------------------------------------------------------


    こちらで使用している開発環境も記載します。

    Microsoft Windows XP Professional SP3
    Microsoft Visual C++ 2008 Express Edition


    検証したソースをご覧になりたい方もいらっしゃるかもしれないので添付します。
    「※」はこちらで追加・変更した部分です。
    main.txt

    出力されたログも添付します。
    log.txt

    以上です。
    よろしくお願い致します。
  • _CrtSetDbgFlag()を使っていたので気付きませんでしたが、UtDebugクラスを使うと
    メモリリークが発生しているメッセージが表示されることを、こちらの環境でも確認できました。

    DrawParam_D3D.cpp@166で確保している(?)メモリのアドレスは
    UtMemory::getMemoryInfoLocal()->lastUsingMemoryInfo->ptrから
    前方にテクスチャの枚数分で取れたので、試しに無理矢理解放してみたところ、
    コンパイラにそんなメモリは確保していないと怒られました。

    MemoryInfoSetクラスに確保していないアドレスがaddMemoryInfo()されていたり、
    解放後にremoveMemoryInfo()が呼ばれていないなどの可能性もあるのかも知れません。
    ちょっとユーザ視点だと追うのが難しそうなので、開発スタッフ様が解決してくれるのを
    待った方が良いかも知れません。
  • >t_takasakaさん

    いつもご丁寧にありがとうございます。

    やはりそちらの環境でも同じ現象が発生しましたか。
    同じような問題を抱えてらっしゃる方を発見できなかったので、
    てっきり自分の環境だけかと思い始めておりました。

    setTexture()を毎フレーム呼び出すと大量のメモリリークが発生した時は、
    原因がまったく分からなくて困っていたのですが、
    もしライブラリ側の問題であればこちらは手を出しにくそうです。
    同じように動的にテクスチャの切り替えを行っている方は
    使用には気をつけた方が良いかも知れませんね。
    引き続き、こちらは解決方法を探っていきますが、
    出来れば開発スタッフ様にご支援をして頂きたいと思っています。

    以上、ご協力ありがとうございました。
  • 報告と検証ありがとうございます。
    丁寧な報告があると、SDK開発チームのほうでもデバッグしやすいのでとても助かります。

    とりあえずはこちらでも再現することを確認いたしました。
    詳しくはこれから検証してみます。
  • お役に立てて幸いです。
    検証の件よろしくお願い致します。
  • テクスチャ設定時にLive2Dライブラリ内で微細なメモリリークがあったため修正しました。
    最新版は2.0.06です。

    ご報告ありがとうございました。

  • ご対応ありがとうございます。
    最新版のSDK(2.0.06_1)をダウンロードし、修正を確認しました。
    また何かありましたらよろしくお願い致します。
コメントするにはサインインまたは登録して下さい。