【发布时间】: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