Unity之lua中DOtween.To的性能优化

Unity 专栏收录该内容
190 篇文章 16 订阅

前言:

记一次Lua代码的优化记录
目前unity使用lua脚本开发游戏是市面上最流行的一种做法。lua语法简洁高效。但是不可避免的也伴随有性能问题的产生,又很多lua代码的优化策略,这里记录下一次dotween的优化,供大家参考。

性能分析工具:Miku-LuaProfiler

DOtween.To

因为DOTween.TO的参数里面有Getter函数和Setter函数,每帧会有两次lua和C#的交互。所以使用较多,会产生大量gc,对性能影响较大。

DOtween.To函数,源码如下:

    /// <summary>Tweens a property or field to the given value using default plugins</summary>
    /// <param name="getter">A getter for the field or property to tween.
    /// <para>Example usage with lambda:</para><code>()=&gt; myProperty</code></param>
    /// <param name="setter">A setter for the field or property to tween
    /// <para>Example usage with lambda:</para><code>x=&gt; myProperty = x</code></param>
    /// <param name="endValue">The end value to reach</param>
    /// <param name="duration">The tween's duration</param>
    public static TweenerCore<float, float, FloatOptions> To(
      DOGetter<float> getter,
      DOSetter<float> setter,
      float endValue,
      float duration)
    {
      return DOTween.ApplyTo<float, float, FloatOptions>(getter, setter, endValue, duration, (ABSTweenPlugin<float, float, FloatOptions>) null);
    }

下面我们来做3组对照试验:

1.lua中直接调用dotween.to

代码如下:

local from = 0
local from = 100
CS.DG.Tweening.DOTween.To(
function() 
    return from
end,
function(v) 
	self.camera:SetOrthographicSize(v)
end, to, 0.5))

lua中直接使用Dotween.To<float>函数执行时,每帧lua的gc大概5.97kb。耗时:0.91ms
在这里插入图片描述

2.C#封装的dotween.to

再C#中我们扩展一个DOTweenExt.cs的类,然后重写To函数,省去一个Getter参数,因为大多数时候,get返回的值都是一个固定的初始值。

using DG.Tweening;
using UnityEngine;
using XLua;

[LuaCallCSharp]
public static class DOTweenExt
{
    public static Tweener To(float start,float to,float duration,LuaFunction setter)
    {
        return DOTween.To(() => start, (value) => setter.Call(value), to, duration);
    }
}    

下面来看lua中代码调用,整体看着,简单了不少:

local from = 0
local from = 100
CS.DOTweenExt.To(from, to, 0.5, function(v) 
    self.camera:SetOrthographicSize(v)
end)

虽然只少了一个Getter函数调用,但是性能方面却提升了不少,每帧gc降到了1.24kb,时间消耗降到了0.10ms。下面看图:
在这里插入图片描述

3.C#端定制化封装函数

定制化封装的函数,注定不能通用,比如我相机做动画和Text做动画就需要单独封装,但是又不能把每种可能用到的都封装一遍,所以通用性较低。但是,我们把getter和setter都放到了C#端,性能方便肯定碾压前两个方案。
先看下C#端封装代码:

public class CameraMove{
	//...此处省略若干字
    public Tweener DOCameraSize(float to, float duration, LuaFunction complete)
    {
        return DOTween.To(
        	() => orthographicSize,
         	(value) => orthographicSize = value, 
         	to, duration).OnComplete(() =>{ complete?.Call(); });
    }
}

再来看lua端调用:

self.cameraMove:DOCameraSize(100, 0.5, callBack)

这次我们的gc直接降到了687B,时间消耗降到了0.07ms。而且方法的使用上,更简约易懂了。
在这里插入图片描述

综上所述

lua和C#交互时产生gc的根源,我们要想办法减少交互,减少gc,但是又不能忽略通用性,上面三个方法,显然第二个是我比较推荐的,即剩去了定制化的封装,又增加了通用性。
不过还是要针对您个人的项目去分析,如果确定的需求的话,当然越剩越好。所以第三种再适当的情况下,我也是推荐使用的。

优化是一条永无止尽的路,希望这篇文章能够对你有所帮助。

  • 1
    点赞
  • 0
    评论
  • 3
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页

打赏

PassionY

你的赞同是对我的鼓励

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值