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

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

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

AndroidのLive2DSimpleサンプルを2度目に起動すると、モデルが描写されない

現在OpenGLのSDKをテストしており、Android上での動作を検証中です。

OpenGLのサンプル「Live2DSimple」を実行した際に、1度目の実行(ビルド後の実行やタスクをkillした後)ではモデルが正しく描写されますが、2回目以降のアプリ実行時にモデルが描写されません。

手順
1.サンプルをビルド、Androidへ転送
2.サンプルが実行され、モデルが描写される
3.バックキーでアプリを終了
4.再度サンプルを起動
5.モデルは描写されず、白い背景のみ描写される

サンプルでLive2D::dispose()が実行されていないためかと思い、実装し、SampleActivityのonDestroy()で実行してみましたが、結果は変わらず、2度目以降の実行時にモデルが描写されません。

マニュアルのCubism SDK‎ > ‎Live2Dライブラリの解説‎ > ‎初期化と終了 の項目に、「初期化時には標準出力に(省略)Live2Dのバージョン情報が表示」されるとありますが、2度目以降のアプリ実行時には出力されていないようにも見受けられます。

本現象はLive2D::init()もしくはLive2D::dispose()の呼び方に問題があるため発生している問題でしょうか。

お忙しいかと存じますが、ご確認いただければ幸いでございます。
初めての投稿で、情報など不足している部分があるかと存じますが、その際にはご指摘いただけますでしょうか。
よろしくお願いいたします。

テスト環境
OS:Mac 10.11
Live2D SDK ver:2.0.06_3
Android SDK ver:API 23
Android NDK ver:r10e

利用したソース
Live2D_SDK_OpenGL_2.0.06_3_jp/sample/simple/proj.android

1回目のlogcatの抜粋
6223-6241/jp.live2d.sample D/live2d﹕ Live2D version 2.0.06 for Android ES2
6223-6241/jp.live2d.sample I/jni﹕ GL Version = OpenGL ES 2.0 (2.1 ATI-1.36.46)
6223-6241/jp.live2d.sample I/jni﹕ GL Vendor = Google (ATI Technologies Inc.)
6223-6241/jp.live2d.sample I/jni﹕ GL Renderer = Android Emulator OpenGL ES Translator (ATI Radeon HD 6750M OpenGL Engine)
6223-6241/jp.live2d.sample I/jni﹕ GL Extensions = GL_EXT_debug_marker ・・・(省略)

2回目以降のlogcatのでは上記の「D/live2d」の行の出力がされません。


追加した関数
Live2DSimple.cpp
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

JNIEXPORT void JNICALL Java_jp_live2d_sample_JniBridge_nativeDispose(JNIEnv* env, jobject thiz);

