找回密码
 点一下
查看: 2983|回复: 11

请教一下各位。。关于代码的优化的

[复制链接]
发表于 2012-7-18 14:01:30 | 显示全部楼层 |阅读模式
最近刚刚开始接触j。。感觉很多时候的确比t来得方便。。
写了一段技能的代码,但是写完以后总是感觉有些地方写得太过复杂了。。。
请教一下各位,具体要怎么改能提升效率?还有排泄方面还有没有遗漏的?谢谢各位了~~
技能很简单。。是单位冲到指定地点并对周围的敌方单位造成伤害并减速的。。
[jass]function Trig_raidConditions takes nothing returns boolean
    return ((GetSpellAbilityId() == 'A005'))
endfunction

function raid_damage_Conditions takes nothing returns boolean
    local unit source = YDWEGetUnitByString("raid", "source")
    local boolean j =((IsUnitDeadBJ(GetFilterUnit()) == false) and (IsUnitAlly(GetFilterUnit(), GetOwningPlayer(source)) == false) and (IsUnitType(GetFilterUnit(), UNIT_TYPE_FLYING) == false) and (IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false))
    set source = null
    return j
endfunction

function raid_clean takes nothing returns nothing
    call KillDestructable( GetEnumDestructable() )
endfunction

function raid_damage takes nothing returns nothing
    local unit source = YDWEGetUnitByString( "raid", "source")
    local real damage = YDWEGetRealByString( "raid", "damage")
    //call DisplayTextToPlayer( Player(0), 0, 0, R2S(damage) )
    call UnitDamageTarget( source, GetEnumUnit(), damage, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS )
   
    set source = null
endfunction

function raid_endstage takes nothing returns nothing
    local unit source = YDWEGetUnitByString( "raid", "source")
    local real level = YDWEGetRealByString( "raid", "level")
    local real damage = 50*level+100
    local location loc = GetUnitLoc(source)
    local group gro = GetUnitsInRangeOfLocMatching(300, loc, Condition(function raid_damage_Conditions))
    local effect eff = YDWEGetEffectByString( "raid", "eff")
   
    call YDWESaveRealByString( "raid", "damage", damage)
    call SetUnitTimeScalePercent( source, 100.00 )
    call SetUnitAnimation( source, "attack" )
    call QueueUnitAnimation( source, "stand" )
    call SetUnitPathing( source, true )
    call PauseUnit( source, false)
    call DestroyEffect(eff)
    call DestroyEffect( AddSpecialEffectLocBJ( loc, "Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl" ) )
    call ForGroupBJ( gro, function raid_damage )
    call CreateNUnitsAtLoc( 1, 'e003', GetOwningPlayer(source), loc , bj_UNIT_FACING )
    call UnitApplyTimedLifeBJ( 1, 'BTLF', GetLastCreatedUnit() )
    call UnitAddAbility( GetLastCreatedUnit(), 'AHtc' )
    call SetUnitAbilityLevel( GetLastCreatedUnit(), 'AHtc', 1 )
    call IssueNeutralImmediateOrder( GetOwningPlayer(source), GetLastCreatedUnit(), "thunderclap" )
    call YDWEFlushMissionByString("raid")
   
    call RemoveLocation(loc)
    set source = null
    set gro = null
    set eff = null
endfunction

function raid_rush takes nothing returns nothing local string table = I2S(YDWEGetTimerID(GetExpiredTimer()))
    local unit source = YDWEGetUnitByString( "raid", "source")
    local real angle = YDWEGetRealByString( "raid", "angle")
    local real step = YDWEGetRealByString( "raid", "step")
    local location loc = GetUnitLoc(source)
    local location loc2 = PolarProjectionBJ(loc, step, angle )
    local integer record = YDWEGetIntegerByString( "raid", "record")
   

    //call SetUnitAnimation( knight, "walk" )
    set record = record + 1
    call YDWESaveIntegerByString( "raid", "record", record )
    call SetUnitPositionLocFacingBJ( source, loc2, angle )
    call EnumDestructablesInCircleBJ( 180, loc2, function raid_clean )
    call CreateNUnitsAtLocFacingLocBJ( 1, 'e000', GetOwningPlayer(source), loc, loc2 )
    call SetUnitVertexColorBJ( GetLastCreatedUnit(), 20, 20, 100, 80.00 )
    //call UnitApplyTimedLifeBJ( 0.05, 'BTLF', GetLastCreatedUnit() )
    call YDWETimerRemoveUnit( 0.12, GetLastCreatedUnit() )
    //call SetUnitExploded( GetLastCreatedUnit(), true )
    if (record>29) then
        call PauseTimer(GetExpiredTimer())
        call DestroyTimer(GetExpiredTimer())
        call raid_endstage()
    endif
   
    call RemoveLocation(loc)
    call RemoveLocation(loc2)
    set source = null
