当前位置:   article > 正文

Unity Dotween使用优化,1ms优化_dotween 优化

dotween 优化

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

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

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

掉血飘字示意

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

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

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

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

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

改为这样的用法:

  1. float passedTime = time - startTime;
  2. float v = EaseManager.Evaluate(Ease.Linear, null, passedTime, _scaleDuration, 0, 0);
  3. float scaleValue = Mathf.Lerp(_scale, _toScale, v);
  4. _dropText.transform.localScale = new Vector3(scaleValue, scaleValue, scaleValue);
  5. float v = EaseManager.Evaluate(Ease.InBounce, null, passedTime, _moveDuration, 0, 0);
  6. Vector3 tempPos = _dropText.transform.position;
  7. tempPos.y = Mathf.Lerp(_pos.y, _toY, v);
  8. _dropText.transform.position = tempPos;

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

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

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

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/125626
推荐阅读
相关标签
  

闽ICP备14008679号