2012年2月19日日曜日

グラフィック系統のAndroid化

VG-Engineのグラフィック系統のAndroid移植に難産中。
技術的なところの疑問は綺麗に解消しているのですが、「どの方式でいくか」で。

一般的に、画像処理性能が求められるAndroidプログラムの場合、OpenGLを用います。
しかし、OpenGLは3D専用だからやめました。
もちろん、巷ではOpenGLを使って2Dゲームを作っている方も多いと思います。
それらを否定するものではありません。

OpenGL非採用の原因は、ビデオメモリをロックしてメモリ内容を転送する手段が無いこと。
一応、テクスチャ画像をロックして、テクスチャ領域へメモリ内容を転送し、ポリゴン経由で出力する手段も無くは無いでしょうけど。

しかし、それを用いて画面全体分(240x320)の大き目の画像表示する性能が、果たして実用に耐え得るものなのか・・・が、疑問。ついでに、テクスチャのサイズが一片につき2のn乗でなければならない制約が引っ掛かりました。(つまり、私が目的とする使い方を想定した仕様ではない可能性が高い)

という訳で、SurfaceView+AndroidBitmap+Canvasを用いる方式で実現する方向性に切り替え。
(その決断をするための判断材料を得るのに難産しました)

とりあえず、グラフィック部分のみのJava側の実装はアッサリ完了。
折角なので、晒しておきます。

■アクティビティの実装
単純にスクリーン設定をしてサーフェースビューをコンテントビューに設定するだけ。

■サーフェースビューの実装
div class="separator" style="clear: both; text-align: center;">
ちょっと長いですね。
コンストラクタで仮想VRAM情報のAndroidBitmapを作成し、メインループ(スレッド)関数で仮想VRAM情報を更新する関数を呼び出し、その結果をカンバスクラスのビットマップ書き込み関数で更新する感じです。

Javaは反吐が出るほど大キライなので、Java実装はこれにてほぼ完成です。
可能な限り、Javaでは書きたくありません。
あとは、不可避な事情が発生した場合に限り、必要に応じて最小限の実装を追加するだけ。

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

合理的ではないものを作りたい

ここ最近、実機版の東方VGSの開発が忙しくて、東方VGSの曲追加が滞っています。 東方VGS(実機版)のデザインを作りながら検討中。基本レトロUIベースですがシークバーはモダンに倣おうかな…とか pic.twitter.com/YOYprlDsYD — SUZUKI PLAN (...