加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flash – 使用PixelBender将位图的大小加倍

发布时间:2020-12-15 07:29:04 所属栏目:百科 来源:网络整理
导读:我有一个关于像素弯曲的性能问题.我想放大许多BitmapData(将它们的大小加倍到新的BitmapData).我是用as3做的,但是想用像素弯曲器来获得更好的性能.在我的机器上,我从像素弯曲机 demonstrations然后as3获得更好的性能. 令我惊讶的是(或编码/理解不好),我在像
我有一个关于像素弯曲的性能问题.我想放大许多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的这篇文章:

A long time ago,back in Flash Player
8 days we had the idea of adding a
generic way to do bitmap filters. Hard
coding bitmap filters like we did for
Flash Player 8 is not only not
flexible,but has the burden of adding
huge amounts of native code into the
player and having to optimize it for
each and every platform. The issue for
us has always been how you would
author such generic filters. Various
ideas were floating around but in the
end there was one sticking point: we
had no language and no compiler. After
Macromedia’s merger with Adobe the
Flash Player and the Adobe Pixel
Bender team came together and we
finally had what we needed: a language
and a compiler.

因此,基本上,Pixel Bender比直接在Actionscript中操作像素更快.它将胜过同等数量的setPixel和getPixel调用.但它不会比播放器本身更快(再次使用相同的算法).

在某种程度上,你要做的就像在PB中写一个发光滤镜.当然,它很酷,如果你对图像处理感兴趣,你可以从中学到很多东西.但是,如果你的过滤器就像原生过滤器一样工作,除了教育目的之外没有多大意义:原生过滤器会更快,而且已经可用,没有额外的代码行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读