我有一个关于像素弯曲的性能问题.我想放大许多BitmapData(将它们的大小加倍到新的BitmapData).我是用as3做的,但是想用像素弯曲器来获得更好的性能.在我的机器上,我通过像素弯曲演示获得更好的性能然后as3.
令我惊讶的是(或编码/理解不好),我在像素弯曲器中的表现要差得多 - 2秒vs 1/2秒!我期望得到至少与 as3 相同的性能.我究竟做错了什么?
我在这里得到了直观的像素弯曲代码(下面包含它以便于参考).
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, 0, true ); } private function efCb( evt:Event ):void { removeEventListener( Event.ENTER_FRAME, efCb, false ); traceTime( "init" ); var srcBmd:BitmapData = new BitmapData( 80, 120, false, 0 ); var destBmd:BitmapData = new BitmapData( 160, 240, false, 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; } } }
和像素弯曲代码:
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 } }
Juan Pablo C.. 8
我认为问题在于你真的将Pixel Bender与原生播放器代码进行比较,而不是与"actionscript"进行比较.我怀疑Pixel Bender会在那种情况下获胜.
这里发生的缩放destBmd.draw( srcBmd, mx );
直接在播放器中编码; 这可能和你能得到的一样快(使用等效的算法).另一方面,你的内核至少要先编译(或JIT编译)才能运行(可能还有很多其他原因让它变慢;但我不太了解具体细节).
从Flash Player工程师的博客中查看此帖子:
很久以前,回到Flash Player 8天,我们想到了添加通用方法来做位图过滤器.像我们为Flash Player 8所做的硬编码位图过滤器不仅不灵活,而且还有将大量本机代码添加到播放器并且必须针对每个平台进行优化的负担.对我们来说,问题一直是如何编写这样的通用过滤器.各种各样的想法都在浮动,但最后还有一个问题:我们没有语言,也没有编译器.在Macromedia与Adobe合并之后,Flash Player和Adobe Pixel Bender团队走到了一起,我们终于拥有了我们所需要的东西:语言和编译器.
因此,基本上,Pixel Bender比直接在Actionscript中操作像素更快.它将胜过同等数量的setPixel和getPixel调用.但它不会比播放器本身更快(再次使用相同的算法).
在某种程度上,你要做的就像在PB中写一个发光滤镜.当然,它很酷,如果你对图像处理感兴趣,你可以从中学到很多东西.但是,如果你的过滤器就像原生过滤器一样工作,除了教育目的之外没有多大意义:原生过滤器会更快,而且已经可用,没有额外的代码行.
我认为问题在于你真的将Pixel Bender与原生播放器代码进行比较,而不是与"actionscript"进行比较.我怀疑Pixel Bender会在那种情况下获胜.
这里发生的缩放destBmd.draw( srcBmd, mx );
直接在播放器中编码; 这可能和你能得到的一样快(使用等效的算法).另一方面,你的内核至少要先编译(或JIT编译)才能运行(可能还有很多其他原因让它变慢;但我不太了解具体细节).
从Flash Player工程师的博客中查看此帖子:
很久以前,回到Flash Player 8天,我们想到了添加通用方法来做位图过滤器.像我们为Flash Player 8所做的硬编码位图过滤器不仅不灵活,而且还有将大量本机代码添加到播放器并且必须针对每个平台进行优化的负担.对我们来说,问题一直是如何编写这样的通用过滤器.各种各样的想法都在浮动,但最后还有一个问题:我们没有语言,也没有编译器.在Macromedia与Adobe合并之后,Flash Player和Adobe Pixel Bender团队走到了一起,我们终于拥有了我们所需要的东西:语言和编译器.
因此,基本上,Pixel Bender比直接在Actionscript中操作像素更快.它将胜过同等数量的setPixel和getPixel调用.但它不会比播放器本身更快(再次使用相同的算法).
在某种程度上,你要做的就像在PB中写一个发光滤镜.当然,它很酷,如果你对图像处理感兴趣,你可以从中学到很多东西.但是,如果你的过滤器就像原生过滤器一样工作,除了教育目的之外没有多大意义:原生过滤器会更快,而且已经可用,没有额外的代码行.