Unity Dotween使用优化,1ms优化

最近在继续做性能优化,后续空下来尽量总结一些小的优化点分享出来。这些都不是大的优化,只是积少成多的改善。

看过我之前文章的朋友,知道我们优化的目标是,战斗60帧(不开后处理的情况下,千元机达到),影响每帧消耗的东西很多,除去美术效果的消耗,程序能完全控制的部分,就只有逻辑的实现了。

所以,对于一个16ms一帧的需求,能省一点是一点。在最近项目优化中,我们尽量优化逻辑部分的消耗,这次就着手优化了战斗的掉血飘字

掉血飘字示意

在最早做掉血飘字的时候,因为需求比较简单,我们就简单实用一个dotween来做了飘字的位移。随着需求逐渐变化,需要根据各种战斗伤害参数(暴击,血量,伤害类型等)来调整掉血飘字的淡入,移动,缩放,淡出等各种效果。逐渐演变成为需要多个Dotween来实现效果。

当同屏的怪物数量变多,一个飘字需要4~5个dotween,十几个怪,就会有50~100个的dotween。这时候,dotween本身,会有接近每帧 1ms 的性能消耗。且因为dotween内部的管理方式,会导致根据当前dotween的数量,每帧都有一定的内存分配(dotween会维护一个list,导致一些分配,几十到上百byte)。

优化思路其实很简单,就是不使用dotween,而只使用dotween的核心逻辑,即EaseManager.Evaluate。

将类似这样的用法(原代码片段示意):

    _currTextMesh.DOColor(_startColor, _fadeDuration);
    _dropText.transform.DOScale(_baojiScale, _scaleDuration);
    _dropText.transform.DOMoveY(_toY, _moveDuration);

改为这样的用法:

    float passedTime = time - startTime;
    float v = EaseManager.Evaluate(Ease.Linear, null, passedTime, _scaleDuration, 0, 0);
    float scaleValue = Mathf.Lerp(_scale, _toScale, v);
    _dropText.transform.localScale = new Vector3(scaleValue, scaleValue, scaleValue);

    float v = EaseManager.Evaluate(Ease.InBounce, null, passedTime, _moveDuration, 0, 0);
    Vector3 tempPos = _dropText.transform.position;
    tempPos.y = Mathf.Lerp(_pos.y, _toY, v);
    _dropText.transform.position = tempPos;

这里可以使用update每帧更新,或者使用Coroutine,更方便管理逻辑。

使用这种方式,代码没有原来的那么好理解,调用上也不够原来优雅简单。但是性能是能节省下来的,这1ms的节省,还是很可观的,且能减少dotween每帧的内存分配。

我们已经把战斗中用到dotween的大部分地方(掉血,掉金币等)改为这种方式。在安卓打包测试后,如果上面表述的战斗情况下(同时存在十几个掉血飘字,几十个dotween),每帧能节省1~2ms的调用。

严格意义上,这篇文章讲的并非优化了Dotween本身的性能,而是基于需求,优化了对Dotween的使用方式。在性能和代码可读性的取舍中,我们倾向于向一些可高内聚的小模块榨取性能,给一些需要更清晰逻辑维护的部分留出性能空间。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值