推荐地图:火影无级别混战推荐地图:楚汉争霸推荐地图:魔神推荐地图:人族无敌II
推荐专区:技能创作区推荐专区:WE讨论区推荐专区:模型作区推荐专区:申请公告区
发新话题
打印

教程:手把手教你如何解决内存泄漏

本主题由 jiwalv 于 2008-2-8 15:10 关闭

教程:手把手教你如何解决内存泄漏

教程:手把手教你如何解决内存泄漏
前两天我转的“记忆体遗失(内存泄漏)”很多人反映看不懂,也有很多人都没看完。。。
不过不要紧,我在这里写个非常简单的,只要你能看完就保证你明白!好了,下面开始讲了~

一.热身
     甚么叫做内存泄漏呢?先举个例子:有一个空的书架,我们要往上面放些需要看的书,随着我们放的书一本本的增多,书架的可用空间自然要减少,当书架全部被放满书的时候我们怎末办呢?当然是要把以后不会在看的书拿走,腾出空间,以便继续放上其他的书,这个“腾出空间”的操作就是我们下面将要学习的内容。(你不会刚热完身就跑了吧?)

------------------------------------------------(邪恶的分割线)----------------------------------------------------

二.目标锁定
     上面所说的“书”在这里我只讲2种:点和单位组。这两种是最容易引起内存泄漏的东西,而将他们置之不理的后果就是游戏速度愈来愈慢(卡),最后导致弹出游戏,所以我们必须要对他们进行处理!

     下面举例:

                           no.1
      
                           事件:任意单位使用技能
                           条件:使用的技能=风暴之锤
                           动作:单位-立即移动触发单位到(技能释放目标的位置  )   


                           no.2

                          事件:任意单位使用技能
                          条件:使用的技能=沉默                          
                          动作:单位组-选取(以(触发单位的位置)为圆心,256为半
                                     径)内的所有单位组动作      

                          
    以上红色字体显示的就是会出现泄露的地方,我们要对这些地方进行修改。(下面的不看等于没用)


------------------------------------------------(邪恶的分割线)----------------------------------------------------


三.处理办法
    具体的处理办法很简单,就是先用一个变量记录它,然后使用完毕后再清除那个变量即可。这里所说的变量是全局变量,是事先设置好的,由于我们不会jass定义局部变量,所以就用全局变量。

    点类型:


                no.1

               事件:任意单位使用技能
               条件:使用的技能=风暴之锤
               动作:设置unit=技能释放目标
                          设置dian=(unit的位置)
                          单位-立即移动触发单位到(dian)  
                          点-清除(dian)   
                          设置unit=没有单位

注意:极坐标点会产生更多的泄露,如:单位-立即移动触发单位到(从触发单位的位置开始,距离256,方向为触发单位的面向角度)这里产生了2个点泄露。


               no.2

               事件:任意单位使用技能
               条件:使用的技能=风暴之锤
               动作:设置unit=技能释放目标
                          设置dian=(unit的位置)
                          设置dian2=(从(dian)开始,距离256,方向为unit的面向角度)
                          单位-立即移动触发单位到(dian2)
                          点-清除(dian)
                          点-清除(dian2)
                          设置unit=没有单位

注意:在设置dian2的时候,不能写成“设置dian2=(从(技能释放目标的位置)开始,距离256,方向为unit的面向角度)”,因为这样又会造成泄露。


               no.3

              事件:每0.01秒的时间
              条件:无
              动作:设置dian=(unit的位置)
                         设置dian2=(从(dian)开始,距离256,方向为unit的面向角度)
                         单位-立即移动unit到(dian2)
                         点-清除(dian)
                         点-清除(dian2)

注意:当变量所记录的点发生改变时,需要从新定义.在循环中和时间事件中,需要反复进行清除操作.


    单位组类型:

