2010年7月24日土曜日

etc - haXeでFlash至上最速の3Dラスタライザを目指して(2)

[3] 速度検証

swf-version 10 で、flash9.Memoryを使用することでVirtualMemoryが使用されるらしいので眺める。
http://haxe.org/api/flash9/memory
これが今回haXeを使用する最大の理由である。

同様にflash9.Vectorも速いらしい。
http://haxe.org/api/flash9/vector
これと、Matrixだとか、Matrix3Dだとか。
それらを、自前で実装した場合の速度と比較する必要がある。

(後で)

[4] 画像描画

画像が描画できないと話にならない。
ということで、1millionのソースを適当に削って、画像1枚描画するだけのコードに。
haXeはもちろん、ASも知らないけど、どうみても劣化Javaなので何とかなる。
パッケージはよく調べてないので、そのままコピペ。


package;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Matrix3D;
import flash.geom.Vector3D;
import flash.utils.ByteArray;
import flash.utils.Endian;

import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;

class Rasterizer extends Sprite {

// storage params
private static inline var WIDTH : Int = 550;
private static inline var HEIGHT : Int = 400;
private static inline var PIXELS : Int = WIDTH*HEIGHT;
private static inline var PIXEL_BYTES : Int = PIXELS*4;
// 使うvirtualmemoryの合計バイト数
private static inline var BYTES : Int = PIXEL_BYTES;

private var bitmap : Bitmap;
private var bitmapData : BitmapData;

// たぶんコンストラクタ
function new()
{
super();
initBuffers();
addEventListener( Event.ENTER_FRAME, enterFrameHandler );
}

// たぶん再描画ハンドラ
private function enterFrameHandler( event : Event ): Void {
// ビットマップ初期化
for( i in 0...PIXELS ) {
flash.Memory.setI32( i*4 , 0xFF0000 );
}

// 画面描画
flash.system.ApplicationDomain.currentDomain.domainMemory.position = 0;
this.bitmapData.lock();
this.bitmapData.setPixels( this.bitmapData.rect , flash.system.ApplicationDomain.currentDomain.domainMemory );
this.bitmapData.unlock( this.bitmapData.rect );
}

// 初期化
function initBuffers():Void {
// ビットマップ生成
this.bitmapData = new BitmapData( WIDTH , HEIGHT , false , 0 );
this.bitmap = new Bitmap( this.bitmapData );
addChild( this.bitmap );

// メモリ確保
var storage : ByteArray = new ByteArray();
storage.endian = Endian.LITTLE_ENDIAN;
storage.length = BYTES;
flash.Memory.select( storage );
}


static function main()
{
var clip:flash.display.MovieClip = flash.Lib.current;
var rasterizer:Rasterizer = new Rasterizer();
clip.addChild( rasterizer );
}
}


// compile.hxml

-swf9 rasterizer.swf
-swf-version 10
-main Rasterizer


// rasterizer.html

<div id="swf" style="width:550px;height:400px">
<object type="application/x-shockwave-flash" width="550" height="400" data="rasterizer.swf">
<param name="movie" value="rasterizer.swf" />
<param name="quality" value="high" />
</object>
</div>




これを実行すると、上のように赤で塗りつぶされた、
VirtualMemoryを使った画像(Flash)が表示される。

etc - haXeでFlash至上最速の3Dラスタライザを目指して(1)

Flash作ったこと:0回
Action書いたこと:0回
時間:明日ワンフェスに行くので今日しかない
愛読書:無謀キャプテン


よし、やるぞ!

[1] インストールとHelloWorld

http://haxe.org/download

ここから HaXe の WindowsInstaller を落としてきてインストール。
C:\Program Files/Motion-Twin/haxe/ とかいうところに勝手にインストールされた。



Gettins started with haXe/Flash を眺める。

まずはHelloWorldがるのでやってみよう。

テキストエディタで

class Test {
static function main() {
trace("Hello World !");
}
}


と書いて、どこか適当なディレクトリにTest.hxと名前をつけて保存する。
どこか適当なディレクトリだからってデスクトップとかはやめておこうJK。
今回はF:\work\haxe に保存。

さらにテキストエディタで新規作成して

-swf9 test.swf
-main Test

と書いて、先ほどと同じディレクトリにcompile.hxmlと名前をつけて保存する。

先ほどと同じディレクトリを、コマンドプロンプトを開いて、

haxe compile.hxml

と入力して実行する。



コマンドプロンプトの開き方が分からない人は適当にググってください。
成功すると上の画像のように、何も表示されず、
代わりに先ほどのディレクトリに、test.swfが出来ています。



続いて、このtest.swfをブラウザで表示させるために、テキストエディタで
Gettins started with haXe/Flash
にある、test.htmlを書いて保存します。

ダブルクリックで開くと、標準のブラウザで、先ほど作ったFlashが表示されます。




[2] Flash 10, One Million 3D particles with Haxe のコンパイルと実行

さっき作ったファイルを全部消去。
Flash 10, One Million 3D particles with Haxe.
ここのソースを名前をつけて保存。

先ほどと同じように compile.hxmlを新規作成して


-swf9 onemillion.swf
-swf-version 10
-main OneMillion


と記入して、保存。
先ほどと同じように、コマンドプロンプトで、
haxe compile.hxml
でコンパイル。

onemillion.htmlを新規作成して、下記を記載

<object type="application/x-shockwave-flash" width="550" height="400" data="onemillion.swf">
<param name="movie" value="onemillion.swf" />
<param name="quality" value="high" />
</object>


ダブルクリックで開く。表示された。




(長くなってきたので次のエントリに続く)

2010年7月10日土曜日

etc - 3D vision!!!

NVIDIA 3D VISION(3Dメガネ)と、ACERの3D VISION対応モニターを購入しました。ACERのモニターは割りと地雷らしいので注意!今のところ、グラフィックは問題ないけど、文字の表示が微妙。


[環境]
・GeForce8800GT
・vista 32bit business
・Core2Duo E7500

vistaか7しか対応してないので注意。
あと、GPUだけでなく、CPUも2倍使うとの噂なので、デュアルコア以上じゃないと厳しいかもしれない。


[基本事項]
DirectXを使ったフルスクリーンのゲームじゃないと3D visionが稼動しないので注意。
よって、OpenGLのBlenderなどでは全く反応しない。

設定は、ドライバインストール後に、設定ウィザードとかいうのが出てきて、(出なかったらコンパネのNVIDIAコントロールパネルの3DVisionのところあたりから出せる)、周波数を50Hz設定にしないと、俺の目が悪いのか凄いチラ付いて見れたもんじゃなかった。他はモニタを120Hzにしておく程度。


[早速検証]

・らぶデス2以降
普通に見れた。これは凄い!2.5次元はじまった!
ただし、グラボとCPUに2倍性能が必要らしいので、激しく注意。
まだ試してないけど、1体が限界かもしれない。

・リアル彼女体験版
禿げた!→設定で直った。
でも目ん玉が奥にあるように見えて、他にも怪しい部分が結構あって微妙。


・VOCALOMARK(β)
アイマスみたいな、パキっとしたトゥーンは、相性が悪い。これは最初想像していたとおりの感じだった。前後で2、3体並べば、割と奥行きは感じられた。

・東方地霊殿
3D vision反応して稼動したけど、3D映画のセリフのところが自機/敵/玉になってる感じ。

・自作ベンチマーク
普通に稼動したけど、前述のとおり、階調が少ししかないトゥーンは相性が悪くて、見栄えは微妙。あと、正射影表示にしたら、バグった感じにブレた表示になった。射影は必須なのかもしれない。


(続く)