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)が表示される。

0 件のコメント: