找回密码
 点一下
查看: 2443|回复: 8

计时器类动态添加性能优化及计时器与单位组的配合性优化

[复制链接]
发表于 2009-10-23 22:31:12 | 显示全部楼层 |阅读模式
1.计时器动态添加性能优化
此方法目前可行性低........因为没找到好的方法来传递Code或者boolexpr


2.计时器与单位组的配合性优化
理由同上,比如说对X,Y坐标点所有敌对单位在2秒内击飞再落地.如果是每个单位绑定一次计时器,那么会创建多个计时器,所消耗的系统资源反而更多.不如将所有单位ADD到一个绑定计时器的单位组,然后对单位组进行LOOP操作比较节省资源.

以上都经过个人实验,效果不错.有不同的意见欢迎指出.
 楼主| 发表于 2009-10-23 22:31:48 | 显示全部楼层
自杀.顺便说下,1.24还是不错的.特别是Hashtable用起来蛮爽的,比原来自己的HASH的舒服多了.
回复

使用道具 举报

发表于 2009-10-24 09:07:53 | 显示全部楼层
某些时刻的时间间隔是依靠某一时间点开始计数的
如果这个点不是正好在timer正好开始时
必然造成第一次执行的间隔小于默认间隔
而且使用同一个计时器
在某些做技能时候效果会很差,特别是间隔较长的时候

最后,开一堆计时器并不怎么卡……
回复

使用道具 举报

发表于 2009-10-24 10:53:34 | 显示全部楼层
同学,卡一般是因为你的代码写的有问题。。

计时器再多也不会卡的。。

多半是因为你用的什么模型有问题,我的仇恨系统就是简单启动一个计时器,也没见得卡到那里去。

另外,请楼主注意,把所有东西放在一个里面做动作是下下策,因为jass限制每个代码只能执行一定时间,当你循环太多超时以后的代码会被自动忽略掉
回复

使用道具 举报

 楼主| 发表于 2009-10-24 14:21:14 | 显示全部楼层
计时器多了确实不会卡,但是如果里面的动作也很多呢...............
我一开始就是按照每个每个单位创建计时器这样子,结果后面要绑定闪电特效的时候卡的不成.
然后就是把所有计时器合并成一个,然后通过GROUP+LOOP做,一点不卡.很顺畅.

再另外......目前没啥导入模型..........

回2L:计时器以0.01秒运作的时候,误差间隔基本可以忽略的.......至少在我的地图里要求不到这么高的精度.

再再说明:观点一目前没可行性.......因为如果使用ExecuteFunc的话,还是会变得很卡,但是又没办法记录Code和Boolexpr来试试看................(用1.24自带的哈希函数)
回复

使用道具 举报

发表于 2009-10-24 14:37:51 | 显示全部楼层
动作多了也不会卡。。卡是你写法问题。。

另外,我是用ExecuteBoolexpr的。。
回复

使用道具 举报

发表于 2009-10-24 16:09:35 | 显示全部楼层
闪电绑定会卡??单位都不卡闪电会卡么……闪电可以说是魔兽里最简单的结构了,lz不要告诉我你用TDS都会卡……

话说eff你的那个ExecuteBoolexpr是不是那个要造先一大堆可破坏物的……
回复

使用道具 举报

 楼主| 发表于 2009-10-24 19:43:35 | 显示全部楼层
我的写法应该没啥问题的说- -要不我扔点出来帮忙看看吧.被你们说的不确定了.........
回复

使用道具 举报

发表于 2009-10-25 01:36:19 | 显示全部楼层
ExecuteBoolexpr的原型
[jass]
    integer                     SYS_BoolexprInt
    boolean                     SYS_BoolexprResult = false
    rect                        SYS_Rect_ForBoolexpr
//========BaseFuncStart=======================================================
function Print takes string s returns nothing
   call DisplayTimedTextFromPlayer(GetLocalPlayer(),0,0,0,s)
endfunction

function SetBoolexprResult takes nothing returns nothing
    set SYS_BoolexprResult = true
endfunction

function ExecuteBoolexpr takes boolexpr be returns boolean
    set SYS_BoolexprResult = false
    call EnumDestructablesInRect(SYS_Rect_ForBoolexpr,be,function SetBoolexprResult)
    return SYS_BoolexprResult
endfunction

function DestructablesConfig takes nothing returns nothing
    //call Print("find")
    call RemoveDestructable(GetFilterDestructable())
endfunction

function InitBoolexprSystem takes integer dId returns nothing
    local rect r = GetWorldBounds()
    local boolexpr be = Condition(function DestructablesConfig)
    local destructable dst
    local real x = GetRectMinX(r)+50.0
    local real y = GetRectMinY(r)+50.0
    set SYS_Rect_ForBoolexpr = Rect(x,y,x+150.0,y+150.0)
    call EnumDestructablesInRect(SYS_Rect_ForBoolexpr,be,null)
    set dst = CreateDestructable(dId,GetRectCenterX(SYS_Rect_ForBoolexpr),GetRectCenterY(SYS_Rect_ForBoolexpr),0,0,0)
    call SetDestructableInvulnerable(dst,true)
    call DestroyBoolExpr(be)
    set be = null
    set r = null
endfunction[/jass]
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 22:56 , Processed in 0.043574 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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