Androidアプリを作ってみる #14 -Surfaceview?-

前回露呈した問題

前回簡単にゲームの背景になる画像を表示してみました。

前回の記事

Androidアプリを作ってみる #13 -画像の表示 その2-

2016.11.06

そこで調べていて気がついたのは、このままのやり方ではゲームとかの高速描画が要求されるアプリには不向きということらしいです。何が不向きなんでしょうかね。

まとめて処理すると大変なのよ

どうして今までのやり方だとダメなのか。ま、ダメってわけでもないみたいですけど普通はやらないらしい。今までやってたのはsetContentView()で表示の対象になるViewをセットしてましたね。これでやるとタップしたときとかのユーザー入力に対処する処理と同じ場所で画像の描画処理を行ってしまうということらしい。

にゃんこ
なんでそれがダメなん?

ユーザーからのなんらかの入力処理と同じ場所(UIスレッド)でやってるということは、画像の描画を行っていない時間が発生していることになりますね。それだとドンドン処理が増えるごとに画像の描画が遅れてしまう結果になります。イメージはこんな感じです。

まとめて処理すると大変。

まとめて処理すると大変。

通常プログラムっていうのは、上から下に向かって実行していて、それがグルグル回ってます(無限ループ)。そのグルグル回ってるときに何かの操作を検出したり、それに合わせて画面を更新したりしていくわけです。でもこの二つを同じループ内で処理をするとさっきのような問題が必ず出てきます。

分かりやすい例で誤解を恐れずに言うと、上のような作りで、巨大なサイズのデジカメ写真を読み込んで表示するアプリを作ったとします。そしたらどうなるでしょう? 結果は写真のファイルを読み込み終えるまで何も操作ができないポンコツアプリになってしまいます。ま、やり方次第でしょうけど。

メリ
誤解したかも。
にゃんこ
何も分かってない癖に。



並列に実行させる

じゃ、どうすればこの問題を回避できるんでしょうか。答えはプログラムを「並列処理」させることです。「ユーザーの操作を処理する部分」と「画像を更新する部分」を別々に実行させれば良いではないかということです。

にゃんこ
プログラムって上から下に順番に実行ってさっき・・・。

実際は並列じゃない

並列処理をするって言っても完全に並列にはできません。話を簡単にするためにCPUのコアが一つの場合に絞ります。このときプログラムは上から下に向かって一行一行実行されます。だから実際には完全に並列に実行するなんて不可能です。じゃどうするかというと処理の単位を「スレッド」という単位に分けて、あたかも並列に処理しているように見せるわけです。これはプログラムでなんとかするわけではなく、「スレッド」に分けて処理をすればOSが各スレッドの実行時間や優先度とかを管理して実行権を割り振って、あたかも並列に動いているように見せてくれているんです(一気に実行するのではなく、各スレッドを少しずつ実行していく感じ)。

PCでたくさんアプリを立ち上げても同時に動いているように見えるのもこういう仕組みです(スレッドとはちょっと違うけど)。それが間に合わなくなると固まってしまったように見えるわけです。

難しいことを書きましたが簡単なイメージはこうです。

別々に処理すると負担が減る。

別々に処理すると負担が減る。

これだと、それぞれが自分の役割に専念できそうですね。

で、何の話だっけ

何の話だっけ?あ、それをAndroidで実現するにはどうすればいいか?でした。調べてみました。どうやら「SurfaceView」という機能を使えば、画像処理専用のスレッドが扱えるということらしい。次回はそれを使ってみますか。

メリ
もうチンプンカンプンよ。

次の記事

Androidアプリを作ってみる #15 -クラスとは-

2016.11.23

前回の記事

Androidアプリを作ってみる #13 -画像の表示 その2-

2016.11.06