我正在开发一个基于JavaScript的多人游戏。目前我已经准备好了基本的服务器、客户端和网络。
之前我遇到一个问题,我的玩家在120Hz屏幕上移动速度比在60Hz屏幕上快。我通过将玩家运动速度乘以“requestAnimationFrame”的deltatime来解决了这个问题。
然而,将动画与逻辑分离是不是更好的解决方案呢?
例如:
//Game loop; Do each 1/60th of a second
setInterval(gameTick, 1000/60);
function gameTick(){
player.handleKeys();
enemies.foreach( (enemy) => {
enemy.update();
});
}
//Draw loop; match to player screen refresh rate
window.requestAnimationFrame(gameLoop);
function gameLoop() {
player.draw();
enemies.foreach( (enemy) => {
enemy.draw();
});
window.requestAnimationFrame(gameLoop);
}
尽管差异可能很微小,但我希望避免使用240Hz的玩家在服务器上“刷屏”并获得比其他玩家更大的优势。
另一方面,对于240Hz显示器,只有4帧中的1帧会处理您的键盘输入,因此可能感觉不够流畅?
我之所以问这个问题是因为这将是一款竞技游戏,因此应该保持平衡。但是,我已经查看了各种来源,并且共识似乎是使用requestAnimationFrame(即使用于逻辑;不仅仅是绘图),尽管我对此表示怀疑,并想知道哪个是正确的(和/或在专业的竞技游戏中使用)。
setInterval
再次强调,对于实际计时并不是那么可靠。由于它共享线程(你的requestAnimationFrame
也是如此),如果计算机不能在单个循环中完成您想要的所有操作,则仍可能会减慢速度。我的 猜测 是尝试创建一个 Web Worker,您的主线程不断更新它,并在单独的线程中具有自己的 - 非常轻量级的 - 时间间隔,以更可预测的方式与用户和服务器交换数据。但这只是一个猜测,我没有直接构建它的经验。 - somethinghere