我之前做了几次我称之为纯JavaScript的等离子演示:
这个想法是使用2个振荡器(LFO),它们的频率+相位由两个振荡器驱动。然后我们用这两个主振荡器输出来决定每个点的r,g,b。
为了测试相当新的API asm.js,我已将其移植到完全“键入”状态'并完全记忆隔离。
我遇到的一个大问题是使用asm.js比使用普通JavaScript更慢。更糟糕的是:当我发表评论时,请使用asm'让浏览器解释代码,我得到比编译成功时更好的结果(快30%)。
我使用的内存是:
putImageData
的输出。 float
数组,用于存储LFO的值(基数/幅度/频率/相位),用于6 LFO。我已经制作了两个版本,一个是fp32,另一个是fp64,其中没有一个是快速的(当普通对象版本大约20ms时,每帧<50毫秒)。
请务必使用能够理解asm.js的浏览器,Firefox就是其中之一。
经过实验,花了很多时间来评估LFO值:
function oscillatorValueAt(heap_f64_Index, x) {
heap_f64_Index = heap_f64_Index | 0;
x = +x;
var base = 0.0,
amp = 0.0,
freq = 0.0,
phase = 0.0;
heap_f64_Index = heap_f64_Index << 3;
base = +heap_f64[(heap_f64_Index + 0) >> 3];
amp = +heap_f64[(heap_f64_Index + 8) >> 3];
freq = +heap_f64[(heap_f64_Index + 16) >> 3];
phase = +heap_f64[(heap_f64_Index + 24) >> 3];
return +(base + amp * sin(freq * x + phase));
}
在tickPixels子中,每个像素调用几次,调用如下:
vaty = +oscillatorValueAt(osc1, yD);
你能帮助我找出为什么没有提速吗?