首页 > 其他分享 >HybridCLR初探

HybridCLR初探

时间:2022-09-28 21:12:00浏览次数:56  
标签:__ index ip HybridCLR il2cpp uint16 初探

  在以往的Unity项目热更方案中,无论是lua还是ilruntime,都是基于独立vm与原生AOT(静态编译)代码进行交互(各种wraper)。现在出现了一个全新的热更方案,HybridCLR。

  HybridCLR方案实现方式与ilruntime类似,都是对dll进行更新,都需要对dll进行解释。区别在于HybrtidCLR没有vm的概念,对于原生ATO接口就直接取函数指针进行调用,对于新增加的函数,由于不能执行新生成的机器码(ios上),所以自定义了一套IL指令的执行方法(dll中其实就是许多的IL指令结构,当然为了更高效率HybridCLR将IL指令集转换成自己的指令集)。类似:BinOpVarVarVar_Add_i4 指令的实际实现:

case HiOpcodeEnum::BinOpVarVarVar_Add_i4:
{
    uint16_t __ret = *(uint16_t*)(ip + 2);
    uint16_t __op1 = *(uint16_t*)(ip + 4);
    uint16_t __op2 = *(uint16_t*)(ip + 6);
    (*(int32_t*)(localVarBase + __ret)) = (*(int32_t*)(localVarBase + __op1)) + (*(int32_t*)(localVarBase + __op2));
    ip += 8;
    continue;
}

  HybridCLR相对于lua热更方案有以下优点:

  1. 游戏中只需要编写一种代码,且与Unity自身调用效率更高(直接调用AOT代码,不需要warper)

  2. 可动态新增加数据类型(如新的MonoBehaviour而不需要重新打整包),此项HybridCLR是通过修改il2cpp工具实现的,在il2cpp执行时创建新增的元数据类型

const char* il2cpp::vm::GlobalMetadata::GetStringFromIndex(StringIndex index)
{
    // 新增元数据给予特殊标记
    if (huatuo::metadata::IsInterpreterIndex(index))
    {
        return huatuo::metadata::MetadataModule::GetStringFromEncodeIndex(index);
    }

    // 原始il2cpp的元数据获取
    IL2CPP_ASSERT(index <= s_GlobalMetadataHeader->stringSize);
    const char* strings = MetadataOffset<const char*>(s_GlobalMetadata, s_GlobalMetadataHeader->stringOffset, index);
    #if __ENABLE_UNITY_PLUGIN__
        if (g_get_string != NULL)
        {
            g_get_string((char*)strings, index);
        }
    #endif // __ENABLE_UNITY_PLUGIN__
        return strings;
}

  

 

标签:__,index,ip,HybridCLR,il2cpp,uint16,初探
From: https://www.cnblogs.com/hghhe/p/16739575.html

相关文章

  • gopacket初探(2)
    昨天试验了NgWriter和普通Writer,NgWriter格式处理起来注意事项较多,极易出错,此处使用普通Writer给出说明。首先打开文件1fileName:=pcapDataConfigs.RecordFi......
  • MySQL的主从复制和分库分表初探
    主从复制+分库分表要讲主从复制,首先来看看MySQL自带的日志文件。日志错误日志错误日志是MySQL中最重要的日志之一,它记录了当mysqld启动和停止时,以及服务器在运行......
  • 初探缓存装饰器
    平常学习过程发现了一个牛掰装饰器,在此记录下1fromfunctoolsimportlru_cache234@lru_cache()5defcount(a,b):6print("对{},{}求和".format(a,......
  • Java内部类初探
    Java内部类初探之前对内部类的概念不太清晰,在此对内部类与外部类之间的关系以及它们之间的调用方式进行一个总结。Java内部类一般可以分为以下三种:成员内部类静态内部......
  • Java面向对象初探
    Java面向对象1.类和对象1.1类和对象的概念:类是抽象的集合,对象是具体的实例。类可以想象为制作蛋糕的模具,对象就是做出来的蛋糕。类中包含属性(字段)和方法(操作)1.2类......
  • Redis 高可用方案原理初探
     Redis高可用的方案包括:持久化、主从复制(及读写分离)、哨兵和集群(Cluster)。持久化解决Redis数据的单机备份问题(从内存到硬盘的备份),数据可用性以及可靠性。主从复制......
  • ModelScope初探:一行代码调用成熟AI模型
    简介: 如何用一行代码调用成熟AI模型?试试ModelScope,让AI开发者解放生产力!ModelScope是阿里推出的下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的......
  • Transformer模块初探
    Transformer笔记前言背景 Transformer依赖于SelfAttention的知识。Attention是一种在深度学习中广泛使用的方法,Attention的思想提升了机器翻译的效果。​ 2017......
  • 【鸟哥 Linux 16】进程管理与SELinux初探
    【鸟哥Linux16】进程管理与SELinux初探一、相关概念梳理程序:一些代码段的静态集合进程:程序中静态代码段的一次动态执行子进程:在某一个进程中创建的新作业,从该......