也許你想要的是集中在頁面上發生的一切,並使用requestAnimationFrame做所有的繪圖。所以基本上你將有一個函數/類,它看起來像這樣(你必須原諒我用MooTools的類中的某些風格/語法錯誤,只是以此爲輪廓)
var Main = function(){
this.queue = [];
this.actions = {};
requestAnimationFrame(this.loop)
}
Main.prototype.loop = function(){
while (this.queue.length){
var action = this.queue.pop();
this.executeAction(e);
}
//do you rendering here
requestAnimationFrame(this.loop);
}
Main.prototype.addToQueue = function(e){
this.queue.push(e);
}
Main.prototype.addAction = function(target, event, callback){
if (this.actions[target] === void 0) this.actions[target] = {};
if (this.actions[target][event] === void 0) this.actions[target][event] = [];
this.actions[target][event].push(callback);
}
Main.prototype.executeAction = function(e){
if (this.actions[e.target]!==void 0 && this.actions[e.target][e.type]!==void 0){
for (var i=0; i<this.actions[e.target][e.type].length; i++){
this.actions[e.target][e.type](e);
}
}
}
所以基本上你會使用這個類來處理頁面上發生的所有事情。每個事件處理程序都是onclick='Main.addToQueue(event)'
,或者您希望將事件添加到頁面中,您只需指出它們將事件添加到提示中,然後使用Main.addAction將這些事件指向您希望他們執行的任何操作。通過這種方式,只要畫布完成重繪並在重繪之前,每個用戶動作都會被執行。只要您的畫布呈現出體面的幀率,您的應用應該保持響應。
編輯:忘了「本」在requestAnimationFrame(this.loop)
這是因爲大多數瀏覽器不允許0ms的JavaScript間隔。他們在20ms或者類似的東西上限。 –
這似乎是一個非常糟糕的主意,但也許不適合你的目的。你能告訴我們你正在運行的代碼是不是在做什麼? – hobberwickey
@hobberwickey:它在畫布上渲染圖形,旨在獲得最高的幀速率。 – dragonroot