JNIEXPORT void JNICALL Java_jp_live2d_sample_JniBridge_nativeDispose (JNIEnv* env, jobject thiz) {
Live2D::dispose();
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


JniBridge.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

public static native void nativeDispose();

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


SampleActivity.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
protected void onDestroy() {
JniBridge.nativeDispose();
super.onDestroy();
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


また本件とは異なってきて恐縮ですが、メモリの開放などの問題かとも思い、以下のマニュアルの方法で確認しようとすると、NDKでビルド時に以下のエラーが発生し、ビルドできませんでした。

マニュアル
Cubism SDK‎ > ‎Live2Dライブラリの解説‎ > ‎デバッグ機能‎ > ‎02. メモリリークの検出(C++)

Live2DSimple.cppのJava_jp_live2d_sample_JniBridge_nativeOnSurfaceCreated、Live2D::init();の前に
UtDebug::addMemoryDebugFlags( UtDebug::MEMORY_DEBUG_MEMORY_INFO_COUNT ) ;
を追加

エラー
jni/Live2DSimple.cpp:125: error: undefined reference to 'live2d::UtDebug::memoryDebugFlags'
collect2: error: ld returned 1 exit status
make: *** [obj/local/armeabi/libLive2DSimple.so] Error 1

この部分も実装方法など誤りがございますでしょうか。合わせて確認いただければ幸いです。

コメント

  • 編集済: 10月 2015
    可能性としては以下二つが考えられるのではないかと思われます。

    1.Live2D::dispose()が呼ばれていない。Live2D::init()はLive2D::dispose()されずに複数回呼ばれても実行されない仕組みになっているためモデルが表示されていない
    2.Live2D::dispose()は呼ばれてるが、二回目以降の起動で、何か別の要因でモデルの描画処理が呼ばれていない
    (↓こんな現象もあるようです)
    http://sunlight.cocolog-nifty.com/sunlight/2011/08/androidopengl-c.html

    とりあえず、問題点の切り分けのため、以下を試していただけますでしょうか?

    1.Live2D::dispose()の前にログ出力を追加して、処理が呼ばれているか確認
    2.モデルを描画しているonDraw系の関数の中にログ出力を追加して、二回目以降の起動でも処理が呼ばれているか確認
    3.Live2Dモデル以外の、通常の画像などをモデルと一緒に描画して、二回目以降の起動でも画像は表示されるか確認


  • ご確認頂きありがとうございます。

    切り分けに関しまして、確認させていただきました。
    ++ dispose()が呼ばれているか。++
    dispose()は呼ばれておりました。
    1度目のLogcatは
    I/jni(6472): Live2D::init() called
    D/live2d(6472): Live2D version 2.0.06 for Android ES2
    I/jni(6472): Live2D::init() done
    I/jni(6472): texture : 0
    I/jni(6472): texture : 1
    I/jni(6472): texture : 2
    I/jni(6472): Live2D Model w: 2400.000000 h: 3200.000000
    ・・・・
    I/jni(6472): Live2D::dispose() called
    I/jni(6472): Live2D::dispose() done

    バックキー押下の際に、disposeが呼ばれており、initの際にバージョン情報が表示されておりました。
    しかし2度目には
    I/jni(6472): Live2D::init() called
    I/jni(6472): Live2D::init() done
    I/jni(6472): texture : 0
    I/jni(6472): texture : 1
    I/jni(6472): texture : 2
    I/jni(6472): Live2D Model w: 2400.000000 h: 3200.000000
    ・・・
    I/jni(6472): Live2D::dispose() called
    I/jni(6472): Live2D::dispose() done
    のように、バージョン情報が吐き出されず、描画もされませんでした。

    ++ onDrawが呼ばれているか。 ++
    こちら1度目、2度目以降の起動双方で呼ばれておりました。


    ++ live2D以外のモデルは表示されるか。 ++
    現在libGDXを用いているため、直接の検証となっているか不安ではありますが、こちらはどの起動時にも正しく表示されております。(live2Dのモデルのみが表示されず、他は表示されている、という状況です。)

    Textureの削除も実施してみましたが、結果は変わらずでした。

    2度目以降の初期化時(init実行時)にバージョン情報が出力されないのは、仕様でしょうか。それとも正しく終了できていないためでしょうか。
    試しにinit->dispose->initとSampleGLRendererのonSurfaceCreatedで実行してみたところ、1度目の起動の最初のinitではバージョン情報が表示され、disposeの後のinitでは表示されませんでした。

    その際のログ
    I/jni(9250): Live2D::init() called
    D/live2d(9250): Live2D version 2.0.06 for Android ES2
    I/jni(9250): Live2D::init() done
    I/jni(9250): Live2D::dispose() called
    I/jni(9250): Live2D::dispose() done
    I/jni(9250): Live2D::init() called
    I/jni(9250): Live2D::init() done

    大変お手数をおかけいたしますが、ご確認頂けますでしょうか。
    また確認事項や間違い等ございましたら、ご指摘いただければ幸いでございます。
    よろしくお願い申し上げます。
  • Live2d::init()の起動時の処理ですが、二つのチェックを入れております。
    1.アプリが起動してから最初のinit()であるか
    2.init()がdispose()されずに重複して呼ばれていないか

    ログにバージョンが表示されるのは項番1のチェック中で、アプリの起動を通じてこの一回のみとなっています。
    このため、ご指摘いただきましたように、二回目以降のinit()でバージョンが表示されないのは仕様となっております。

    モデルが表示されない原因に関してですが、もう少し条件を絞りたいので、Androidの機種名とOSのバージョンをお教え願えますでしょうか?
    またコンパイラはXcodeでしょうか?こちらのバージョンもいただけると助かります。
    よろしくお願いいたします。
  • ご確認いただきありがとうございます。

    起動中のログの表示に関しまして、起動時の2度目以降のinitではログが表示されないとのこと、ご確認いただきありがとうございます。

    コンパイラはEclipseを使用しています。
    Version: Juno Service Release 2
    Build id: 20130225-0426
    またIntellij(14)を使用してみた場合も同様でした。

    再現しているAndroid機種とOSのバージョンですが、手元にある幾つかの機種で試してみたところ、同様の現象となっております。

    Nexsu5(Android6.0)
    Nexus7(2012、Android5.1.1)
    HTL22(Android4.2.2)

    initとdisposeの動きのみを検証するため、sample/simple/proj.androidのプロジェクトで、initとdisposeのみをコールしてログを確認してみました。

    SampleGLRenderer.javaのonDrawFrame、onSurfaceChangedの中身をコメントアウト、onSurfaceCreatedのJniBridge.nativeOnSurfaceCreated();以外をコメントアウトし、disposeを前の更新内容のように実装しました。

    すると最初の起動(ビルド後の実行)では
    I/jni(1877): Live2D::init() called
    D/live2d(1877): Live2D version 2.0.06 for Android ES2
    I/jni(1877): Live2D::init() done
    のようにinitのログが出力されました。
    その後、バックキーで終了し、
    I/jni(1991): Live2D::dispose() called
    I/jni(1991): Live2D::dispose() done
    D/debug(1991): onDestroy()
    のログを確認(SampleActivity.javaのonDestroyの処理)し、アプリケーションの終了後、再度起動すると
    I/jni(1991): Live2D::init() called
    I/jni(1991): Live2D::init() done
    のように、バージョン情報が表示されていないように動作します。

    ご確認頂きました、「2度目のinit」のような状態に見受けられます。
    アプリ自体は終了し、onDestory実行時にdisposeを呼んでいるのですが、次回起動時(クリーンな起動と認識しています)の際に、initの処理で2度目のinitと処理されている状況でしょうか。

    やはりdisposeの方法に問題があるのでしょうか。

    また問題点が異なるため、異なるディスカッションにてご相談させていただいた方が良い可能性もございますが、問題点を確認するため、メモリの状態をダンプさせようとすると、
    error: undefined reference to 'live2d::UtDebug::memoryDebugFlags'
    とビルドエラーとなってしまいます。
    Live2DSimple.cppのLive2D::init();の直前に
    UtDebug::addMemoryDebugFlags( UtDebug::MEMORY_DEBUG_MEMORY_INFO_COUNT ) ;
    を追加した状態です。
    明示的に"util/UtDebug.h"をインクルードした場合もエラーとなりました。
    こちらも合わせてご確認いただければ幸いでございます。
    異なるディスカッションにてご相談させていただいた方が良い場合には、その旨ご指摘頂けますでしょうか。

    何卒ご確認のほど、よろしくお願い申し上げます。
  • 編集済: 10月 2015
    こちらでも現象確認いたしました。調査を行いますので、しばらくお待ちいただけますでしょうか。

    また、memoryDebugFlagsのエラーについて、直接的にはstaticメンバ変数が初期化されていないことが原因ですが、なぜ初期化されていないかというとL2D_DEBUGマクロが宣言されていないからでして、更になぜL2D_DEBUGマクロが宣言されていないかというとDEBUGマクロが無効であるからだと思われます。
    (Live2D.hの100行目付近になります)
    チュートリアルの注意書きにはVSとXcodeのみの例でEclipseについては書いておらず申し訳ありません。
    おそらくですが、コンパイラから設定しなくとも手動のdefineで大丈夫かと思います。
  • ご確認頂きありがとうございます。

    本件の現象に関しまして、よろしくお願い申し上げます。

    またmemoryDebugFlagsのエラーに関しまして、ご確認頂きありがとうございます。
    こちらでAndroid NDKでビルドする際に、_DEBUGを指定して実行しておりました。
    試しに
    #define L2D_DEBUG 1
    と明示的にターゲットソースの1行目に宣言し、再度ビルドを試したところ、同様にエラーとなってしまいます。
    直接ndk−buildから試した場合でも同様でございます。
    こちらに関しましても、何卒よろしくお願い申し上げます。
  • 以下新バージョンにて確認してみたところ、同様に問題が発生している状況でございました。

    SDK OpenGL 2.0
    2.0.08_2
    2.0.10_1

    2.0.08_2の修正内容で本件修正を期待しましたが、まだ修正されていないようです。
    大変お忙しいかと存じますが、引き続き何卒よろしくお願い申し上げます。
  • お待たせしてしまい申し訳ありません。
    現在Cubism SDK for OpenGLは2.1対応版の開発を進めており、本件はそちらで対応する予定となっております。
    状況としては最終確認の段階で、近日中に公開できると思われますので、もう少々お待ちくださいませ。
    よろしくお願いいたします。
  • 2.1での修正予定とのこと、ありがとうございます。
    公開など、待たせていただきます。よろしくお願い申し上げます。
コメントするにはサインインまたは登録して下さい。