Thema: Flash 8.5
Einzelnen Beitrag anzeigen
Alt 27-10-2005, 18:50   #138 (permalink)
André Michelle
[+]
 
Benutzerbild von André Michelle
 
Registriert seit: Dec 2002
Ort: cologne
Beiträge: 2.271
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 );
		}
	}
}
__________________
aM

blog | laboratory | tonfall | processing

Audiotool.com
André Michelle ist offline   Mit Zitat antworten