« 疑似乱数1 | メイン | RenderScript で画像の拡大-ニアレストネイバー »

2015年05月11日

吉里吉里Z モバイル開発:: タイマー

    

Androidでの実現性をざっくり確認するため、起動部分と共通部分をビルドして見ていたので、その続きで固有部分をコンパイル通るようにしていっていたけど、固有部分だけを別に作りこんだ方が早い気がした。
ソースコードが多いとビルド時間かかるようになるし、動作の確認もしづらくなる。
と言うことで、固有(環境依存)部分をちまちま作る。
メインのメッセージ(イベント)ループ部分とそのメインスレッドで動作させる仕組み、スレッド、タイマー(内部)、ウィンドウ、グラフィック、サウンド、ムービー辺りが環境に依存する部分か。
Windows が特異で、その他は Linux 系で似てて、共通になる部分も多そうだけど。

吉里吉里2/Z は、内部に2種類のタイマーがある。
1つは TJS2 から利用できる Timer クラスを駆動するためのタイマー。
これは独立したスレッドで独自実装されている。
もう一つは Windows のタイマーを使っているタイマー。
吉里吉里2だと、VCL ので実装されていたんだったかな。
吉里吉里Zは、Windows のタイマーを使って直に実装している。
で、このタイマーから起動される関数はメインスレッドで動く。
メインスレッドで動くと言う部分が他でやろうとしたら少し面倒。

1. タイマー用のスレッド作って、時間が来たらイベント投げて処理する。
2. メインのメッセージループで、イベント待ちタイムアウトを利用してタイマー処理する。

最初1の方法でやろうかと思ったけど、よく考えたら2の方が余計なスレッドなど増えずにいいかなと思った。
TJS2 の Timer クラスを実装しているスレッドでついでにやってしまうことも考えたが、TJS2 に依存しているので独立して実装するのには不向き。
メッセージループで実装始めたが、タイマーとは別に 16msec ごとのタイムアウトを同居させて、タイマーが更新された時にタイムアウト時間再計算時イベント発行して~とやっていると、これは素直に別スレッドに実装した方がシンプルになるかと1に戻る。
実装してみるとやっぱりシンプルになった。


ウィンドウ周りどうするかって問題。
以前は、Android は Window がないんだから無くしてしまった方が良いと考えていたけど、常に全画面で積み重なる形で Window を実装してしまえばいいんじゃないかと思った。
動作的には Activity みたいなもの。
モーダルでウィンドウ開いたら、全画面で上に重なって入力を全部受け、閉じられたら消える。
KAG3 の確認ダイアログのような形なら、この方法で期待通り動作するはず。
モードレスの場合は、異なる動作になってしまうと言うか、Window が1つしか同時に出ないようなものなので、どうにもならない。
表示非表示で交互に入れ替えて使うなどは出来るかもしれないが、結局は同時に表示できないからあまり意味のないものになってしまう。
この辺りはスマフォのような小さい画面では諦めるしかない気もする。
Window 周りを自前実装するのなら、タブレットなど大きい画面用に同時に複数ウィンドウ表示も可能なように考えてもいいが、最初はその辺り考慮しなくても問題ないと思っている。


投稿者 Takenori : 2015年05月11日 01:08




comments powered by Disqus
Total : Today : Yesterday : なかのひと