代码之家  ›  专栏  ›  技术社区  ›  jedierikb grijalvaromero

使用PixelBender将位图的大小增加一倍

  •  5
  • jedierikb grijalvaromero  · 技术社区  · 15 年前

    我有一个关于像素弯曲器的性能问题。我想放大许多位图数据(将它们的大小加倍为新的位图数据)。我在AS3上做这个,但是想使用像素弯曲器来获得更好的性能。在我的机器上,我可以用像素弯曲器获得更好的性能。 demonstrations 然后AS3。

    令我惊讶的是(或糟糕的编码/理解),我正在 更糟 像素弯曲器的性能——2秒对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, 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;
    }
    
    }
    }
    

    像素弯曲器代码:

    <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
        }
    }
    
    2 回复  |  直到 15 年前
        1
  •  8
  •   Juan Pablo Califano    15 年前

    我认为问题在于,你真的在比较PixelBender和本地播放器代码,而不是“ActionScript”。我怀疑PixelBender在这种情况下是否会获胜。

    这里发生的缩放 destBmd.draw( srcBmd, mx ); 直接在播放器中进行编码;这可能是最快的速度(使用等效算法)。另一方面,您的内核至少要先进行编译(或JIT编译),然后才能运行(可能还有许多其他原因导致它变慢;不过,我对具体细节不太了解)。

    查看此日志 the blog of a Flash Player engineer :

    很久以前,回到Flash播放器 8天之后,我们想增加一个 位图过滤器的一般方法。硬的 像我们对位图过滤器进行编码一样 Flash播放器8不仅 灵活,但有增加的负担 大量的本机代码进入 玩家和必须优化它 每个平台。问题 我们一直是你想要的 编写此类通用筛选器。各种各样 想法四处飘荡,但在 最后有一个关键点:我们 没有语言,也没有编译器。后 Macromedias与Adobe合并 Flash播放器和Adobe像素 本德团队走到一起,我们 终于有了我们需要的:一种语言 以及编译器。

    所以,基本上,PixelBender比ActionScript中直接操作像素更快。它将超过相当数量的setpixel和getpixel调用。但它不会比玩家本身更快(同样,使用相同的算法)。

    在某种程度上,你所要做的就是写一个发光滤光片。当然,它很酷,如果你对图像处理感兴趣的话,你可以从中学到很多东西。但是,如果您的过滤器要像本机过滤器一样工作,那么除了教育目的之外,它没有太多的意义:本机过滤器将更快并且已经可用,没有额外的代码行。

        2
  •  2
  •   quoo    15 年前

    我隐约记得听说,尽管连接到PixelBender文件等的过程较慢,但处理本身也较快。所以我想你会看到当图像尺寸变大时,像素弯曲过滤器最终会变得更有效。或者也许PixelBender最适合用于更复杂的图像操作。

    推荐文章