干掉Unity3D
我为什么想干掉Unity3D?
这个问题容我不答,每个做技术的人总有一些完美主义。
你使用u3d的过程中是不是痛并快乐着呢。
就从两个国内具有相当普遍性的痛点说起。
- il2cpp,unity作出了这个决策以来,导致每个程序员都拥有了大姨妈,每当接入ios平台,就得再死上一次。每当看一眼打出来的包的容量,就会有一种压力山大的感觉。
- unity的底层c++ api没有公开,如果想要接入脚本层,只能通过dotnet进行互操作,导致u3d平台上难以实现比较完美的脚本方案。首先性能就是一个问题
还有第三个痛点,一直是我的一块心病。Unity不能在手机平台断点调试,本来断点调试作为程序员的最后手段,居然被剥夺了。很是担忧。
痛点这么多,还一直赖在Unity3D,又是为什么呢
因为unity3d还有一些优点,太过于吸引人。
- 成熟、稳定(稳定要打个折扣)的IDE
- 多平台一键发布(IOS这个一键也差了一点,是发布为xcode项目)
- C#语言buf加持
有没有可能解决痛点,保持优势?
当然有
让我们看一下unity3d的架构,这是个我随便画的示意图
Unity3d的架构是以c++编写的引擎框架为基础,这里很传统。
反传统之处在于unity3d完全将所有的接口置于monoruntime之后,unity本身的部分功能也是由dotnet开发,比如unityengine.ui
用户代码更是完全限制为使用dotnet开发。
虽然unity提供了plugin机制,可以用其他语言混编,但是这些插件均无法访问unity底层c++代码(或许可以,我没有见到任何资料)。
这导致了unity无法高效的接入c++实现的脚本语言,lua在unity的实际表现有目共睹。
这是痛点2的原因,痛点1是unity自己作死,不多说。痛点3也是unity工作没有做好。
解决痛点
有没有一个架构,可以解决痛点123呢,答案是有。
基于xamarin方案,android、ios平台均可断点调试
底层代码同时对monoruntime和脚本层公开接口,可以插入c++实现的各种脚本,比如lua,并取得原生性能。
用户代码分为dotnet 和 脚本两种,两者之间不互访,通过底层接口互发消息。
Il2cpp自然也不用担心。
还有附加的好处,c# 5.0走起。
Xamarin平台上现有monogame,他是都在monoruntime之后实现的,调用otk,也不能提供原生性能,也不可以插入原生脚本。
该方案实现在于:
- 为xamarin编写不同平台的原生插件,主要是绘图、音效、触摸、键盘这些底层公开接口。主要是ios、android、当然pc也要,pc可以不用xamarin,改为windows+vs,这样在windows调试更给力。
- P/invoke导出到dotnet,对接什么脚本层也做对应导出。
这样重度用户代码用dotnet编写,轻度易变代码用脚本编写,轻度代码为资源,任何平台均可实现下载执行。
保持优势
- c#加持,更优了,unity整合c# 3.5,xarmarin整合c# 5.0,你还想说什么。
- 多平台一键发布,这个xamarin没有做,需要我们自己做。
- 成熟稳定的场景编辑器,这个需要我们自己做。
场编怎么做,抄袭unityeditor,unityeditor这个脚本扩展比较方便,抄。
一键发布怎么做。在android很容易,我们已经做了原理测试程序,弄个模板apk文件,解包,把资源放进去,再重新打包签名,已经完全实现了。
Android上面的dotnet用户代码我们也一键编译成dll当资源放了进去,因为android上monoruntime用的jit,很容易实现。
在ios一键发布要麻烦一点,需要用monoaot 将dotnet用户代码编译为.a,再用模板包重签名。说实话aot弄成.a 我不知道怎么弄。Ipa重签名我也不知道怎么弄。
但是aot弄成.a,我们可以找到unity源码学习,我们可以找畅游的引擎源码学习。Ipa重签名,国内一把越狱平台都有这功能,还有个著名的软件iresign,我们去找他的源码学习。至少我们知道方向在哪里。
实现了一键发布,我们还让发布阶段不依赖xamarin了,xamarin仅需要出模板包。
这样也可以帮用户节省一个xamarin授权的费用。
这就是新FB引擎想去的方向。
如果你想支持赞助我们的工作
用支付宝:
lightsever@hotmail.com
李剑英
如果你是想要加入讨论
用QQ群:223823428
干掉Unity3D的更多相关文章
- 总结:Unity3D游戏上线后的流程回顾
原地址:http://unity3d.9tech.cn/news/2014/0127/39748.html 首先.unity 灯光烘焙 :Unity 3d FBX模型导入.选项Model 不导入资源球 ...
- Unity3d 打包时报错 CommandInvokationFailure: Unable to convert classes into dex format. See the Console for details.
今天打包带有Android插件的unity3d 项目是,报错CommandInvokationFailure: Unable to convert classes into dex format. S ...
- Spine输出资源一键入Unity3D工具代码
之前预研过2D骨骼动画编辑工具SPINE,感觉其比cocosStudio及Unity3D自带的骨骼动画编辑器(原生Sprite Tree或Uni2D)要更适合有3DSMax习惯的美术,即Spine更容 ...
- Unity3d学习 预设体(prefab)的一些理解
之前一直在想如果要在Unity3d上创建很多个具有相同结构的对象,是如何做的,后来查了相关资料发现预设体可以解决这个问题! 预设体的概念: 组件的集合体 , 预制物体可以实例化成游戏对象. 创建预设体 ...
- Unity3d入门 - 关于unity工具的熟悉
上周由于工作内容较多,花在unity上学习的时间不多,但总归还是学习了一些东西,内容如下: .1 根据相关的教程在mac上安装了unity. .2 学习了unity的主要的工具分布和对应工具的相关的功 ...
- TDD在Unity3D游戏项目开发中的实践
0x00 前言 关于TDD测试驱动开发的文章已经有很多了,但是在游戏开发尤其是使用Unity3D开发游戏时,却听不到特别多关于TDD的声音.那么本文就来简单聊一聊TDD如何在U3D项目中使用以及如何使 ...
- warensoft unity3d 更新说明
warensoft unity3d 组件的Alpha版本已经发布了将近一年,很多网友发送了改进的Email,感谢大家的支持. Warensoft Unity3D组件将继续更新,将改进的功能如下: 1. ...
- Unity3D框架插件uFrame实践记录(一)
1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它 ...
- Unity3D 5.3 新版AssetBundle使用方案及策略
1.概览 Unity3D 5.0版本之后的AssetBundle机制和之前的4.x版本已经发生了很大的变化,一些曾经常用的流程已经不再使用,甚至一些老的API已经被新的API所取代. 因此,本文的主要 ...
随机推荐
- 深入理解ConcurrentMap.putIfAbsent(key,value) 用法
转自:http://blog.csdn.net/exceptional_derek/article/details/40384659 先看一段代码: public class Locale { pri ...
- 使用手机展示axure
UC浏览器全屏,去地址栏 发布axure选项设置一下:参考http://sowm.cn/yixieshi/article/A752C3309457FBE32A99CA3A6A50B993.html 启 ...
- 解决ScrollView 嵌套 GridView 单行显示问题
简单重写GridView package com.hh.beauter.my_ui; import android.content.Context; import android.util.Attri ...
- ASP.NET 一句代码实现批量数据绑定
摘要:对于一个以数据处理为主的应用中的UI层,我们往往需要编写相当多的代码去实现数据绑定.如果界面上的控件和作为数据源的实体类型之间存储某种约定的映射关系,我们就可以实现批量的数据绑定,作者开发了的插 ...
- 《DSP using MATLAB》示例Example5.21
- TAQSkinScrollBar 类美化滚动条再讨论
再说:TAQSkinScrollBar 类美化滚动条,http://www.138soft.com/?p=156 里面有人提到不可以滚动 滚动的改善方法: unit AQSkinScrollBar; ...
- WebRTC通信流程
WebRTC是HTML5支持的重要特性之一,有了它,不再需要借助音视频相关的客户端,直接通过浏览器的Web页面就可以实现音视频对聊功能.而且WebRTC项目是开源的,我们可以借助WebRTC源码快速构 ...
- iOS 面试总结 二
1.用三种方法生成内容为数字 1,2 ,3 的可变数组.(使用Objective-C,尽量一行代码实现) //方法一 NSMutableArray *arr1 = [[NSMutableArray a ...
- 异常处理_Maven多模块web项目整合ssm+dubbo
异常如下: [ERROR][org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader. ...
- java并发之volatile
volatile是轻量级的synchronized,它在多处理器应用开发中保证了共享变量的“可见性”(可见性指当一个线程修改共享变量后,其它线程可以看到这个修改). volatile如果使用合理会比s ...