endfunction

function Trig_raidActions takes nothing returns nothing
    local unit source = GetTriggerUnit()
    local effect eff = AddSpecialEffectTarget("Abilities\\Weapons\\ZigguratMissile\\ZigguratMissile.mdl", source, "weapon")
    local location loc = GetUnitLoc(source)
    local location tar = GetSpellTargetLoc()
    local real length = DistanceBetweenPoints(loc, tar)
    local real level=I2R(GetUnitAbilityLevel(source, 'A005'))
    local real angle = AngleBetweenPoints(loc, tar)
    local real step = length/30
    local timer t = CreateTimer()
   
    call SetUnitPathing( source, false )
    call PauseUnit( source, true)
    call YDWESaveUnitByString( "raid", "source", source )
    call YDWESaveRealByString( "raid", "angle", angle )
    call YDWESaveRealByString( "raid", "level", level )
    call YDWESaveRealByString( "raid", "step", step )
    call YDWESaveRealByString( "raid", "record", 0 )
    call YDWESaveLocationByString( "raid", "loc", loc )
    call YDWESaveLocationByString( "raid", "tar", tar )
    call YDWESaveEffectByString( "raid", "eff", eff )
    call SetUnitTimeScalePercent( source, 200.00 )
    call SetUnitAnimation( source, "attack" )
    call TimerStart(t,.01,true,function raid_rush)
   
    call RemoveLocation(loc)
    call RemoveLocation(tar)
    set source = null
    set eff = null
    set t =null
endfunction

//===========================================================================
function InitTrig_raid takes nothing returns nothing
    set gg_trg_raid = CreateTrigger()
#ifdef DEBUG
    call YDWESaveTriggerName(gg_trg_raid, "raid")
