私は自分のflip
コマンドを作成しましたが、それは遅く、永遠にかかります。blit
javascript にormemcpy
スタイル コマンドがあるかどうかを知りたいです。現在、forループを使用してアイテムごとにコピーを行っていますが、「永遠に」かかります。
これが私のフリップ機能の使用例です。私は 3 つのレイヤーを実行しています。全高の場合は 1 つだけで、3 つの単純なアニメーションと fps が約 35 FPS に達しています。理想的には、私が期待する 200+ の範囲で、はるかに高い FPS で 3 レイをトップアウトする必要があります。
v:36.8 l0:36.8 l1:57.8 l2:36.8 レイヤーの FPS はバッファーへのレンダリングであり、v はflip
関数を使用したキャンバスへのレンダリングです。(これらの 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 では、すでに使用できません... 2 桁の FPS レートでさえありません。Opera は少なくとも 2 桁です。
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);
}