帧同步,浮点计算不一致问题研究

确实,明明场景都没改动,但是这节点的小数值每次打开编辑器都会变

好大的恶意啊,,

这个wasm的是需要自己额外引入库还是引擎打包的时候选择wasm打包就自动处理好浮点数的精度问题呢?

应该是打成wasm就处理好了精度问题,跑wasm的底层是按照规范来的。不过里面只能保证四则运算,其他的三角函数类的最好用个固定的库。
cocos引擎自己API里面可能用的系统库比较多,可能挺难保证的。纯自己写的wasm的库应该可以保证。

1赞

还需要自己去写wasm库么,这方面文档好像也没,完全不知道该怎么去写这个库

ECMAScript 2015 Language Specification – ECMA-262 6th Edition (ecma-international.org)

使用Math库中 acos, acosh, asin, asinh, atan, atanh, atan2, cbrt, cos, cosh, exp, expm1, hypot, log,log1p, log2, log10, pow, random, sin, sinh, sqrt, tan,tanh 函数会调用C库中的实现 (大概因为性能原因) 每个平台的实现不一样

如果这样可以自己尝试实现数学库 我试了一下 在 不同平台基础数学 + - * / … 没有出现不一致的问题 我刚刚尝试自己实现一个Sin函数 在不同平台试了一下 输出是一致的

IOS
43a962ded690e963cd6f64fcd123a3a
Chrome
image
Firefox
image
Node

测试地址:计算测试

3赞

不错先收藏

如果纠结性能 可以尝试只替换数学库

常用三角函数的纯js实现

我在做unity的时候我看他们确定性库的数学库 的sin直接就是 本地用math.sin跑好几个结果导出cs代码 用的时候通过传值找到结果 不是直接算出来的 这样性能也会高很多

我感觉你也可以弄成这样

也是个思路

npm不香?stdlib现成的

啊嘞 我…当时不知道这个库 所以直接找文心一言生成代码

1赞

浮点数不一致性的根源是cpu硬件差异,你在同一台电脑上测不同浏览器是不行的。。。。。。。。。

wasm确实在努力确保一致性,但是还是不能完全保证。 应该还是不能用于帧同步,话说回来,定点数库也不难实现。 三角函数查表就行。

lz 是测了苹果,安卓,电脑,才有这个猜想的。
wasm肯定不能完全保证一致,但是我那个贴只是分析wasm的细节,哪些地方是一致的,哪些地方不一致。一致的地方用就行,不一致的地方用确定的方式弄成一致就可以了。

对于硬件差异的不确定性,其实可以避免,这点wasm在规范上说做到了:
1.所有硬件都遵守浮点IEEE-754规范,并且给他们设定了同样的精度和round模式。
2.wasm也可以算一个虚拟机。虚拟机在字节码和执行方式一样的情况下,确定性容易实现。

2赞

我在网上找的种子随机数在不同平台下有时计算结果不一致,把华为的联机对战引擎里的种子随机数源码拿过来,从没出现计算结果不一致的情况。

要说最牛逼的,不得不说UE,号称全平台计算结果一致

哦哦哦哦哦哦 哈哈哈哈你不是LZ。。。。。SORRY