服务器端NodeJS中requestAnimationFrame()的实现

Han*_*lse 10 javascript client node.js server

关于广泛使用的requestAnimationFrame()函数,我有一些问题.最近我在多人游戏中遇到了一些在客户端而不是服务器端使用它的实现.

  1. 这样做有什么好处吗?
  2. 你能引用我在NodeJS中的任何"最佳实践"服务器端实现吗?

更新

我在动画和游戏循环之间有点混淆 - 我正在寻找的是NodeJS中的实现=>例如setInterval.

示例 - 客户端实现

(function () {
    var lastTime = 0;
    var vendors = ['ms', 'moz', 'webkit', 'o'];
    for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
        window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
        window.cancelAnimationFrame =
            window[vendors[x] + 'CancelAnimationFrame'] ||
            window[vendors[x] + 'CancelRequestAnimationFrame'];
    }

    if (!window.requestAnimationFrame)
        window.requestAnimationFrame = function (callback, element) {
            var currTime = new Date().getTime();
            var timeToCall = Math.max(0, 16 - (currTime - lastTime));
            var id = window.setTimeout(function () {
                callback(currTime + timeToCall);
            }, timeToCall);
            lastTime = currTime + timeToCall;
            return id;
        };

    if (!window.cancelAnimationFrame)
        window.cancelAnimationFrame = function (id) {
            clearTimeout(id);
        };
}());
Run Code Online (Sandbox Code Playgroud)

}());

Ben*_*aum 9

这样做有什么好处吗?

在客户端 - 有.虽然setTimeout它的朋友在计时器队列中运行 - requestAnimationFrame同步到浏览器的页面渲染(绘制它),所以当你使用它时没有抖动,因为你告诉它绘制什么和浏览器绘图是同步的.

通常游戏有两个循环 - 渲染循环(绘制内容)和游戏循环(事物的逻辑).第一个在a中requestAnimationFrame,另一个在a中setTimeout- 两者都必须非常快.

以下是Paul Irish 对requestAnimationFrame的参考.

你能引用我在NodeJS中的任何"最佳实践"服务器端实现吗?

由于服务器不呈现任何图像 - requestAnimationFrame服务器中的填充没有任何意义.您将setImmediate在Node/io.js中使用requestAnimationFrame您在客户端中使用的内容.

简单地说 - 添加了requestAnimationFrame来解决服务器中不存在的问题(图形数据的无抖动渲染).