2010-07-09 136 views
0

我正在寻找一些帮助将as3代码转换为pixelbender代码,以提高我的应用程序的性能。帮助将此as3代码转换为像素弯曲代码

这个as3代码如下。我扫描块中的一个bytearray的Number值。可以说,这个块长度是100个数字我读了2个数字(左和右),并尝试找到最大值。我的bytearray中的数字是PCM数据,因此有数百万个数据,而且这些代码通常需要很长时间才能执行,特别是在低规格机器上。

这样做的目的是尽可能快地呈现波形。我对像素弯曲机知之甚少。我基本上可以做一个新的文件,并创建它在Flash中的ShaderJob但我真的不确定如何处理这个...

我想我真的问我如何通过pixelbender要么

一)一个数字的“块”,并把它传给我回2个最大值(左,右)

B)我的整个字节组,并得到Pixel Bender的做分块的东西对我来说

var spritePixelIndex:Number=0; 
      var spriteSize:Number; 
      spriteSize=_sizes[_numberOfZoomLevels - 1]; 
      blockSize=Math.floor(_pcmLength/spriteSize); 
       chunksize=blockSize * 100; 


for (var i:int=0; i < chunksize; ++i) 
      { 
       if (_pcmData.bytesAvailable) 
       { 
        var la:Number=_pcmData.readFloat(); 
        var ra:Number=_pcmData.readFloat(); 
        var l:Number=la > 0.0 ? la : -la; 
        var r:Number=ra > 0.0 ? ra : -ra; 

        ++_divCount; 
        var ml:Number=0; 
        var mr:Number=0; 
        var a_ml:Number=ml > 0.0 ? ml : -ml; 
        var a_mr:Number=mr > 0.0 ? mr : -mr; 

        ml=a_ml > (l) ? ml : l; 
        mr=a_mr > (r) ? mr : r; 
       } 
} 

回答

2

Pixel Bender不适合执行此任务,因为它不支持循环,因此无法搜索数据数组以返回单个值。它也不能将值传递给下一个处理过的块,这会很好,因为那样你就可以比较当前块和先前找到的最大值,就像在一个桶链中一样。

相反,我建议您查看Alchemy并使用其快速的bytearray操作码快速搜索数据。 Joa Ebert和Burak Kalayci都构建了帮助工具,可以使用这些操作码,甚至不需要使用C语言编程:http://philippe.elsass.me/2010/05/as3-fast-memory-access-without-alchemy/

+0

我认为我的主要问题是有太多的计算正在进行,主线程正在获取挂断电话,一切都停止了。 如果有人可以让我看看pixelbender代码接受2个数字,并返回最大我可以尝试调用,而不是在我的块循环中进行计算,看看是否有任何性能表现 – dubbeat 2010-07-09 11:38:58

+0

也我认为evaluatePixel方法基本上是一个循环。因此,我将数据作为字节流传递或以位图的形式表示,它可以做到这一点? – dubbeat 2010-07-09 11:46:54

+0

同样,是像素弯曲者在每个像素或向量条目上运行内核,但是它每次运行代码时都不知道其他像素中发生了什么,并且无法传递信息除外用于返回已更改的像素。 如果您使用炼金术,该代码可以在后台运行,并且不会阻止主程序的执行。 – Quasimondo 2010-07-09 12:11:54