最近内置japi 增加了一个新的接口 专门排泄魔兽缓存模型的
可以瞬间让魔兽释放出几百mb的内存 降低一些地图内存不足的部分
之后准备做jass的字符串排泄
思路是这样的 先搜索 全局变量 跟 哈希表 排除掉一些有引用的字符串 剩余不存在引用的将进行排泄
要排泄字符串就要弄清楚魔兽的字符串缓存机制是什么样的
相关数据表有
2858 jass的符号表 储存编译jass时的 字符串
2874 字符串数组表 以数组的方式储存 每一个字符串对象元素
287c 字符串哈希表 以字符串哈希值 映射到 一个元素里 该元素记录着2874的数组索引
所以魔兽创建字符串的思路 如下
创建 一个jass字符串
先 访问 2858符号表里 是否有创建过 如果有 则引用
如果没有 则 搜索 287c哈希表里是否有创建过 有则返回 2874表里的 字符串id
如果没有 则从2874里 申请一个数组元素 再构造一个字符串对象 再将字符串id 添加到 287c的哈希表里
所以要排泄字符串 要反过来
需要 先排除掉 2858里的符号字符串
再找到 哈希表移除元素 先将 287c的元素进行移除
再将 2874的 数组 里的一些二叉树元素进行销毁 之后 进行置空
再将 字符串对象进行销毁
理论上如此 其中还需要大量逆向相关代码 遍历变量哈希表 这块已经实现 剩下的需要逆向这几个 表的移除元素 以及构造函数 ~~~ 虽然有点难度 做出来的话 还能再跟魔兽压榨出一些内存~~
可以瞬间让魔兽释放出几百mb的内存 降低一些地图内存不足的部分
之后准备做jass的字符串排泄
思路是这样的 先搜索 全局变量 跟 哈希表 排除掉一些有引用的字符串 剩余不存在引用的将进行排泄
要排泄字符串就要弄清楚魔兽的字符串缓存机制是什么样的
相关数据表有
2858 jass的符号表 储存编译jass时的 字符串
2874 字符串数组表 以数组的方式储存 每一个字符串对象元素
287c 字符串哈希表 以字符串哈希值 映射到 一个元素里 该元素记录着2874的数组索引
所以魔兽创建字符串的思路 如下
创建 一个jass字符串
先 访问 2858符号表里 是否有创建过 如果有 则引用
如果没有 则 搜索 287c哈希表里是否有创建过 有则返回 2874表里的 字符串id
如果没有 则从2874里 申请一个数组元素 再构造一个字符串对象 再将字符串id 添加到 287c的哈希表里
所以要排泄字符串 要反过来
需要 先排除掉 2858里的符号字符串
再找到 哈希表移除元素 先将 287c的元素进行移除
再将 2874的 数组 里的一些二叉树元素进行销毁 之后 进行置空
再将 字符串对象进行销毁
理论上如此 其中还需要大量逆向相关代码 遍历变量哈希表 这块已经实现 剩下的需要逆向这几个 表的移除元素 以及构造函数 ~~~ 虽然有点难度 做出来的话 还能再跟魔兽压榨出一些内存~~