[开发者心得] 【大数值问题处理】

[复制链接]
18 |0
空伊伊 发表于 昨天 10:51 | 显示全部楼层 |阅读模式
本帖最后由 空伊伊 于 2024-12-21 10:51 编辑

大数值问题处理

由于我在游戏开发初期,没有提前注意数值大小,当玩家的数值超过取值范围限制的时候,就出现了下面视频所示的问题。(具体表现就是,弹出的数字,以及生命值和战力的计算中,出现了负数)


问题产生原因分析
原因一:取值范围超限
在TypeScript中,当number类型数字超过2的53次方的时候,便会提示你已经超过了number类型的取值范围,此时再打印数字,便会采用科学计数法,如下图所示。
image.png

原因二:RPC无法正确传递大数值
我编写了一个名为 calculation 的函数对大数值进行计算和打印,然后分别在客户端和服务端进行了调用,结果如下图所示:
image.png
客户端结果:直接在客户端给 calculation 函数传入大数值,结果显示正确。
服务端结果:由客户端将大数值通过RPC发送给服务端,然后再由服务端执行 calculation ,结果显示错误。
所以问题的主要原因就在于这里,大数值在经过RPC的传递后,会变得完全错误


解决方案
方案一:先将大数值转换为string类型,然后再进行RPC
image.png
如图所示,在客户端先将大数值转换为string,然后发送给服务端,服务端再将string转换为number进行使用,这样数值就没问题啦~
方案缺陷:
number类型在计算大于2的53次方的数字时,不能够保证精度。(能接受,总比RPC传递后完全错误要好一些吧。。。)

方案二:将数值改为bigint类型
如果你在网上搜索解决方案,多半都会告诉你将number改为bigint。
但是如果你的项目已经上线了,或者项目中已经大量使用了number进行计算,这个时候再来将number替换为bigint,成本是巨大的。
方案缺陷:
bigint不支持浮点运算;
bigint不支持数据存储;
bigint不支持RPC传递;


方案三:使用第三方库
可以参考这篇帖子
https://forum.ark.online/forum.php?mod=viewthread&tid=1759
方案缺陷:
对比方案二,只解决了bigint不支持浮点运算的问题。



回复

使用道具 举报

72小时热榜
4
help
求助与反馈
49人已阅读
5
【排行榜系统】
游戏开发
116人已阅读
热门版块
快速回复 返回顶部 返回列表