我正在寻找使用回滚网络代码构建一个浏览器多人游戏,该网络代码在客户端上运行确定性模拟。在遇到浮点路障之前,我已经在Flash中对网络代码进行了原型设计。
基本上,根据我的理解,Flash中的整数数学运算是通过将int
转换为Number
来完成数学运算,然后转回int
。它显然更快,但这意味着不可能在不同的计算机体系结构中进行确定性数学运算。
在我将所有鸡蛋放入JavaScript篮子之前,我想问几个问题。
JavaScript中所有主流浏览器都有真正的整数运算吗?或者某些浏览器是否会执行Flash操作并转换为浮点数/双精度数以便在转换回int之前进行数学运算?
BigDecimal
或BigNum
之类的内容适用于不同计算机架构的确定性数学运算吗?只要在合理范围内,我不介意一些性能损失。如果没有,是否有一些解决我的问题的JavaScript定点库?
这是一个很长的镜头,但是有一个HTML5 2D游戏引擎,它具有像x / y位置和碰撞这样的东西的确定性数学运算吗? game engines的清单至少可以说是压倒性的。我对从头开始构建一个确定性的跨浏览器兼容引擎感到不安,但这可能是我必须要做的。
注意:根据回复从HTML5编辑到JS。为我缺乏知识而道歉。
答案 0 :(得分:6)
这是一个Javascript问题 - 而不是HTML5问题。
所有Javascript数学都是使用IEEE754浮点double
值完成的 - 没有“整数”。
虽然IEEE754要求(AFAIK)针对任何给定输入的每个操作的特定答案,但您应该知道JS解释器可以自由地优化表达式,循环等,这样浮点运算实际上不会在你期望的顺序。
在程序过程中,可能会导致在不同的浏览器上生成不同的答案。