升级64位后,一直有这样一个问题被卡壳:就是系统运行时间GetTickCount()的计算问题。
由于原来32位的时候,这个数值是DWORD类型,大概运行49.7天左右,就会达到最大值,在控制台就会出现警示提示。
代码里,客户端和服务端都大量使用这个函数,用来做心跳时间和时间差计算,想全部改成支持几乎无限时间的GetTickCount64(),改的地方太多太多了,很多数据类型和函数参数都要全部改。因此,一直不敢碰。
前几天,看到有几个独立在函数内部的GetTickCount()函数和变量,不影响全局运行,于是顺手改了一下。
改了一些后,发现没什么大问题。于是,心一硬,接着改其他的。后来,发现越改越麻烦,越改关联的地方越多,已经无法暂停,暂停就彻底无法正常运行了。
硬着继续改,改了客户端,继续改服务端。
如此反复,改了好多次,发现还有很多地方变量类型不兼容的。
改完了,编译运行,幸好,能进去游戏,但是发现计时混乱了,技能无法使用,怪物移动会被卡住。
找了很久,都无法找到原因。最后,实在没办法,只好让动用AI去扫描整个项目的C++代码,找出有问题的代码。
其实AI也无法精确定位,不过幸好给出一些类型不匹配提示和转换类型后的计算结果错误的提示。跟着这些提示,又改了一些。
抱着死马当活马医的心态,又编译跑了一下,发现时钟恢复正常了,怪物走动也正常了。
我大概看了下,应该是ULONGLONG和ULONG之间的运算和转换出现问题的。
估计用人工排查的话,不知道何年何月的事情,这种重复繁琐的,还是用AI辅助扫描代码,更容易修正一些潜在不容易发现的问题。
目前,暂时能正常运行了,希望不会再有其他问题了。
如果改动成功的话,服务器就可以长年运行不用重启,也不会报这个时钟错误的问题了。