前言
War3设计的时候可能没有想到如今的RPG地图的火爆,作为一款RTS游戏来说当初的设计也不会考虑到地图上单位过多的问题(游戏机制有人口限制)。因为在脚本引擎对句柄回收机制这块并没有那么先进(自动回收机制),只是做了个大概,更多需要开发者自己手动去回收,这里就来看看脚本里对于内存回收的逻辑。
环境
Game.dll:126
数据和代码
一直以来很多大型RPG地图在时长超过30分钟后都会有几率产生一个内存不足的崩溃,网上流传的解决办法是改成OPENGL模式,这个只是个治标不治本的方法,因为OPENGL在内存消耗上比D3D小,所以只能多维持一会而已,最终还是会导致内存不足的崩溃。在游戏里一个句柄就代表了一块内存,脚本里创建的句柄没有被正确的释放就会导致的内存泄漏,这才是最根本的原因。
相关汇编代码:
0286CB50 6A FF push -1 申请句柄
0286CB52 68 71B3C602 push Game.02C6B371
0286CB57 64:A1 00000000 mov eax,dword ptr fs:[0]
0286CB5D 50 push eax
0286CB5E 83EC 08 sub esp,8
0286CB61 56 push esi
0286CB62 57 push edi
0286CB63 A1 40E1EE02 mov eax,dword ptr ds:[2EEE140]
0286CB68