当前位置: 首页 > news >正文

杭州外贸网站建设公司百度站点

杭州外贸网站建设公司,百度站点,javasceip做网站,wordpress付费商业站C#和Lua内存共享方案保姆级教程 前言 在介绍C#和Lua内存共享方案之前,先介绍下面两个点来支撑这个方案的必要性 跨语言交互很费 Lua和C#交互最早是基于反射的方式实现的,后来为了提升性能发展成Luajit+C#静态方法导出注入到lua虚拟机的方式至此Lua+Unity的性能才达到了实…

C#和Lua内存共享方案保姆级教程

前言

在介绍C#和Lua内存共享方案之前,先介绍下面两个点来支撑这个方案的必要性

跨语言交互很费

Lua和C#交互最早是基于反射的方式实现的,后来为了提升性能发展成Luajit+C#静态方法导出注入到lua虚拟机的方式至此Lua+Unity的性能才达到了实用的级别,但我们如果用的不好还是会存在诸多性能问题,具体的一些使用注意事项参考引用里《用好lua+unity,让性能飞起来——lua与c#交互篇》,用文章中的一个例子来加深一下我们lua点点调用一个对象的属性的写法在Lua+C#的组合模式下是有多么的费劲能,虽然写起来很轻松,但实际交互都是调用的虚拟栈,会经历压栈,出栈等操作,性能会随着调用次数的频繁和参数传递的越多而变的越差,看了下面的交互步骤之后就意识到尽可能的避免这种点属性的链式写法

game.bject.transorm.position = pos写法在项目中很常见,但大量使用就比较糟糕,因为每点一次属性就意味着要经过堆栈调用,有的甚至还要经过Dictionary容器查询操作,内部又是好几条指令,每一次指令就意味着时间开销,尽管一次很小但调用次数多了之后就可观了,要实现这个坐标赋值的操作,lua堆栈调用如下
第一步

  GameObjectWrap.get_transform        lua想从gameobj拿到transform,对应gameobj.transformLuaDLL.luanet_rawnetobj             把lua中的gameobj变成c#可以辨认的idObjectTranslator.TryGetValue        用这个id,从ObjectTranslator中获取c#的gameobject对象gameobject.transform                准备这么多,这里终于真正执行c#获取gameobject.transform了ObjectTranslator.AddObject          给transform分配一个id,这个id会在lua中用来代表这个transform,transform要保存到ObjectTranslator供未来查找LuaDLL.luanet_newudata              在lua分配一个userdata,把id存进去,用来表示即将返回给lua的transformLuaDLL.lua_setmetatable             给这个userdata附上metatable,让你可以transform.position这样使用它LuaDLL.lua_pushvalue                返回transform,后面做些收尾LuaDLL.lua_rawsetiLuaDLL.lua_remove

第二步:

  TransformWrap.set_position                      lua想把pos设置到transform.positionLuaDLL.luanet_rawnetobj                         把lua中的transform变成c#可以辨认的idObjectTranslator.TryGetValue                    用这个id,从ObjectTranslator中获取c#的transform对象LuaDLL.tolua_getfloat3                          从lua中拿到Vector3的3个float值返回给c#lua_getfield + lua_tonumber 3次                 拿xyz的值,退栈lua_pop

transform.position = new Vector3(x,y,z) 准备了这么多,终于执行transform.position = pos赋值了
上面的内部堆栈调用说明了lua点属性或者方法调用比较费性能,语言交互代价比较"昂贵"

我们在用unity profiler的时候也会发现有的调用比较深的堆栈一页都拉不到底,当然可能是存在递归调用的情况,这调用嵌套越,执行花费的时间就越多,而上面的gameobject.transform每次如果临时使用很快就会被lua gc掉,下次再调用又会重新走一遍这个堆栈调用的流程就会很费性能

参数传递也很费

用传统的虚拟栈传递参数的方式同样的道理,尤其是Unity特有的值类型结构(Vector3,Quaternion等),lua中一个Vector3就是一个table,跟C#是Vector3是两种结构,就会涉及到这两种类型的转换,例如将C# Vector3传递给Lua,流程如下:

  1. C#中拿到Vector3的x、y、z三个值;
  2. Push这3个float给Lua栈;
  3. 然后构造一个表,将表的x,y,z赋值;
  4. 将这个表push到返回值里。
    一个传vector的操作会经历三次push参数、表内存分配、和3次表插入等操作,虽然单次指令也就那么大几个,但这种频繁操作的代码会导致性能下降
目前项目中参数传递的两种方式
第一种、SendMessage的方式

通过Lua虚拟栈采用数据压栈和出栈的方式(获取对应的LuaTable的方法,传参的方式)
在这里插入图片描述
在这里插入图片描述

第二种、C#持有LuaTable

C#通过LuaState获取到对应的table,然后给这个table添加对应的数据,也可以添加上table,这种方式有明显的利弊,可读性差,如果采用哈希的结构会有key字符串的内存开销,针对复杂的嵌套类型写起来极其"恶心",下不了手,适合简单的类型还是可以考虑的
在这里插入图片描述

上面两种方式的性能对比

天之之前测试血条、蓝条将SendMessage的方式改成LuaTable共享的方式做的对比测试

  • SendMessage Call Function的方式
    在这里插入图片描述

  • LuaTable共享的方式
    在这里插入图片描述

由上面的图可见LuaTable的方式还是比方法调用的方式传参性能要好很多,但看他们性能图还是会稳定的性能尖峰,尽管是峰值从42ms降低到10ms,但稳定的10ms尖峰还是需要

http://www.hengruixuexiao.com/news/51469.html

相关文章:

  • 上海黄浦 网站制作友情链接怎么添加
  • 北京网站制作与建设公司手机百度搜索
  • 十大不封号直播平台seo外推软件
  • seo上海推广公司优化网站搜索排名
  • 有没有做网站的软件专业的网站建设公司
  • 代做原创毕业设计网站东莞网站优化关键词排名
  • 手机模板网站开发站长统计app软件下载官网
  • 有哪些做网站的网站成都私人网站建设
  • 网站开发工程师ppt自助建站系统破解版
  • 简历模板网站有哪些互联网广告销售
  • 建外贸商城网站会计培训班需要学多长时间
  • 深圳网站建设费用多少钱湖人最新消息
  • 一个新手怎么做电商运营济南做seo的公司排名
  • 网站建设项目标书app软件开发
  • 路由器做映射后 内网可以访问到我的网站 但是外网无法访问沪指重上3000点
  • 优秀包装设计网站互联网公司排名2021
  • 国内做网站上市公司廊坊网站建设优化
  • 建设工程网站新专家入库seo技巧
  • 做废品交易看什么什么网站企业营销策划
  • 服务器怎么添加网站会计培训班初级费用
  • 网站做网络营销的效果网络营销的方式包括
  • 湖南做网站 多少钱磐石网络电商seo是什么意思啊
  • 网站栏目页关键词如何做上海比较好的seo公司
  • asp.net 网站开发 教程2345浏览器主页网址
  • 资讯门户类网站模板59软文网
  • 政府网站建设方案核心内容百度外推代发排名
  • 滨海县做网站注册淘宝小程序在线培训网站
  • 昆明做网站建设找谁百度推广怎么做的
  • 网站出错咨询电话如何让百度收录自己的网站
  • 沈阳做网站哪个好sem是什么分析方法