【问题标题】:Fast way to process array for waveform rendering处理阵列以进行波形渲染的快速方法
【发布时间】:2012-10-28 19:29:12
【问题描述】:

我的 Web 应用程序有这段代码,我需要一些改进,它以某​​种方式工作,但结果很慢:

这段代码背后的想法是:

  • 函数获取当前缓冲区,然后转置为数组(采样率为50ms)
  • 在每次采样时,必须通过在 updateWave 函数中传递每个元素来呈现数组的元素
  • 对于下一次迭代,再次获取当前缓冲区,但它包含先前的数据(因此不应呈现先前的数据/元素)必须再次呈现新元素。

更新(简化代码)

private String data = "";   
// This function renders the waveform in the page, has been tested to
// render properly and smoothly by passing random double value at 50ms interval    
public void updateWave(String waveValue){
    wave.renderWaveOnFly(Double.parseDouble(waveValue));
}

public final native void waveIt()/*-{   
    var instance = this;
    $wnd._waver = setInterval(function(){
            // Get the current buffer from the flash interface
            // Note it fetches everything in the buffer
            var newData = $wnd.Recorder.audioData().toString();
            var strData = newData.toString();
            var arr = strData.split(',');
            var arrEl = arr.pop();
            instance.@com.mycode.wavegwt.showcase.client.Showcase::updateWave(Ljava/lang/String;)(arrEl.toString());
            //console.log(arrEl);
        }
    ,50);
}-*/;

// This function renders the waveform from math function 
// and the waveform is smooth and the UI is still responsive
public final native void waveItByRandomValue()/*-{  
    var instance = this;
    $wnd._waver = setInterval(function(){
            var arrEl = Math.cos(i++/25) - 0.2 + Math.random() * 0.3;
            instance.@com.mycode.wavegwt.showcase.client.Showcase::updateWave(Ljava/lang/String;)(arrEl.toString());
        }
    ,50);
}-*/;

public native void renderWaveOnFly(Double _data)/*-{
    var data = $wnd.data;
    data.push(_data);
    $wnd._waveform.update({
        data: data
    });
}-*/;

waveIt() 是一个从闪存接口(从麦克风获取数据)读取缓冲区的函数。对于演示,我将麦克风录音机设置为在触发时录制 10 秒,然后在录音开始时waveIt(),10 秒后调用clearInterval($wnd._waver)

这个问题:

  • waveIt() 函数真的很慢,也就是说,运行它时 UI 没有响应并且渲染速度很慢
  • waveItByRandomValue() 相比,waveItByRandomValue() 渲染速度快,并且在运行此函数时 UI 仍然响应

我已经没有如何使这项工作正确的策略了。

要实时查看我的项目,请参阅:http://bitly.com/XGboA1

我也在 Google 网上论坛中解释了更多这个问题:http://bitly.com/SqSZVl

【问题讨论】:

  • 您能否使用插值算法来加快波形处理速度。我之前成功地使用心率波形完成了此操作。
  • 你是在开发模式下测试还是使用编译好的 JS?开发模式的性能很差,在调用 JSNI 时更是如此,因此请务必仅在生产模式下测试性能。
  • @wvxvw 我使用的 Flash 库已经编译了,我从第三方源获取。即使我在 Flash 中处理数组,问题实际上是将数组输入波形发生器“updateWave”的速度问题
  • @wvxvw 我的意思是问题是来自 $wnd.Recorder.audioData().toString() 的数据随时间增长,问题是我的'setInterval'解决方案不是那么自然
  • @ColinAlworth 我正在开发模式和编译的 JS 中进行测试,编译版本是这样的:bitly.com/XGboA1 虽然我的想法是它至少应该在开发模式下工作,因为推送随机值进入'updateWave'在开发模式下渲染足够平滑,真正的交易是用我从闪存获得的实时数据替换随机数据

标签: java javascript algorithm gwt


【解决方案1】:

这可能是解决方案的一部分,类型化数组:

http://www.html5rocks.com/en/tutorials/webgl/typed_arrays/

【讨论】:

    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多