2012年5月27日日曜日

ヴィータでの休日ゆるゆるプログラミング楽しい & ヴィータの画面をメインループから更新する方法

今回の記事は、「大好きなゲーム機、ヴィータで休日にゆるゆるプログラミングするのって楽しいなぁ」という話と、ヴィータのプログラムの構造についての話について書かせて頂きたいと思います。

■やっぱり楽しいヴィータのプログラミング■

何回も書いている事で恐縮ですけれど、やっぱり、内容はともかくとして、とにかく大好きなゲーム機のヴィータで自作プログラミング出来るのって、最大級に嬉しくてふと思うと感極まってしまう場面があります。
大げさでも何でもなく、目頭がフワーッと熱くなってしまう。

プログラミングといっても、決して堅苦しくは考えず、ソニー(SCE)が用意してくれた数々の楽しいコンテンツの一つなんだと捉えるようにしています。
あれこれ試行錯誤して悩む事、それそのものを、良い意味でゲームの一つであるかのように楽しんで行ければ理想的じゃないかと。
PlayStation Suite SDKも、オープンベータの試供品的なものではあるものの、当初私が予想していたものよりも何倍も出来が良いものだったし、気分や状況次第で好きなPCに切り替えてどんどん開発出来るし(スクリーンショットは、Windows8 consumer previewでの風景)、まさかここまで大したものになっているとは思いもよりませんでした。

ここ一年くらい体調が優れず、休日は体を休める事が多くなってしまっている私ですが、その休日にゆるゆるとヴィータ・プログラミングが出来るのは本当に幸せな事だなぁと、全ての関係者様に感謝したいです。



■ヴィータのプログラムの構造について■

プログラミングのスタイルは、もちろん自由自在ではありますが、私の場合は、Windowsで言うところの「フォーム(画面)」を持ったスタイルでの開発をしています。

このフォーム、ヴィータではざっくり言ってしまうと「シーン(Scene)」になるのですが、Windowsと同じ概念でいると、割とドツボにはまってしまう事があって焦りました。

たとえば、今日、ちょっと早急に必要になって「ヴィータ用ストップウォッチ」を作ってみたのですが、ヴィータのプログラム構造をよく理解してないとヤバイ。

言ったら当たり前になっちゃうのかも知れませんが、ヴィータの「シーン」とWindowsの「フォーム」は動きが全く違います。
大雑把に言うと、Windowsのフォームはイベントが起きる(起こす)までは静止していますが、ヴィータのシーンは、その背後でMainクラスのメインループ処理が怒涛の勢いでグルグル回転しています。
つまり以下のようになります。

・Windowsフォームの場合は
(1)フォーム表示

で終わりです。後の処理はイベントが起きるまで無いです。

・ヴィータのシーン(Scene)の場合は
(1)各種初期化処理。自作シーンの用意
(2)メインループ開始。
終了フラグが真(true)になるまで以下の処理を繰り返す
(2-1)タッチパネルの状況を取得
(2-2)ゲームパッドの状況を取得
(2-3)入力装置からの入力に応じた処理を実行
(2-4)ハードウェアキーによる自作シーンの更新
(2-5)自作シーンの表示
※Windowsフォーム表示後に相当
※シーンに配置したウィジェットからのイベント処理で動作。
※しかしWindowsフォームと違って実は静止してない!!
(2-6)メインループを継続する


ちなみにシーンの画面更新タイミングは、0.01666...秒。16ミリ秒。おなじみの1秒間60フレームというタイミングってやつです。

この怒涛の勢いで回転するループ処理の中で、ゲームパッドや、タッチパネル等のセンサー情報をキャッチし、その内容を判断してしかるべき処理を行うわけです。

シーンには、Windowsフォームとコントロールの関係のように、ウィジェットを配置し、ヴィジェットにイベントを実装して、そこにプログラムを記述するイベント駆動スタイルを採用しているため、特にWindowsフォームと混同してても問題ない時もあるわけですが、あくまでもシーンはメインループの中の一つ。
Windowsフォームと違ってヴィータのシーンは「静止してない(実は秒間60フレームで書き換えられている)」というのを把握してないと、たとえばハードウェアキーからの処理が作れなかったり、今回のようにタイマー処理を作るときに、動きが変で愕然となる末路というかピンチが訪れてしまうわけです。

