So 'richtig' glücklich bin ich mit der Performance noch nicht. Ich weiss ja nicht, wie der Player seine Resourcen verteilt, aber eine Menge Zeugs vom Player benutze ich wahrscheinlich nie.
Hier ein
wavemap beispiel auf 80 x 80 (8.5 Player)
Die ganzen neuen Experimente sind ja nett, aber für nichts zu gebrauchen. Die meisten sind eh sehr klein und trotzdem nicht flott. Ich spreche jetzt nur von dem ganzen selbstgepixelten Zeugs. Das man mit der Performance noch andere tolle Sachen möglich sind, wenn ich zum Beispiel an physikalische Simulationen denke (Rigid Bodies, etc...), ist klar. Nur mal so in den Raum geworfen.
Code:
// compiler parameters:
// -default-size 80 80 -default-frame-rate 80
package
{
import flash.util.trace;
import flash.util.getTimer;
import flash.display.*;
import flash.events.*;
import flash.geom.*;
public class Wavemap extends MovieClip
{
//-- map size
private const xMax: int = 80;
private const yMax: int = 80;
//-- 2 wavemaps over time
private var wave0: Array;
private var wave1: Array;
private var mouseDown: Boolean;
private const origin: Point = new Point();
//-- off-/online bitmap
private var output: BitmapData;
private var buffer: BitmapData;
//-- fps
private var fpsText: TextField;
private var fr: int;
private var ms: int;
public function Wavemap()
{
stage.scaleMode = 'noScale';
initMap();
buffer = new BitmapData( xMax, yMax, false, 0xffffff );
output = new BitmapData( xMax, yMax, false, 0xffffff );
addChild( new Bitmap( output ) );
fpsText = new TextField();
fpsText.autoSize = 'left';
addChild( fpsText );
}
private function initMap(): Void
{
wave0 = new Array();
wave1 = new Array();
var x: int;
var w0: Array;
var w1: Array;
for( var y: int = 0 ; y < yMax ; y++ )
{
w0 = wave0[y] = [];
w1 = wave1[y] = [];
for( x = 0 ; x < xMax ; x++ )
{
//-- fill with zero
w0[x] = w1[x] = 0;
}
}
//-- inject events
stage.addEventListener( 'enterFrame', updateWave );
stage.addEventListener( 'mouseDown', onMouseDown );
stage.addEventListener( 'mouseUp', onMouseUp );
//-- init fps
ms = getTimer();
fr = 0;
mouseDown = false;
}
private function onMouseDown( event: Event ): Void
{
mouseDown = true;
}
private function onMouseUp( event: Event ): Void
{
mouseDown = false;
}
private function updateWave( event:Event ): Void
{
if( mouseDown )
{
// trigger wave
var mx: int = mouseX | 0;
var my: int = mouseY | 0;
if( mx > 0 && mx < xMax - 1 && my > 0 && my < yMax - 1 )
{
wave0[my][mx | 0] = 0xffffff;
}
}
var x: int;
var y: int = yMax - 1;
var n: int;
var c: int;
//-- save performance
var wy0: Array;
var wy1: Array;
while( --y )
{
x = xMax - 1;
wy0 = wave0[y];
wy1 = wave1[y];
while( --x )
{
//-- wave kernel
n = ((
wy0[x-1] +
wy0[x+1] +
wave0[y-1][x] +
wave0[y+1][x] ) >> 1 ) - wy1[x];
//-- damp the wave
wy1[x] = n = n - ( n >> 5 );
// clamp between (0,0xff)
c = ( n + 0xffffff ) >> 17;
//-- draw result
buffer.setPixel( x, y, c << 16 | c << 8 | c );
}
}
//-- flip
var wt: Array = wave0;
wave0 = wave1;
wave1 = wt;
//-- fps
fr++;
if( ms + 1000 < getTimer() )
{
fpsText.text = fr.toString();
fr = 0;
ms = getTimer();
}
//-- copy to output
output.copyPixels( buffer, output.rectangle, origin );
}
}
}