2016年2月14日日曜日

ゲームアプリ第三弾「ハッスル・スクラッチ」


以前、ゲームアプリ第三弾は「(仮称)スクラッ字」などと予告していました。

これを英語表記にするとき、たぶん"scradge"なんかにしてしまうのですが、
これをググってみると、なんかよろしくない意味が出てくるので、考え直しました。

その結果「ハッスル・スクラッチ」ということにしました。
AndroidStudioでのアプリケーション名もHastleScratchにしちゃいました。

「ハッスル」というのが、今風でないというか、かえって脱力してしまいかねない感じですが、
自分の作るアプリは、うすうす「クール < 脱力」と思っていたので、それを前面に出してみました。

しかし、よろしくない意味かどうかはググればわかりますが、
昔は、OutRunの「passing wind」とか、X68kの「Sol-Feace」とか、いろいろありましたね。

一方で、ググればすぐわかるからということで、似たようなアイデアとかデザインとか名前がないかを先にきっちり調べておかないといけなくなったとも言えます。

java.lang.IllegalStateException: Surface has already been released.でハマる


一ヵ月以上ブログの更新が滞ってしまいました。

その原因は、タイトルに挙げた例外とそれに関連する以下の不具合対策に時間をとられていたためです。


アプリの描画はSurfaceViewを使っているのですが、アプリ動作中に「アプリ履歴ボタン」を連打すると、以下の9行目で、

 java.lang.IllegalStateException: Surface has already been released.

という例外が発生することがあります。
問題は、よくサンプルコードとして目にする以下の個所です。

 1: SurfaceHolder holder = getSurfaceHolder();
 2: Canvas c = null;
 3: try {
 4:     c = holder.lockCanvas();
 5:     if (c != null) {
 6:         :
 7:     }
 8: } finally {
 9:     if (c != null) holder.unlockCanvasAndPost(c);
10: }

9行目で例外が発生しているといことは、lockCanvasはできたけど、unlockCanvasAndPostしようとしたら、すでにSurfaceはreleasedだ、ということで、だれかがlockしていても、releaseされてしまうことがあるということですね。

さらにしつこく連打し続けていると、「戻る」ボタンで終了しなくなってしまう等の不具合が発生したりします。

ということで対策方法をいろいろ探っているのですが、後者の不具合は自作アプリ以外でも発生することがあるので、もしかしたらOSにも問題があるのかなぁと思うようになってきました。

ということで、対策方法の検討もしつつ、ゲームアプリ第三弾の開発も再開しています。