找回密码
 点一下
查看: 2795|回复: 6

[已修改]说说returnbug+timer+gamecache做技能

[复制链接]
发表于 2009-3-19 19:08:15 | 显示全部楼层 |阅读模式
希望大大们能够将这篇文章看完!


众所周知,用缓存做技能有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

评分

参与人数 2威望 +11 收起 理由
eff + 10
血戮魔动冰 + 1 不错~~

查看全部评分

发表于 2009-3-19 21:32:08 | 显示全部楼层
尽量少用就好了,呵呵。
回复

使用道具 举报

 楼主| 发表于 2009-3-19 22:13:42 | 显示全部楼层
终于又时间把贴改完了。。[s:186]
回复

使用道具 举报

发表于 2009-3-20 13:22:02 | 显示全部楼层
鼓励研究,不过既然用到指针了那就直接用TimerDataSystem就好了
回复

使用道具 举报

发表于 2009-3-22 15:53:05 | 显示全部楼层
瞄了眼。。。好像和 触发运行次数的原理差不多。。。
回复

使用道具 举报

发表于 2009-3-22 17:36:40 | 显示全部楼层
哎…………虽然说能控制string。你的这个方法……其实和某大(我不知道是谁)的指针法的节省度是差不多的…………但是确实要节省一些。利用了GameCache可用负数+ability特性+初始化特性……
但是你要想好了,如果第二个location是100,而第三个location是99,那就貌似会得不尝失了(貌似也没道理……)
只能说你这个效率太不好估算了……
不过~支持~
回复

使用道具 举报

发表于 2009-3-24 16:59:41 | 显示全部楼层
饿   string  还会泄露~~~ 我都不止到~~



用VJASS作技能贝 ~~~~~~~~或者用 兔子的 系统~~~~
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 07:24 , Processed in 0.075346 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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