请选择 进入手机版 | 继续访问电脑版

 找回密码
 点一下
查看: 2039|回复: 2

关于Vexorian提出的PowerupSentinel[泄露]的分析及修正

[复制链接]
发表于 2011-3-30 10:27:50 | 显示全部楼层 |阅读模式
以下为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依然存在,但我想说的是当你再次移动该物品给拥有英雄物品栏技能的单位时,该物品又再次使用了。
呵呵,大家想想利用这点我们能做到什么?我想对防守类地图有很大帮助吧!
这个比解决泄漏更简单~

评分

参与人数 1威望 +3 收起 理由
希瓦 + 3 不错的演示

查看全部评分

发表于 2011-3-31 12:19:04 | 显示全部楼层
然后我再提一件事,在情况1的前提下,不要执行删除物品动作。这时候,可以使用触发移动物品给拥有英雄物品栏技能的单位,这时候物品再次使用,物品并没消失,Handle依然存在,但我想说的是当你再次移动该物品给拥有英雄物品栏技能的单位时,该物品又再次使用了。

这个头目以前说过,就是同一个书本在不删除的前提下可以给多个单位使用的

书本释放不了倒是从来没注意过……
回复

使用道具 举报

发表于 2011-4-1 14:11:58 | 显示全部楼层
出售书触发事件
触发后,书被动使用。结果仍会留下一个亮点。不得不加个删除物品

而杀死某些物品,物品模型改用其他比如水晶 则死亡的物品模型永远不会消失。

很多东西都在泄漏呢,不然war所占内存就不会排不下来了

呵,醉酒少金的排泄handle
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-4-17 01:27 , Processed in 0.138195 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表