ILRuntime编码中如何注意性能问题

一、避免频繁的反射操作

在使用ILRuntime时,我们需要频繁地进行反射操作,例如获取类型、获取方法、获取属性等等。反射操作是非常耗费性能的,所以我们需要尽可能地避免频繁的反射操作。

例如,我们需要获取一个类型的所有属性,我们可以使用以下代码:

PropertyInfo[] properties = typeof(MyClass).GetProperties();

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

这样的代码会频繁地进行反射操作,如果我们需要频繁地获取类型的属性,将会产生很大的性能开销。我们可以将获取属性的代码封装成一个方法,并将获取到的属性缓存起来。这样,在下次需要获取属性时,我们可以先从缓存中查找,避免频繁的反射操作。

public static class ReflectionCache
{
    private static Dictionary<Type, PropertyInfo[]> propertyCache = new Dictionary<Type, PropertyInfo[]>();

    public static PropertyInfo[] GetProperties(Type type)
    {
        if (propertyCache.TryGetValue(type, out PropertyInfo[] properties))
        {
            return properties;
        }
        else
        {
            properties = type.GetProperties();
            propertyCache[type] = properties;
            return properties;
        }
    }
}

我们可以使用以上代码来获取类型的属性,这样就可以避免频繁的反射操作。

二、避免频繁的装箱和拆箱操作

在使用ILRuntime时,我们需要频繁地进行装箱和拆箱操作。装箱和拆箱操作是非常耗费性能的,所以我们需要尽可能地避免频繁的装箱和拆箱操作。

装箱和拆箱操作会产生额外的内存开销和GC压力,所以我们需要尽可能地避免频繁的装箱和拆箱操作。例如,我们可以使用泛型来避免装箱和拆箱操作。

public static class ReflectionCache
{
    private static Dictionary<Type, PropertyInfo[]> propertyCache = new Dictionary<Type, PropertyInfo[]>();

    public static PropertyInfo[] GetProperties(Type type)
    {
        if (propertyCache.TryGetValue(type, out PropertyInfo[] properties))
        {
            return properties;
        }
        else
        {
            properties = type.GetProperties();
            propertyCache[type] = properties;
            return properties;
        }
    }
}

使用泛型可以避免频繁的装箱和拆箱操作,提高性能。

三、避免频繁的委托操作

在使用ILRuntime时,我们需要频繁地使用委托来实现函数回调。委托操作是非常耗费性能的,所以我们需要尽可能地避免频繁的委托操作。

例如,我们可以使用事件来避免频繁的委托操作。

public class MyEventClass
{
    public event Action OnEvent;

    public void DoSomething()
    {
        // do something
        OnEvent?.Invoke();
    }
}

使用事件可以避免频繁的委托操作,提高性能。

四、避免频繁的字符串操作

在使用ILRuntime时,我们需要频繁地进行字符串操作。字符串操作是非常耗费性能的,所以我们需要尽可能地避免频��的字符串操作。

字符串操作指的是对字符串进行拼接、截取、替换等操作。字符串操作会产生额外的内存开销和GC压力,所以我们需要尽可能地避免频繁的字符串操作。

例如,我们可以使用StringBuilder来避免频繁的字符串操作。

StringBuilder sb = new StringBuilder();
sb.Append("Hello");
sb.Append(" ");
sb.Append("World");
string result = sb.ToString();

使用StringBuilder可以避免频繁的字符串操作,提高性能。

五、避免频繁的内存分配

在使用ILRuntime时,我们需要频繁地进行内存分配。内存分配是非常耗费性能的,所以我们需要尽可能地避免频繁的内存分配。

内存分配指的是在堆上分配一段内存空间,并返回该内存空间的引用。内存分配会产生额外的内存开销和GC压力,所以我们需要尽可能地避免频繁的内存分配。

例如,我们可以使用对象池来避免频繁的内存分配。

public class MyObject
{
    // fields
}

public class ObjectPool<T> where T : new()
{
    private Stack<T> pool = new Stack<T>();

    public T GetObject()
    {
        if (pool.Count > 0)
        {
            return pool.Pop();
        }
        else
        {
            return new T();
        }
    }

    public void RecycleObject(T obj)
    {
        pool.Push(obj);
    }
}

使用对象池可以避免频繁的内存分配,提高性能。

本课程主要是针对ILRuntime设计一个独立的脚本热更新框,框架的优势:1.将代码热更脱离Assetbundle资源热更,独立的部分更适用于各种不同的框架。2.加快项目的逻辑更新,bug修复.(后期修bug,多数情况下并不用动到资源,只需要更新脚本代码,无需重走资源打包发布流程,大大提升效率)3.提供热更模式和正常开发模式的快速切换接口,可以让队友像平常一样去开发.4.不依赖市面上的任何AB框架,完全兼容市面上各种不同的AB框架.5.重点:希望通过它,帮助你学习、了解ILRuntime真正在项目的应用.框架的将提供以下这些接口,这些接口将从0开始,在Unity里将C#脚本编译成dll,然后将dll放到服务器上,再将dll下载下来,进行加载,到最后从Unity主工程调用热更新的代码逻辑.1.Create hotfixdll接口将热更部分的代码 编译成dll生成dll版本配置(MD5)2.更新对比接口本地跟服务器的dll进行版本对比3.下载热更dll下载dll本身的文件下载版本记录文件4.加载热更dll加载dll实例化:AppDomain初始化:注册跨域继承适配器注册委托适配器LitJson重定向调用性能优化(CLR绑定功能)调用热更接口Hotfix.HotfixApplication.Main 进入热更逻辑5.ILMonoBehaviour用于监听组件的生命周期,实际是桥接(调用)热更的逻辑AwakeStartEnableUpdateLateUpdate.......6.添加其他常用的库DOTweenLitJsonSpineGoogle.ProtobufTextAnimation可以根据上面的方式,自行添加依赖的库... 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值