function update(time) {//update of box2d world
world.Step(
1/60 // 1 / frame-rate
, 3 //velocity iterations
, 8 //position iterations
);
但是我读过,像下面这样定义requestAnimFrame才是正确的方式。
requestAnimFrame = (function() {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(/* function FrameRequestCallback */ callback, /* DOMElement Element */ element) {
window.setTimeout(callback, 1000/60);
};
})();
requestAnimFrame不能给我一个恒定的帧速率,导致我的Box2D变量不同步。
这个问题有解决方法吗?
[编辑]
当实现John的(Cutch)解决方案时,它看起来像这样:
function interpolate(dt) {
var t = dt/time_step;
body_coordinates = (1-t) * body_coordinates + t * next_body_coordinates;
}
var physicsDt = 0;
function tick() {
var time_now = new Date().getTime();
var dt = time_now - last_time; //Note that last_time is initialized priorly
last_time = time_now;
physicsDt += dt;
clear_the_screen();
requestAnimFrame(tick);
drawEverything();
if(physicsDt >= time_step) {
update();
physicsDt -= time_step;
}
interpolate(dt);
}
请注意,我的物理更新函数会确保设置
next_attribue
。此外,在此之前会调用物理update
,以使物理世界超前1帧。
结果
动画相当流畅,除了那些我可以看到一些非常糟糕的跳跃和随机出现的微小运动的时候。我认为以下问题在解决方案中没有得到解决: ----> 1)
dt
可能会变得大于 time_step
:这将使 dt/time_step
大于1,从而破坏插值方程。当
dt
保持大于 time_step
时,问题会增加。是否有可能克服时间间隔变大于 time_step
的问题?我的意思是,即使我们让世界领先于渲染一帧,如果时间间隔始终保持大于
time_step
,它也不会很快超过那个“领先”帧。
----> 2) 假设dt
比time_step
少1毫秒,那么世界就不会更新那一次。现在进行插值并找到近似位置(比应该在的位置晚1毫秒)。
假设下一次dt
和time_step
没有差异。
现在,考虑到dt
和time_step
相等,将不进行插值。因此,接下来绘制的是世界中的“ahead”帧,对吗?(使用那些方程,其中t = 1
)
但准确地说,渲染的世界应该是之前落后1毫秒的那个位置。
我的意思是,它落后于世界帧的1毫秒不应该消失。
但是用t = 1
,绘制物理世界帧并忘记了那1毫秒。
我对代码或上述两点有误吗?
请求您澄清这些问题。
[编辑]
我学到了这种方法:
通过为每个形状保留单独的缓冲区并在初始化时仅调用一次createBuffer
,bindBuffer
和bufferData
来减少bufferData
调用。
每次刷新屏幕时,我都必须遍历所有形状并在绑定所需形状的缓冲区(使用bindBuffer
)后调用enableVertexAttribArray
和vertexAttribPointer
。
我的形状不随时间而改变。 它们只是各种形状(如多边形、圆形、三角形),从开始到结束保持不变。