正直、このメインループとシーンの関係って、自分で納得出来るテストプログラムを組んでみないうちは、頭に入っていたつもりでイマイチ入ってませんでした。

ヴィータって、androidやiOS同様のリアルタイムOSなんですが、それをようやく実感出来るところです。

■具体的にメインループからシーンを更新する方法■

シーンに配置したウィジェットからのイベント駆動処理のみなら特に必要ない場合もありますが、ハードウェアキーの操作でシーンを更新するとなると、避けて通れないのがメインループからのシーンへの更新方法です。

私自身、ヴィータのプログラムは試行錯誤でやっているので、果たしてこれが正解(正道)なのかというのが分からない泣き所があるのですが、これもまた楽しみの一つかなと。呑気に構えております。

//****************************
//メインループ抜粋(例)
//****************************

public static void Main (string[] args)
{
   try
   {
      Initialize (); //←この中でシーンの初期セットアップ
      
      //@@@@@@@@@@[LOOP-START]@@@@@@@@@@
      while (bRES) 
      {
         SystemEvents.CheckEvents ();
         Update (); //←この中でシーン更新
         Render (); //←この中で更新したシーン表示
      }
      //@@@@@@@@@@[LOOP-END  ]@@@@@@@@@@
   }
   catch(System.Exception oE)
   {
      MessageDialog.CreateAndShow(MessageDialogStyle.Ok,"ヴィータからのお知らせ",oE.Message);
   }
}

//****************************
//Initialize()内部のシーン初期セットアップ(抜粋)
//****************************

   graphics = new GraphicsContext (); //システムのお約束処理
   UISystem.Initialize(graphics); //システムのお約束処理
   var MyScene = new mmmVitaStopWatch.Cls_Scene(); //自作シーンのインスタンス化
   UISystem.SetScene(MyScene, null); //自作シーンをヴィータのUISystemにセットアップ(まだ表示はされないのです!!)

//****************************
//Update()内部のシーン更新例(抜粋)
//****************************

   TimeSpan oTS; 
   Cls_Scene oSN; //自作のシーンクラス
   
   //UISystemから、現在準備されているシーンを取得します。(重要!!)   
   oSN = (mmmVitaStopWatch.Cls_Scene)UISystem.CurrentScene;
   
   //取得したシーンのウィジェットに任意の値を更新している部分(抜粋)
   oSN.DISP_MAIN.Text = GetTimeFormat(oTS);
   oSN.DISP_SPLIT.Text = GetTimeFormat (oTS_SPLIT);

   //この時点では全く表示が更新されないのに留意!!

//****************************
//Render()内部のシーン表示(抜粋)
//****************************
   UISystem.Render (); //これ過ぎちゃった後で何やっても画面に反映されないのです!!

//・・・それで、この一連の処理はメインループの中でグルグル回っているわけです。
//PSVITA自慢の、超高性能4コアCPU(ちなみにGPUも4コア)。
//ARMからラインセンスを受け、ソニー・東芝・IBMが開発したヴィータCPUのパワーで!!




ヴィータ、まだまだ発展途上だけれど、どんどん好きになります。

国産久々の大規模マルチタスクOSの上に、超一流の品質と量を誇る市販ゲームがバンバン登場し、現代的な便利アプリも形成されつつあり、さらにその上、自分で好きなプログラムが作れる古き良きホビーマシン文化まで鮮やかに蘇って大加勢して来るたぁイキだねぇ!! 嬉しくって涙が出らぁ(マジメに)。

それにしても(冷静)、オープンベータ終了後は、ホントこの良きホビー文化どうなるんでしようね。
今って、オープンベータだから当たり前なんですけれど、PlayStation Suite Studioそのものに、バグや未完成部分が残存しているわけです。
本サービス開始後は、より高機能・バグも緩和されたバージョンが提供されるのかな?

いやいや、そもそも、ヴィータの自作プログラム開発はどうなるのかな??

年間99ドル支払わないと何もかも一切禁止」となるのか・・・
単にPSストアで販売許可が出ないだけで、自分のヴィータに入れる分には自由にやってイイヨ!」となるのか?

もし前者なら、いまさらプログラム出来なくなるのは身を切られるくらい辛いから、年間99ドル払うつもりです。
でもホントどうなるんだろう。気になってしょうがないですねー・・・