#endif
    call TriggerRegisterAnyUnitEventBJ( gg_trg_raid, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition(gg_trg_raid, Condition(function Trig_raidConditions))
    call TriggerAddAction(gg_trg_raid, function Trig_raidActions)
endfunction[/jass]
发表于 2012-7-18 21:08:32 | 显示全部楼层
具体内容没仔细看
大体说这么几点

1、如果追求效率,就不要使用BJ函数,此外像YDWE的插入函数这种,也别用
   因为兼容性好的东西,效率会差一些。
2、第二还没想出来,满眼都是YD开头的函数,而我没用过,所以不清楚效果
回复

使用道具 举报

 楼主| 发表于 2012-7-18 21:41:53 | 显示全部楼层

回 疯人¢衰人 的帖子

疯人¢衰人:具体内容没仔细看
大体说这么几点

1、如果追求效率,就不要使用BJ函数,此外像YDWE的插入函数这种,也别用
   因为兼容性好的东西,效率会差一些。
....... (2012-07-18 21:08) 
好的,多谢~~
回复

使用道具 举报

发表于 2012-7-18 22:44:33 | 显示全部楼层

回 疯人¢衰人 的帖子

疯人¢衰人:具体内容没仔细看
大体说这么几点

1、如果追求效率,就不要使用BJ函数,此外像YDWE的插入函数这种,也别用
   因为兼容性好的东西,效率会差一些。
....... (2012-07-18 21:08)
YD的存储函数还是能用的,效率不太差
  主要效率差的是,如果是1.24版本,他会使用HAsh表来存储
而,hash表是用的数字做索引,所以会有一个转化过程 ,而YDWE的hashstring是自定义的函数
存储系统多次调用了这个函数,
效率低在了这里
回复

使用道具 举报

发表于 2012-7-18 22:49:58 | 显示全部楼层

回 lia77593 的帖子

lia77593:YD的存储函数还是能用的,效率不太差
  主要效率差的是,如果是1.24版本,他会使用HAsh表来存储
而,hash表是用的数字做索引,所以会有一个转化过程 ,而YDWE的hashstring是自定义的函数
存储系统多次调用了这个函数,
....... (2012-07-18 22:44)
我不是单指YD函数
我是指一切兼容性的系统,
为了提高兼容性,必然要放弃一部分效率的
所以如果可能还是自己写最好
回复

使用道具 举报

发表于 2012-7-19 13:04:29 | 显示全部楼层

回 疯人¢衰人 的帖子

疯人¢衰人:我不是单指YD函数
我是指一切兼容性的系统,
为了提高兼容性,必然要放弃一部分效率的
所以如果可能还是自己写最好 (2012-07-18 22:49)
那是肯定的,好比JAVA,话说,大家都在用YDWE。。。
  jass区。。
  好冷清 。。。
回复

使用道具 举报

发表于 2012-7-19 19:31:40 | 显示全部楼层

回 lia77593 的帖子

lia77593:那是肯定的,好比JAVA,话说,大家都在用YDWE。。。
  jass区。。
  好冷清 。。。 (2012-07-19 13:04)
YD的结果是导致we的寿命更短
当不需努力就能实现需要的效果
那么还会有人做深入的研究么

正如我的回复,代码还是自己写的好
但是用惯了YD,还有人会研究么
只能说10年以后的新人,研究能力越发不如从前了
当然YD只是部分原因


YD刚出来的时候就提过这个问题
不过当时离开了一阵子,回来就直接转入se
这些都已经无关了
回复

使用道具 举报

 楼主| 发表于 2012-7-19 22:36:25 | 显示全部楼层

回 疯人¢衰人 的帖子

疯人¢衰人:YD的结果是导致we的寿命更短
当不需努力就能实现需要的效果
那么还会有人做深入的研究么

....... (2012-07-19 19:31) 
其实我觉得吧 。。YDWE没有错。。是现在的人越来越浮躁了。。
作为一个纯菜鸟。。我一开始也是打算直接用YD的跳劈或者是冲锋来做这个技能的。。
结果效果相当的不好。。
然后我就开始自己写。。中间出现了各种bug和语法错误。。
搞了整整一个下午。。。然后就有了顶楼的那段代码。。。技能放出来的效果我感觉还是很不错的。。动作和特效配合的很好。。
之所以用yd的储存函数是因为不喜欢hashtable用数字储存数据的方法,用数字存用的多了感觉会很晕。。。

经你这么一说我打算在整张地图完成以后统一的改成hashtable。。
回复

使用道具 举报

发表于 2012-7-20 02:22:45 | 显示全部楼层
hmmm... 我觉得新手不应该太在意效率这东西
因为随着你的技术提高,你会对以前自己做的东西越来越不满
总不能来回推翻重做吧,折腾几次下来热情就凉了
策划和创意才是第一位的,不管地图怎么运行的能运行就好了
完成后再修正呗~
回复

使用道具 举报

发表于 2012-7-20 09:54:36 | 显示全部楼层
效率问题会有多少人考虑到了,现在的计算机运行速度越来越快,好比内存泄漏这问题,处不处理好像内存都禁得住考验
代码没有必要进行很刻意的优化和注重效率,事实上,TSP(旅行商问题悲剧了。。)
回复

使用道具 举报

发表于 2012-7-20 09:55:51 | 显示全部楼层

回 yelite 的帖子

yelite:其实我觉得吧 。。YDWE没有错。。是现在的人越来越浮躁了。。
作为一个纯菜鸟。。我一开始也是打算直接用YD的跳劈或者是冲锋来做这个技能的。。
结果效果相当的不好。。
然后我就开始自己写。。中间出现了各种bug和语法错误。。
....... (2012-07-19 22:36)
YD函数也是要转换成基本的J函数的

你直接打开地图mpq看war3map.j看就知道了

为了兼容性和功能,会浪费更多的效率
回复

使用道具 举报

发表于 2012-8-7 13:10:29 | 显示全部楼层
说实话,我用YDWE只是为了在触发里写全局变量。。。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 18:24 , Processed in 0.036594 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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