血精

注册

 

发新话题 回复该主题

imba优化日记2010 [复制链接]

1#

根据玩家反馈,在发生激烈团战时,游戏极为容易造成大幅度掉帧,在配置相对比较弱的玩家电脑上时,甚至会发生卡死及魔兽崩溃的问题,因而针对性的优化必不可少

以下所有测试基于我的台式机配置进行测试,简略配置如下:

Inteli9-KF64G皇家戟内存Intel2T固态硬盘Ti一体式水冷散热

一开始初步怀疑是伤害触发器导致的问题

因为我采用的方式是注册13个伤害触发器,记为p_event_dmg_trg[...]

每当一个玩家的常规单位进入地图范围时,为其注册伤害事件(EVENT_UNIT_DAMAGED),并挂载在对应玩家indexid的触发器上,例如玩家3的单位进入地图后,注册伤害事件在p_event_dmg_trg[3]上

由于魔兽本身引擎的问题,“或许”当一个触发器挂载的事件过多时,可能导致效率低下的问题,因而进行了测试,测试流程如下:

阶段A:

创建个英雄[美杜莎](英雄idH00V,所属玩家:天灾*团),每次创建20个,每隔0.15秒创建一次,共运行次(因为一次性创建大量单位会直接导致魔兽卡死)创建后,为其添加标签[fortest],使其不触发地图本身的进入地图事件,手动为其绑定受到伤害事件,挂载在p_event_dmg_trg[0]上,同时设置其生命周期为0.2秒(即0.2秒后自动死亡)

阶段B:

当个事件挂载完毕后,创建9个同样的英雄,但不添加生命周期,等待5秒后开启下一个阶段

阶段C:

每隔0.1秒,对后创建的9个英雄造成点伤害,循环直到手动停止

结果发现在阶段A,我的电脑就会发生剧烈掉帧,显示帧率从60-64大约下降至4-9,直到阶段A结束后,帧率才会恢复到初始情况

故此判断在阶段A中,就存在着会导致大幅掉帧的问题

将阶段A的[设置其生命周期为0.2秒]调整为[立即移除单位],掉帧现象消失

怀疑[单位死亡事件](EVENT_UNIT_DEATH)触发后,某一些动作可能会极大的开销系统资源

首先假设本身基于DotA版本的英雄击杀代码没有问题,先屏蔽我构架的死亡触发器,发现情况并没有得到改善

回过头去检查DotA相关部分代码,发现两个死亡触发器t1及t2

屏蔽t1及t2运行后,掉帧情况消失,得出结论:掉帧由其中一个或多个触发器事件中的某些行为导致

单独开启t1触发器,发现掉帧情况复现,因而t1必然存在问题(t2还未做测试,不排除)

逐个模块屏蔽开启测试,发现当运行到[血精石]判定时,IF采用的方法是:

创建单位组(group),选取并过滤单位,进行操作,然后删除单位组

在魔兽中,创建删除单位组是一个很开销资源的操作,常规优化方法为建立一个全局单位组变量(globalgroup),通过清空单位组(GroupClear),来替代这个流程

故而我重新编写了代码:

首先使用0秒计时器(timer),推帧进行操作,即减少在每一个操作帧内系统需要执行的命令的总量,随后使用全局单位组变量替代原本的创建删除操作,同时简化判断逻辑,去除重复功能代码

测试后,掉帧情况得到了极大的改善,最低帧率大幅度上升至40-42

经过测试排查,发现单位组选取事件会开销不少资源,考虑到过滤条件中几乎排除了除存活的非幻象英雄外所有单位,且IMBA本身是一个单英雄MOBA游戏,使用循环遍历所有玩家的存活主英雄进行相同操作

经过此优化后,几乎不存在掉帧现象,至此本函数优化完成

继续排查模块,发现下一个模块[影之灵龛]存在同样问题,会导致最低帧率跌至约30帧左右,进行同样优化,优化后,掉帧现象消失,至此本函数优化完成

经过以上优化后,t1触发器已几乎不会影响游戏整体流畅度,因为t1触发器优化完成,开始查看t2触发器

经过测试,t2触发器基本不影响游戏流畅度,因而暂时不做处理

最后再对调整过的[血精石]及[影之灵龛]道具进行测试,充能正常

本次优化结束

预览时标签不可点收录于话题#个上一篇下一篇
分享 转发
TOP
发新话题 回复该主题