问题是这样的:
在基于 js 和 asm.js 的多人游戏中,我有两个循环。
一个处理实际的游戏时间,例如单位位置、速度和战斗。
另一个将这个世界渲染到画布上供用户查看。
我想要发生的是当处理器/GPU(他们现在在某些机器上做了同样的事情,不能说我对此感到高兴)受到太多的阻碍时,渲染循环应该跳过并因此停止改变帆布。即在延迟派克中冻结游戏屏幕。
同时,剩余的少量处理能力用于成功完成实际的游戏滴答,防止与其他游戏客户端不同步。
(在加载时这是一个类似 RTS 的游戏,因此用户输入而不是所有对象的位置都通过网络发送)。
否则,客户端将不得不被其他客户端踢掉,否则所有客户端都必须暂停让他重新连接和重新同步。即坏坏坏!
一种草率的临时方法可能是使用时间戳并在图形循环在特定时间之前无法完成时终止图形循环。可以通过确定循环堆栈上数据包类型的最大执行时间来做到这一点,如果所有数据包的“执行时间值”在一起太大而无法在时间戳的资源容量内处理,则立即终止循环通过减速测量来指示。地狱,也许这是激进的,但甚至可能在检测到任何减速时跳过终止图形循环,以确保避免不同步。
因此,将一个循环优先于另一个循环(两个处理滴答声)并在检测到资源短缺时跳过第二个循环,以确保第一个循环始终在每个时间范围内完成它的滴答声(此处为每秒 10 个滴答声)。
你们可以告诉我任何可能性或最佳实践方法吗?
编辑:如果这些资源不足以完成两个循环(即如果循环不会在 100 毫秒后完成下一个循环滴答应该已经触发,不要开始/终止图形循环)。