nirasan's tech blog

趣味や仕事の覚え書きです。Linux, Perl, PHP, Ruby, Javascript, Android, Cocos2d-x, Unity などに興味があります。

Unity + NGUI + Android で Atlas のテクスチャサイズが大きすぎると死ぬ問題

はじめに

  • Unity + NGUI の環境で Android 実機で起動したとき、4096x4096 のテクスチャを使った Atlas を2枚使おうとすると再起動がかかる。

エラーメッセージ

  • 以下のような感じで android.os.DeadObjectException とかいうのが出る。
W/InputMethodManagerService(  531): Session failed to close due to remote exception
W/InputMethodManagerService(  531): android.os.DeadObjectException
W/InputMethodManagerService(  531):     at android.os.BinderProxy.transact(Native Method)
W/InputMethodManagerService(  531):     at com.android.internal.view.IInputMethodSession$Stub$Proxy.finishSession(IInputMethodSession.java:366)
W/InputMethodManagerService(  531):     at com.android.server.InputMethodManagerService.finishSession(InputMethodManagerService.java:1268)
W/InputMethodManagerService(  531):     at com.android.server.InputMethodManagerService.clearCurMethodLocked(InputMethodManagerService.java:1280)
W/InputMethodManagerService(  531):     at com.android.server.InputMethodManagerService.onServiceDisconnected(InputMethodManagerService.java:1300)
W/InputMethodManagerService(  531):     at android.app.LoadedApk$ServiceDispatcher.doDeath(LoadedApk.java:1192)
W/InputMethodManagerService(  531):     at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1206)
W/InputMethodManagerService(  531):     at android.os.Handler.handleCallback(Handler.java:615)
W/InputMethodManagerService(  531):     at android.os.Handler.dispatchMessage(Handler.java:92)
W/InputMethodManagerService(  531):     at android.os.Looper.loop(Looper.java:155)
W/InputMethodManagerService(  531):     at com.android.server.ServerThread.run(SystemServer.java:1039)

対策

  • "android.os.DeadObjectException unity" でググって出てきた http://forum.unity3d.com/threads/strange-crash-on-load.125525/ を見る感じ、容量の問題っぽい。
  • Atlas のテクスチャのフォーマットを "RGBA 32 bit" から "RGBA Compressed ATC 8bit" にしたら、1枚あたり80Mくらいから20Mくらいになり、正常に動作するようになった。

TODO

  • 圧縮形式はこれがベストか?iOSで動かしたらどうなるか?を確認する。