老胡 发表于 2016-1-7 11:09:48

如何解决脚本卡(掉帧)的问题

本帖最后由 老胡 于 2016-1-7 11:21 编辑

方法是追悼教的,主要群里依然很多人不解,所以发个帖子。
一、msGetUnits
导致你脚本掉帧最主要的原因是滥用msGetUnits这个函数,该函数的作用是获取一定范围内的目标,如果多用几次肯定脚本很卡,所以你需要遵循一个原则,只有在必要的情况下才使用msGetUnits。

有几个方法:

1、尽量把msGetUnits放到后面。脚本是从上到下执行的,很多人喜欢把msGetUnits放在最开头的变量定义里面,这样每次执行脚本时就会首先执行msGetUnits,其实很多时候是不必要的,比如下面这个例子中,后面加了非战斗状态不做任何动作,但是msGetUnits仍然被执行,这时就应该把msGetUnits放到后面,减少执行次数。
local _tar2table= msGetUnits(false,false,30,_me)--30码内敌对目标

--不进战斗不启动
if UnitAffectingCombat("player") == false then
    return
end

2、尽量少用msGetUnits。能少用就少用,例如下面这个例子,第一行是获取30码内的敌对目标,第二行是获取8码内的敌对目标,看似无可厚非,但是你用了两次msGetUnits,而第二次的msGetUnits完全可以用msFindUnit("msGFD(unit)<=8",_tar2table,true)来代替。
local _tar2table= msGetUnits(false,false,30,_me)--30码内敌对目标
local _tartable3 = msGetUnits(false,false,8,_me) --8码内敌对目标

二、使用变量
例如简单的获取自己血量,msGHP("player"),在一个脚本中通常要使用很多次,建议只获取一次,放在变量中
local _my_hp_level=msGHP("player")
哦,变量请使用local,非必要情况下不要使用全局变量。

三、使用return
很多情况下,我们的脚本是不需要每次都从头执行到尾的,例如青山脚本中,有一个不打断自身施法
if msICS("player","*") then
    return
end青总把这个放在前面,如果发现自己在施法就return了,后面的600多行代码直接跳过,虽然不加判断很多时候也不会乱放技能,但是后面执行的一堆代码并没有意义,他影响了你脚本的执行效率,也就是掉帧。

印象 发表于 2016-1-7 13:44:05

这些问题应为监视的多了是无法避免的

Cassiel 发表于 2016-1-7 13:53:39

学习了,偶没事来逛逛~:)

青山 发表于 2016-1-7 14:58:32

追悼者 发表于 2016-1-7 12:12
我也来说说我的经验给予补充.




事实上,不知道为什么,我每次使用msfu函数都会出现未知错误,导致后来,我就干脆放弃不用,自己写判断条件了

老胡 发表于 2016-1-7 16:58:59

追悼者 发表于 2016-1-7 15:59
使用方法不对吧,下次可以把你写的脚本及错误内容给我看看。

这个,应该就是青山说的,我正好在看,我看他也是把msfindunit注释了,自己写了循环

--local _tartable3 = msFindUnit('UnitAffectingCombat(unit) and UnitExists(unit) and UnitCanAttack("player",unit) and not UnitIsDeadOrGhost(unit) and UnitIsVisible(unit)~=nil',_tartable3_1,true) --8码内存在的目标
local _tarnum
if _tarnum == nil then
   _tarnum = 1
end
--求8码内敌对目标数量
if _tartable3 ~= nil then
   for i=1,#_tartable3 do
      if UnitAffectingCombat(_tartable3) and UnitExists(_tartable3) and UnitCanAttack("player",_tartable3) and not UnitIsDeadOrGhost(_tartable3) and UnitIsVisible(_tartable3)~=nil then
         _tarnum = _tarnum + 1
      end
   end   
end

墨水 发表于 2016-1-7 20:53:44

好高端,不明觉厉~~~            

老胡 发表于 2016-1-7 21:29:12

本帖最后由 老胡 于 2016-1-7 21:30 编辑

追悼者 发表于 2016-1-7 20:19
_tartable3_1是表才行,看他上下文,_tartable3_1只是一个目标
local _tartable3_1 = msGetUnits(false,false,8,"player")他是这样写的,感觉并没有问题

脚本地址是:http://www.luacn.net/thread-11705-1-1.html

醉骚 发表于 2016-1-16 22:35:38

我说下我的用法全脚本只做一次目标获取
local result = msGetUnits(nil,nil)--获取周围目标

剩下 需要用到目标的时候 把result 拿出来判断一下就可以用了   人/宠物/物体都获取到了何乐而不为

饼干 发表于 2016-3-17 18:32:43

学习了,虽然一直没学会:lol

撸啪啪 发表于 2016-4-17 10:24:18

此贴营养丰富。学到不少{:5_255:}
页: [1] 2
查看完整版本: 如何解决脚本卡(掉帧)的问题