下面有相當容易的功能,可以將圖像平滑地移動到其他位置。它來自遊戲,因此移動球員的圖像+30像素,例如移動地圖+30像素也是。如何使此Javascript功能更快(CPU密集度更低)
問題是所有的工作,除了它的緩慢。在我的現代CPU i7 930 2.8 Ghz其超平滑和快速,但在上網本與1.8 Ghz CPU非常緩慢。此外,在更好的但仍然低端的硬件上,這個功能是滯後的(圖像移動不那麼平滑),並且還需要更多時間來完成相同的移動。
如何讓這個函數減少CPU密集度?
var blokada = 0;
var blokada2 = 0;
function translate(elem, x, y, toff, loff, delay2) {
if (document.getElementById(elem) && blokada == 0) {
blokada = 1;
var elem = document.getElementById(elem);
var left = loff,
top = toff,
dx = x,
dy = y, //top - y,
i = 1,
count = delay2,
delay = delay2 * 2;
function loop() {
if (i >= count) {
blokada = 0;
return;
}
i += 1;
elem.style.left = (left - (dx * i/count)).toFixed(0) + 'px';
elem.style.top = (top - (dy * i/count)).toFixed(0) + 'px';
setTimeout(loop, delay);
}
loop();
}
}
function translate2(elem, x, y, toff, loff, delay2) {
if (document.getElementById(elem) && blokada2 == 0) {
blokada2 = 1;
var elem = document.getElementById(elem);
var left = loff,
top = toff,
dx = left - x,
dy = top - y,
i = 1,
count = delay2,
delay = delay2;
function loop() {
if (i >= count) {
blokada2 = 0;
return;
}
i += 1;
elem.style.left = (left - (dx * i/count)).toFixed(0) + 'px';
elem.style.top = (top - (dy * i/count)).toFixed(0) + 'px';
setTimeout(loop, delay);
}
loop();
}
}
translate2('player', x, y, 120, 120, 10); //5
translate('map3', x, y, 0, 0, 10);
嘗試使用'Math.round()'或'| 0「(如果你不關心正確的子像素舍入)而不是'toFixed(0)'。此外,如果性能問題,則應使用[線性插值](http://en.wikipedia.org/wiki/Linear_interpolation),以便動畫始終採用相同的預定義時間長度(如果用戶計算機速度較慢,它只會在較少的幀中生成動畫)。如果您可以在http://jsfiddle.net或類似網站上重現最小工作版本,您也可以獲得更好的迴應。 – alex 2013-04-21 22:46:18
我認爲這個問題最好在[CodeReview](http://codereview.stackexchange.com/)詢問 – Joseph 2013-04-21 22:56:13
請在閱讀這個問題之前閱讀關於JavaScript優化的文章。有很多簡單的東西可以優化... – plalx 2013-04-21 22:57:48