flash – 使用PixelBender将位图的大小加倍
我有一个关于像素弯曲的性能问题.我想放大许多BitmapData(将它们的大小加倍到新的BitmapData).我是用as3做的,但是想用像素弯曲器来获得更好的性能.在我的机器上,我从像素弯曲机
demonstrations然后as3获得更好的性能.
令我惊讶的是(或编码/理解不好),我在像素弯曲器中的表现要差得多 – 2秒vs 1/2秒!我期望得到至少与as3相同的性能.我究竟做错了什么? 我得到了直接的像素弯曲代码here(它包含在下面以便于参考). package { import flash.display.BitmapData; import flash.display.Shader; import flash.display.ShaderJob; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.geom.Matrix; public class flashFlash extends Sprite { [Embed ( source="pixelbender/bilinearresample.pbj",mimeType="application/octet-stream" ) ] private static var BilinearScaling:Class; public function flashFlash( ):void { stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; addEventListener( Event.ENTER_FRAME,efCb,false,true ); } private function efCb( evt:Event ):void { removeEventListener( Event.ENTER_FRAME,false ); traceTime( "init" ); var srcBmd:BitmapData = new BitmapData( 80,120,0 ); var destBmd:BitmapData = new BitmapData( 160,240,0 ); var mx:Matrix = new Matrix( ); mx.scale( 2,2 ); for (var i:uint = 0; i < 3000; i++) { destBmd.draw( srcBmd,mx ); } traceTime( "scaled with as3" ); // create and configure a Shader object var shader:Shader = new Shader( ); shader.byteCode = new BilinearScaling( ); shader.data.scale.value = [.5]; shader.data.src.input = srcBmd; for (var j:uint = 0; j < 3000; j++) { var shaderJob:ShaderJob = new ShaderJob( ); shaderJob.shader = shader; shaderJob.target = destBmd; shaderJob.start( true ); } traceTime( "scaled with pixel bender bilinearresample.pbj" ); } private static var _lastTraceTime:Number = new Date().getTime(); public static function traceTime( note:String ):Number { var nowTime:Number = new Date().getTime(); var diff:Number = (nowTime-_lastTraceTime); trace( "[t" + diff + "] " + note ); _lastTraceTime = nowTime; return diff; } } } 和像素弯曲代码: <languageVersion : 1.0;> kernel BilinearResample < namespace : "com.brooksandrus.pixelbender"; vendor : "Brooks Andrus"; version : 1; description : "Resizes an image using bilinear resampling. Constrains aspect ratio - divide Math.max( input.width / output.width,input.height / output.height ) and pass in to the scale parameter"; > { parameter float scale < minValue: 0.0; maxValue: 1000.0; defaultValue: 1.0; >; input image4 src; output pixel4 dst; void evaluatePixel() { // scale should be Math.max( src.width / output.width,src.height / output.height ) dst = sampleLinear( src,outCoord() * scale ); // bilinear scaling } } 解决方法
我认为问题在于你真的将Pixel Bender与原生播放器代码进行比较,而不是与“actionscript”进行比较.我怀疑Pixel Bender会在那种情况下获胜.
这里发生的缩放是destBmd.draw(srcBmd,mx);直接在播放器中编码;这可能和你能得到的一样快(使用等效的算法).另一方面,你的内核至少要先编译(或JIT编译)才能运行(可能还有很多其他原因让它变慢;但我不太了解具体细节). 查看the blog of a Flash Player engineer的这篇文章:
因此,基本上,Pixel Bender比直接在Actionscript中操作像素更快.它将胜过同等数量的setPixel和getPixel调用.但它不会比播放器本身更快(再次使用相同的算法). 在某种程度上,你要做的就像在PB中写一个发光滤镜.当然,它很酷,如果你对图像处理感兴趣,你可以从中学到很多东西.但是,如果你的过滤器就像原生过滤器一样工作,除了教育目的之外没有多大意义:原生过滤器会更快,而且已经可用,没有额外的代码行. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |