|
以下为Vexorian的原解决方案
[Zinc][库][Vexorian][泄露]PowerupSentinel
Credits:
Vexorian
library PowerupSentinel
[jass]//! zinc
/*
* PowerupSentinel
* ------------
* Placing this library in your map will automatically fix all rune/tome
* memory leaks in your map.
*
* Powerup items don't get removed automatically by the game, they instead
* just leave a small item in the map, this caused memory leaks but - worse -
* it also makes areas of your map where a lot of tomes have been used lag a lot.
*
*/
library PowerupSentinel
{
function onInit(){
trigger t = CreateTrigger();
TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_DROP_ITEM);
TriggerAddCondition(t, function()->boolean {
if (GetWidgetLife(GetManipulatedItem())==0) {
RemoveItem(GetManipulatedItem());
}
return false;
});
}
}
//! endzinc[/jass]
关于Vexorian提出的PowerupSentinel,我昨天特意翻阅了GA一些资料并亲自
测试了一下验证。得出以下测试结果及解决方案。
情况1.创建力量提升类物品【经验之书A】,英雄吃掉【经验之书A】
——无法删除【经验之书A】,Handle被占用无法释放。
情况2.创建力量提升类物品【经验之书B】,无单位使用
——可以删除【经验之书B】,Handle被占用无法释放。结论:每创建一个力量提升类物品都会造成一个Handle泄漏,如果创建后的物品被单位使用后无论是否删除,都会造成一个Handle泄漏和物品泄漏。
从这个结论来看,Vexorian的那个库函数不能解决泄漏问题。原因很简单,触发事件为任意单位丢弃物品,判断生命为0的时候删除物品。而这么做仍然造成情况1的发生。
那么如何才能解决这个囧BUG呢?
昨天我还做了这么一个测试。
无论情况1,2。先执行RemoveItem(),然后用触发再把执行过删除动作的物品给拥有英雄物品栏技能的单位。
这时候神奇的一刻发生了,物品再次使用——物品消失——Handle释放。
那么我想解决方案大家都已经有思路了吧。
然后我再提一件事,在情况1的前提下,不要执行删除物品动作。这时候,可以使用触发移动物品给拥有英雄物品栏技能的单位,这时候物品再次使用,物品并没消失,Handle依然存在,但我想说的是当你再次移动该物品给拥有英雄物品栏技能的单位时,该物品又再次使用了。
呵呵,大家想想利用这点我们能做到什么?我想对防守类地图有很大帮助吧!
这个比解决泄漏更简单~ |
评分
-
查看全部评分
|