《Unity项目常见Lua解决方案性能比较》,这篇文章对比了现在主流几个lua+unity的方案
http://blog.uwa4d.com/archives/lua_perf.html
 
 
事实上2015年slua作者就发起过这个性能对比,当时这个对比还引发过一些口水战,具体可见ulua的官网
这里并非比较各种lua+unity的方案的优劣,事实上各个方案都进化到静态导出的方案,性能不会有质的差别。这里是希望通过分析用例背后的原理和细节,发现这些测试为何会产生这样的结果,以及对应方案背后有什么特点,如何进一步优化。很多的benchmark,数据是真的,但是如果不知道背后的原因,则可能在结论上有误导性,因为你并不知道问题出在哪里,可能一个小小的改动或者测试用例设计不合理就会导致结果巨大的差异。
 
test1/test2:
在《lua和c#交互篇》我们也模仿了test1做了一个测试,不过因为考虑到直接使用unity的transform会产生一些来自unity内部的消耗(c#到c导出消耗、unity刷新transform的消耗),导致结果不能完全反映lua本身的导出性能,所以我们的测试方式是自己实现了一个新的Transform并基于此做测试。test2也是通用存在这样的问题。
 
test3/test6:
在slua的测试里也有test3这个用例,但slua作者认为这个测试的是静态函数调用,这点有一定的问题,因为不管slua还是ulua,Vector3都是纯lua代码的实现,并没有走c#,也谈不上测试静态函数导出的性能了(只能说测试了Vector3.Normalize实现的性能)。
另外在uwa给出的数据中,我们会发现S3测出的ulua数据十分不正常(比其他两个lua方案高出上百倍),因为前面说过Vector3是纯lua代码实现,对比ulua和slua的代码也会发现Vector3.Normalize的实现并没有很大的差异,我们认为这是触发了我们在luajit集成篇提到的jit失败导致的,尤其极有可能是机器码内存分配失败的bug,在出现这个bug的情况下,运行速度下降百倍是常有的事情。
 
test4:
这个是测试GameObject的构造性能,其中lua与C#交互的流程并不复杂,仅仅就是通过metatable调用new GameObject然后返回到lua中,所以主要的消耗应该是来自于GameObject创建本身,至于为什么ios设备下普遍耗时比其他用例要长,我们认为是il2cpp导致的。
 
 
 
最后总结一下
如果是纯粹测试lua导出c#的性能,那么最好的办法是使用自己的c#代码导出,而规避使用unity本身的对象的导出,因为可能会引入很多unity本身的性能干扰。
用例本身尽可能不要引入过多的非语言因素的性能消耗(比如Vector3.Normalize,本身的计算量消耗比调用消耗还大得多)。
luajit的行为过于复杂,其性能测试在安卓平台下十分不稳定,这一点是一个大坑(详见《luajit集成篇》)
 
 
最后感谢ulua、slua、cstolua的作者们,给大家带来了这么棒的解决方案!这对中国的游戏行业也是一次巨大的促进。

