[原]C#与非托管——动机
Unity3D采用C#作为脚本开发语言,本来是可以直接提供代码局部更新机制的,可惜Mono和Unity3D迫于苹果的压力,在iOS上采用AOT模式运行,断绝了代码局部更新的路(任何一个具有很高知名度的引擎都不敢明着违反苹果的条款),而Android的代码局部更新则被Unity3D做成了一个收费的售后服务项目。不过不是跨平台的机制都没有多大的意义,所以如果需要局部更新代码(大家也都称为热更新),一般都需要采用脚本的方式,把大部分游戏内逻辑特别是变化很大的逻辑写在脚本里面,然后把脚本作为资源来做局部更新。
让Unity3D支持脚本有两种方案:
1. 使用不含动态生成代码的C#子集实现一个脚本解释器,典型实现有C#Light、KopiLua和UniLua;
2. 使用P/Invokes让C#能够调用已有的C/C++脚本解释器,典型实现有ulua、slua。
由于C#的语法特性较多,C#Light不太可能也没有必要实现所有的C#特性(如泛型),因此按照C#的编程习惯比较容易遇到不兼容的问题需要调试或重写。虽然说减少了学习成本(不需要学习新的语言,直接以Unity3D支持C#进行开发),但各种不支持的特性也算是一个很大的记忆负担。后来升级版的L#作者直接解析IL,编译直接利用VS的编译器,总算走出了语法解析的泥潭,但还是有很多特性不支持(目前已知的有引用、泛型、继承等)。此外C#对基础操作(比如读取内存偏移)性能较低,在做虚拟机时对脚本自身的运算效率低下。
应该是最早出现的Unity3D支持lua的库了,不过作者自己就说了,是对着lua源代码line by line从C源码port到C#的,而且lua的C源码里面大量使用了宏在C#里面只能是函数调用,所以性能低下是可以预见。
专门用C#重写的lua虚拟机,如字符串之类的直接使用了C#原生类,效率还算不错。不过升级到lua5.2了,有人喜欢有人不喜欢吧。
后起之秀,配合上类似tolua++的代码预生成性能非常优越,瓶颈在于C#调用C/C++的native接口,所以交互部分需要精心设计,之后游戏逻辑就和开发quick-cocos-x游戏差不多了。
无论是直接使用ulua还是自己进行封装,ulua的实现以及C#的非托管调用都是必须了解的。因此接下来我会陆续写一些这方面的内容,备忘的同时方便他人~
[原]C#与非托管——动机的更多相关文章
- [原]C#与非托管——封送和自动封送
之前说到了如何从C函数声明通过简单的查找替换生成一份C#的静态引用声明(C#与非托管——初体验),因为只是简单说明,所以全部采用的是基础类型匹配和自动封送.自动封送虽然能省去我们不少编码时间,但如果不 ...
- [原]C#与非托管——初体验
P/Invokes初看起来非常简单,利用DllImport进行extern函数的声明,程序就可以在调用extern函数的时候自动查询调用到对应的非托管函数,有些类似Java的native函数,但更为简 ...
- 捕获arm非托管磁盘虚拟机,并进行还原
背景:非托管磁盘虚拟机"hlmcen69n1",附加了一块100GB的数据磁盘.由于arm非托管磁盘机器无法通过Portal界面直接"Capture",故只能通 ...
- Azure 托管镜像和非托管镜像对比
目前中国区 Azure 也已经可以使用命令制作托管镜像了.但对于托管镜像和非托管镜像,就像托管磁盘和非托管磁盘一样,很多人可能一开始无法理解.这里就此进行了一个简单对比: 通过对比测试,这里总结了这两 ...
- SQL 横转竖 、竖专横 (转载) 使用Dapper.Contrib 开发.net core程序,兼容多种数据库 C# 读取PDF多级书签 Json.net日期格式化设置 ASPNET 下载共享文件 ASPNET 文件批量下载 递归,循环,尾递归 利用IDisposable接口构建包含非托管资源对象 《.NET 进阶指南》读书笔记2------定义不可改变类型
SQL 横转竖 .竖专横 (转载) 普通行列转换 问题:假设有张学生成绩表(tb)如下: 姓名 课程 分数 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 ...
- Oracle Data Provider for .NET的使用(托管与非托管(一))
目录 简单的概述 简单的使用 非托管系统要求 托管驱动系统要求 其它的注意事项 ODP.NET版本说明 安装ODP.NET 安装非托管驱动 非托管驱动绿色配置 简单的概述 ODP.NET的含义是 Or ...
- 托管调试助手 "PInvokeStackImbalance":的调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管
在C#中一定要检查引用时的数据类型 WinAPI 的数据类型 默认是32位的,但是引用时外部的是 Long类型默认是64位的.所以引用时需要将 long 改为 int 型. 参照 http://blo ...
- CSharpGL(36)通用的非托管数组排序方法
CSharpGL(36)通用的非托管数组排序方法 如果OpenGL要渲染半透明物体,一个方法是根据顶点到窗口的距离排序,按照从远到近的顺序依次渲染.所以本篇介绍对 UnmanagedArray< ...
- 关于C#调用非托管动态库方式的性能疑问
最近的项目中,因为一些原因,需要C#调用非托管(这里为C++)的动态库.网上喜闻乐见的方式是采用静态(DllImport)方式进行调用.偶然在园子里看到可以用动态(LoadLibrary,GetPro ...
随机推荐
- 在vi或者vim中显示行号
1. 为了显示行号,在vi/vim编辑器中执行一下命令中的一条 :set number 或者 :set nu 2. 为了关闭行号,在vi/vim编辑器中执行下面命令 :set nu! 如果你想要每次启 ...
- 安装msdn出现的问题及解决
安装msdn出现的问题及解决 用xx.iso 镜象文件安装 运行第一个镜象文件的setup.exe安装到一部分提示:安装程序无法打开文件 C:\Documents and Settings\empty ...
- Win32/MFC/COM学习推荐书籍
以前有不少朋友问关于学习各种技术的推荐书籍的问题,这里把我觉得比较好的一些书籍列一下,希望能起到抛砖引玉的作用就好了:) Win32开发 Programming Windows by Charles ...
- 连连看的原生JS实现
那天闲来无事,便想找个小游戏来打发时间,后来便找到了连连看, 玩了一会儿感觉无聊,想到各位高手用JS做的各种小游戏,便想自己也来做一个,于是便有了这几天的成果. 代码是用 原生JS 实现的,只是用来学 ...
- 用JS获取地址栏中的参数的简易方法
这个方法用起来超级简单,传入参数即可直接获取地址栏中的参数 代码如下 function GetQueryString(name) { var reg = new RegExp("(^|&am ...
- nodejs的简单爬虫
闲聊 好久没写博客了,前几天小颖在朋友的博客里看到了用nodejs的简单爬虫.所以小颖就自己试着做了个爬博客园数据的demo.嘻嘻...... 小颖最近养了条泰日天,自从养了我家 ...
- JS事件监听器 addEventListener
一:例如:给id为mydiv1的div元素添加click事件监听器document.getElementById("mydiv1").addEventListener(" ...
- Eclipse使用Maven创建Web项目+整合SSM框架
一.准备环境: maven:apache-maven-3.2.3 jdk:jdk1.8.0_25 tomcat:tomcat-9.0 二.配置Maven.jdk 1.Window——>Prefe ...
- python 的正则表达式 贪婪模式与懒惰模式
正则表达式中用于表示匹配数量的元字符如下: ? 重复0次或1次,等同于{0,1} * 重复0次或更多次,等同于{0,} + 重复1次或更多次,等同于{1,} {n,} 重复n次及以上 上面的表示匹配次 ...
- Java对象序列化
Java 1.1增添了一种有趣的特性,名为“对象序列化”(Object Serialization).它面向那些实现了Serializable接口的对象,可将它们转换成一系列字节,并可在以后完全恢复回 ...