gpt4 book ai didi

javascript - javascript 是否有 blit 或 memcpy 命令?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:35:46 25 4
gpt4 key购买 nike

我已经构建了自己的 flip 命令,而且它很慢而且需要很长时间。我想知道 javascript 是否有 blitmemcpy 风格的命令。现在,我正在使用 for 循环逐项检查以进行复制,这需要“永远”。

Here是我的翻转功能的一个例子。我正在运行 3 层,如果是全高则只有 1 层,有 3 个简单的动画和 fps,最高可达 35 FPS。理想情况下,3 层应该以高得多的 FPS 达到顶峰,在我期望的 200+ 范围内。

v:36.8 l0:36.8 l1:57.8 l2:36.8 图层的 FPS 是对其缓冲区的渲染,v 是使用 flip 函数渲染到 Canvas 。 (这些 FPS 来自 Mac 上的 Chrome)

v = the screen update, the main flip function listed below.
l0 = The bottom fire, its a full height layer
l2 = The static noise, its a 1/2 height layer
l3 = The top fire, its a 1/4 height layet

想象一下有 9 层或 10 层,FPS 会像石头一样掉落。在 FF 版本 12 中它已经无法使用......甚至没有两位数的 FPS 率。 Opera 至少是两位数。

v:4.2 l0:4.2 l1:4.2 l2:4.2 (FF 12 OSX)
v:15.5 l0:15.5 l1:15.5 l2:15.5 (Opera latest OSX)

我的翻页功能

flip : function() {
var fps = '';
// Combine the layers onto the back buffer
for (var l = 0; l < this.layers.length; l++)
{
fps += 'l' + l + ':' + this.layers[l].fps.toFixed(1) + ' ';
var layerWidth = this.layers[l].options.width;
var layerHeight = this.layers[l].options.height;
for (var x = 0; x < layerWidth; x++)
{
for (var y = 0; y < layerHeight; y++)
{
var index = (y*this.layers[l].options.width + x)*4;
var r = this.layers[l].buffer[index+0];
var g = this.layers[l].buffer[index+1];
var b = this.layers[l].buffer[index+2];
var a = this.layers[l].buffer[index+3];
if (r|g|b|a != 0) {
this.buffer.data[index+0] = r;
this.buffer.data[index+1] = g;
this.buffer.data[index+2] = b;
this.buffer.data[index+3] = a;
}
}
}
}
fps = 'v:' + this.fps.toFixed(1) + ' ' + fps;
this.$fps.html(fps);

// blit the buffer
this.context.putImageData(this.buffer, 0, 0);

// Calculate fps
var now = new Date;
var thisFrameFPS = 1000 / (now - this.last);
this.fps += (thisFrameFPS - this.fps) / 50;
this.last = now;


var t = this;
setTimeout(function() {t.flip.apply(t);}, this.speed);
}

最佳答案

有一个memcpy.js使用 Typed​Array​.prototype​.subarray()如果可用的话。
browser support is good甚至 IE10 都有 subarray

function memcpy (src, srcOffset, dst, dstOffset, length) {
var i

src = src.subarray || src.slice ? src : src.buffer
dst = dst.subarray || dst.slice ? dst : dst.buffer

src = srcOffset ? src.subarray ?
src.subarray(srcOffset, length && srcOffset + length) :
src.slice(srcOffset, length && srcOffset + length) : src

if (dst.set) {
dst.set(src, dstOffset)
} else {
for (i=0; i<src.length; i++) {
dst[i + dstOffset] = src[i]
}
}

return dst
}

关于javascript - javascript 是否有 blit 或 memcpy 命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10763888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com