对于单位组的移除,最偷懒的方法是用自定义代码: set bj_wantDestroyGroup = true
bj_wantDestroyGroupBlizzard.j里的一个全域变数,预设为false。在执行Blizzard.j中和Unit Group有关 的函数时,会先检查bj_wantDestroyGroup,决定是否移除传入的Unit Group,然后自动把bj_wantDestroyGroup 还原为 false


            no.1

            no.2

                          事件:任意单位使用技能
                          条件:使用的技能=沉默                          
                          动作:设置unit=技能释放目标
                                     设置dian=(unit的位置)
                                              自定义代码: set bj_wantDestroyGroup = true
                                     单位组-选取(以dian为圆心,256为半
                                     径)内的所有单位组动作      
                                     ..............(动作)
                                    点-清除(dian)
                                    设置unit=没有单位

注意:当遇到单位组-选取XX类型的单位做动作时,不能使用以上方法,因为会导致不能真正选出所要单位的错误。当然,在循环中和时间事件中,同样也需要反复进行清除操作.


------------------------------------------------(邪恶的分割线)----------------------------------------------------


好了,先讲到这里吧,相信你看到这里的时候,已经了解并掌握如何解决基本的内存泄漏问题了。当然,不只是点和单位组能造成泄漏,玩家组、定时器........都可以造成泄漏!如果想要更深一步学习,就要去看http://bbs.wow8.org/thread-43879-1-1.html吧。
本帖最近评分记录
  • asd7586 力量 +40 精品文章 2007-12-23 14:09
  • asd7586 敏捷 +40 精品文章 2007-12-23 14:09
  • asd7586 智力 +40 精品文章 2007-12-23 14:09
邪恶的沙发~~~

邪恶的一顶
生命不在乎得到什么,只在乎做过什么——黄家驹
我是鬼组织的邪恶组员,邪恶的答复!~我不想看,看起好烦,又看不懂
CF湖南二区(_Sxe灬战队募集战员,是本区想加入战队的进群:69598377
≮WOW8的祝福≯

饿~都写得折磨通俗了还不懂。。。
引用:
原帖由 qq490456661 于 2007-12-23 10:43 发表
我是鬼组织的邪恶组员,邪恶的答复!~我不想看,看起好烦,又看不懂
做为鬼组织的邪恶组员,你最好是看得懂,用得上!
同人技能不排泄,oh~~卖糕的
生命不在乎得到什么,只在乎做过什么——黄家驹
我懂得很熟得很,邪恶的讲解!!!!!!!

你还不懂.........................................
我实验过不理世露,越玩越卡,,,,我就排了他们就好了!!!!

TOP

做完记得要清点!!!

TOP

回复qq490456661

(清点变量)这条触发!!,别说没见过!!!

TOP

这回看的很清楚

TOP

请LZ把手拿出来,然后放在我的手上,再开始教我




蹉(Chuó)宅
怨念啊.

TOP

邪恶的看过,邪恶的路过……

TOP

收藏 并 弄到  WE区把

TOP

引用:
原帖由 jiwalv 于 2007-12-23 09:52 发表
教程:手把手教你如何解决内存泄漏
...
点类型:


                no.1


               事件:任意单位使用技能
               条件:使用的技能=风暴之锤
               动作:设置unit=技能释放目标
                          设置dian=(unit的位置)
                          单位-立即移动触发单位到(dian)  
                          点-清除(dian)   
                          设置unit=没有单位

  ...
个人认为,这个可以省略设置unit变量的语句,直接用设置dian=(技能释放目标的位置)就可以了。
个人意见,不对别笑我。

TOP

学到了。。。一直不懂。。。

TOP

非常好,又学到一点 ( bj_wantDestroyGroup =true )

恩 我也同意13楼说的那个。
多族地图

火既然能带来温暖和光明,也能带来毁灭。

——魔法师梅林







TOP

顶,收藏拿回去仔细研究。

TOP

写的好清楚吖~~~~ 但是我都没看懂~~~~~~~~

TOP

引用:
原帖由 yxxiaobin 于 2007-12-23 17:13 发表

个人认为,这个可以省略设置unit变量的语句,直接用设置dian=(技能释放目标的位置)就可以了。
个人意见,不对别笑我。
恩,没错,不过基本上所有T技能都需要定义触发单位的。

TOP

发新话题