|
希望大大们能够将这篇文章看完!
众所周知,用缓存做技能有string的泄露,,(用马甲确认了一下的....)。说来string 的泄露要产生对机器运行产生影响的话,主要泄露来源就应该是技能,游戏里无限使用且大量运行的一般是技能,只有技能的华丽的堆积,才会产生大量垃圾!解决这个问题当然有hash,strcut等其他方法,但是这些方法又有多少新手知道呢?所以以下就谈谈returnbug吧
前面某大的一张帖子提到了指针算法.
代码:[jass]function H2I takes handle h returns integer i
return h
return 0
endfunction
//初始化是执行以下代码
function start takes nothing returns nothing
local location l=Location(0,0)
set udg_starti=H2I(l) //udg_starti 是定义好的整数全局变量,在后文中,这个变量称为 指针减量。
call RemoveLocation(l)
set l=null
endfunction
//如果以下出发要用到缓存 ,例子里用timer代表
function test takes nothing returns nothing
local timer t=CreateTimer()
local string s=I2S(H2I(t)-udg_starti)
............ //一些华丽的储存。。
set t=null
set s=null
endfunction[/jass]
虽然这样做的好处在于:把巨大的指针得到的整数减小到极小的整数(2位甚至1位),极大的减少了字符串长度,当然也缓解了泄露,但是这个方法治标不治本。如果游戏时间一长,必然还是会产生严重的泄露。
怎么解决呢,下面我谈谈我的做法。
我们可不可以这样做?
用一个全局整数变量(这里我用udg_int,初始化时为0),
在每个技能开始运行时:set udg_int = udg_int + 1.
每个技能结束时运行:set udg_int = udg_int - 1 .
要知道,在整个游戏过程中,总是有休息的时候,不可能一直有人在放技能,所以只需周期检测udg_int的值。
如果udg_int=0,则说明地图中没有任何技能在释放过程中,这个时候再执行一次以下代码:
[jass]function start takes nothing returns nothing
local location l=Location(0,0)
set udg_starti=H2I(l) //udg_starti 是就时 上文中提到的 指针减量
call RemoveLocation(l)
set l=null
endfunction[/jass]
这个代码的作用相当于重置了 指针减量,使得用指针算法得到的整数又重新开始。而且重复利用了之前用I2S产生的字符串。
事实上以上的方法对于用returnbug+timer+gamecache做技能造成的泄露控制在一个相当有限的程度上。对于现在电脑的配置
来说,这小的泄露量几乎已经可以不算泄露了。。而且方法简单,只要会用jass就一定会用这个方法。
the end |
评分
-
查看全部评分
|