away3d / away3d-core-openfl

Away3D engine for OpenFL
166 stars 41 forks source link

[ Neko / Windows ] - BitmapTexture - BitmapData size vs performance #39

Open Jeff94 opened 9 years ago

Jeff94 commented 9 years ago

Hi all,

I have a performance problem to create a texture vs BitmapData size

Ex : "new BitmapTexture( new BitmapData( 2048, 2048, false ), false);"

Using 2048x2048 everything run perfectly under Flash but targeting Neko / Windows my software hang for a second .... decreasing BitmapData size reduce the issue ( at 128*128 everything fine on all target ) ...

Edit 1 : Seems the problem comes from BitmapData.getRGBAPixels ( ~ 900ms to process a 2048 x 2048 BitmapData )

Edit 2 : Temporary ( Ugly !! :-) ) workaround :

*** openfl._v2.display.BitmapData.hx public inline static function getRGBAPixels (bitmapData:BitmapData):ByteArray { var data = bitmapData.getPixels (new Rectangle (0, 0, bitmapData.width, bitmapData.height)); var size = bitmapData.width * bitmapData.height; var copy = new ByteArray(size-1); copy.writeBytes( data, 1, 0); return copy; }

ghost commented 9 years ago

A better way is

public inline static function getRGBAPixels (bitmapData:BitmapData):ByteArray {

    var rgbaData = new BitmapData( bitmapData.width, bitmapData.height, bitmapData.transparent );

    var rect = new Rectangle( 0, 0, bitmapData.width, bitmapData.height );
    var point = new Point( 0, 0 );

    rgbaData.copyChannel( bitmapData, rect, point, BitmapDataChannel.GREEN, BitmapDataChannel.RED );
    rgbaData.copyChannel( bitmapData, rect, point, BitmapDataChannel.BLUE, BitmapDataChannel.GREEN );
    rgbaData.copyChannel( bitmapData, rect, point, BitmapDataChannel.ALPHA, BitmapDataChannel.BLUE );
    rgbaData.copyChannel( bitmapData, rect, point, BitmapDataChannel.RED, BitmapDataChannel.ALPHA );

    return rgbaData.getPixels( rect );
}

My pull request for this change got merged recently: https://github.com/openfl/openfl/pull/604