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で動かしたらどうなるか?を確認する。