用好lua+unity,让性能飞起来——关于《Unity项目常见Lua解决方案性能比较》的一些补充的更多相关文章

  1. 用好lua+unity,让性能飞起来——luajit集成篇/平台相关篇

    luajit集成篇 大家都知道luajit比原生lua快,快在jit这三个字上. 但实际情况是,luajit的行为十分复杂.尤其jit并不是一个简单的把代码翻译成机器码的机制,背后有很多会影响性能的因 ...

  2. 用好lua+unity,让性能飞起来——lua与c#交互篇

    前言 在看了uwa之前发布的<Unity项目常见Lua解决方案性能比较>,决定动手写一篇关于lua+unity方案的性能优化文. 整合lua是目前最强大的unity热更新方案,毕竟这是唯一 ...

  3. 为cocos2d-x项目增加Lua支持

    开始为游戏增加Lua脚本支持,今天主要配置了一下开发环境:cocos2d-x 2.2.1,xcode5. 1. 创建cocos2d-x-lua项目 类似于创建C++项目,用以下命令即可: python ...

  4. Unity iOS 项目的一种性能评测方法

    [Unity iOS 项目的一种性能评测方法]

  5. Unity优化之GC——合理优化Unity的GC

      转载请标明出处http://www.cnblogs.com/zblade/ 最近有点繁忙,白天干活晚上抽空写点翻译,还要运动,所以翻译工作进行的有点缓慢 =.= PS: 最近重新回来更新了一遍,文 ...

  6. Unity 3(二):Unity在AOP方面的应用

    本文关注以下方面(环境为VS2012..Net Framework 4.5以及Unity 3): AOP简介: Interception using Unity示例 配置文件示例 一.AOP简介 AO ...

  7. Unity编程标准导引-3.4 Unity中的对象池

    本文为博主原创文章,欢迎转载.请保留博主链接http://blog.csdn.net/andrewfan Unity编程标准导引-3.4 Unity中的对象池 本节通过一个简单的射击子弹的示例来介绍T ...

  8. Unity V3 初步使用 —— 为我的.NET项目从简单三层架构转到IOC做准备

    [声明]由于本人表达能力有限,为避免不必要的误人子弟,本文将不会涉及IOC与DI,仅仅描述新版本Unity 3的使用(非Unity 3D,如果您想看的是Unity 3D请立即离开,否则莫怪此处“谋财害 ...

  9. 对《[Unity官方实例教程 秘密行动] Unity官方教程《秘密行动》(十二) 角色移动》的一些笔记和个人补充,解决角色在地形上移动时穿透问题。

    这里素材全是网上找的. 教程看这里: [Unity官方实例教程 秘密行动] Unity官方教程<秘密行动>(九) 角色初始设定 一.模型设置: 1.首先设置模型的动作无限循环. 不设置的话 ...

随机推荐

  1. 【SQL跟踪工具】SQL Profiler 跟踪器

    什么是SQL Profiler SQL Server Profiler 是一个功能丰富的界面,用于创建和管理跟踪并分析和重播跟踪结果. 事件保存在一个跟踪文件中,稍后试图诊断问题时,可以对该文件进行分 ...

  2. Perl处理数据(一):s替换、split和join

    s替换 m//模式用来匹配文本,也就是说用来找数据.而s///用来查找并替换文本,所以可以用来处理文本文件.在有了正则的基础之后,s///用起来会简单很多. 用法格式为: $str =~ s/reg/ ...

  3. Go基础系列:Go中的方法

    Go方法简介 Go中的struct结构类似于面向对象中的类.面向对象中,除了成员变量还有方法. Go中也有方法,它是一种特殊的函数,定义于struct之上(与struct关联.绑定),被称为struc ...

  4. YTKNetwork源码详解

    本篇是第三篇关于网络请求的,将讲述YTKNetwork源码,上述两篇分别讲述AFNetworking源码解析以及结合自己项目封装AFNetworking. AFNetworking源码解析:https ...

  5. Python爬虫之诗歌接龙

    介绍   本文将展示如何利用Python爬虫来实现诗歌接龙.   该项目的思路如下: 利用爬虫爬取诗歌,制作诗歌语料库: 将诗歌分句,形成字典:键(key)为该句首字的拼音,值(value)为该拼音对 ...

  6. 推荐数据库、Web、Net、架构的PDF数据,书不在多,在看!

    先收藏,后看:千万不要做一个屯书的人,一定要坚持有选择性的看下去: 数据库类 SqlServer Oracle .NET  更多... Web  更多... 架构 不刮了,直接可以看到了. 链接: h ...

  7. 如何理解php的依赖注入

    之前写过关于php依赖注入的文章..最近发现有的朋友对这个还是理解模糊,在这里我想写个简单的实例帮助朋友们理解下...传统的思路是应用程序用到一个A类,就会创建A类并调用A类的方法,假如这个方法内需要 ...

  8. pullMsg有感

    开发功能过程中,始终会有些东西是确认的,比如美丑.业务是否合理.对错. 如果明知道不合理,却按照已有规定.框架.设计去开发,其实是不够职业. 好的做法是朝对的方向去push,并落地: 次之是去push ...

  9. Java马士兵高并发编程视频学习笔记(一)

    1.同一个资源,同步和非同步的方法可以同时调用 package com.dingyu; public class Y { public synchronized void m1() { System. ...

  10. blfs(systemd版本)学习笔记-编译安装配置dhcpcd

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! dhcpcd项目地址:http://www.linuxfromscratch.org/blfs/view/stable-syst ...