2010-07-09 3 views
0

Я ищу некоторую помощь, конвертирующую код as3 в код пикселя, чтобы повысить производительность моего приложения.помогите преобразовать этот код as3 в код пикселя.

Этот код as3 выглядит следующим образом. Я просматриваю значения Number bytearray в кусках. Допустим, что длина этого куска была 100 номеров. Я читал 2 числа (влево и вправо) и пытаюсь найти максимальные значения. Числа в моем bytearray - это данные PCM, поэтому их миллионы, и этот код может занять много времени, особенно на низкоспециализированной машине.

Вся цель этого заключается в том, чтобы как можно быстрее отобразить форму волны. Я очень мало знаю об пиксельных гиборах. Я могу в принципе сделать новый файл и создать ShaderJob его во флэш-памяти, но я действительно не зная, как подойти к этому ...

Я предполагаю, что я действительно спрашиваю, как мне пройти pixelbender либо

) а «кусок» чисел и заставить его передать мне назад 2 максимальные значения (левый и правый)

или

в) весь мой ByteArray, и получить 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 - это не подходящий инструмент для этой задачи, поскольку он не поддерживает циклы и, следовательно, не может выполнять поиск по массиву данных, чтобы вернуть вам одиночные значения. Он также не может передавать значения на следующий обработанный фрагмент, что было бы хорошо, так как тогда вы могли бы просто сравнить текущий кусок с ранее найденным максимумом, например, в цепочке ведра.

Вместо этого я рекомендую вам взглянуть на Алхимия и использовать быстрые операционные коды для быстрого поиска по вашим данным. У Joa Ebert и Burak Kalayci есть и вспомогательные инструменты сборки, которые позволяют вам использовать эти коды операций даже без необходимости программирования в C: http://philippe.elsass.me/2010/05/as3-fast-memory-access-without-alchemy/

+0

Я думаю, что моя основная проблема заключалась в том, что было так много расчетов, что основной поток получал повесил трубку, и все остановилось. Если кто-то может показать мне код пикселя, чтобы принять 2 числа и вернуть самый большой, я мог бы попытаться позвонить, вместо того, чтобы делать вычисления в моем цикле chunk и посмотреть, есть ли у любой производительности производительность – dubbeat

+0

, также я считаю, что метод calculatePixel в основном представляет собой цикл. Таким образом, я передаю данные в качестве подобия или представлял собой растровое изображение, которое могло бы сделать трюк? – dubbeat

+0

Опять же, да, пиксельный изгиб запускает ядро ​​по каждому пикселю или векторной записи, которую вы передаете, но каждый раз, когда он запускает код, он не знает о том, что происходит в других пикселях, и он не имеет возможности передавать информацию, кроме для возврата измененного пикселя. Если вы используете Alchemy, этот код может работать в фоновом режиме и не будет блокировать выполнение вашей основной программы. – Quasimondo