-
Notifications
You must be signed in to change notification settings - Fork 3
Unity uLua
#原理相关
U3D为何能跨平台,简而言之,其实现原理在于使用了叫CIL(Common Intermediate Language通用中间语言,也叫做MSIL微软中间语言)的一种代码指令集,
CIL可以在任何支持CLI(Common Language Infrastructure,通用语言基础结构)的环境中运行,就像.
NET是微软对这一标准的实现,Mono则是对CLI的又一实现。
由于CIL能运行在所有支持CLI的环境中,例如刚刚提到的NET运行时以及Mono运行时,也就是说和具体的平台或者CPU无关。这样就无需根据平台的不同而部署不同的内容了。所以到这里,各位也应该恍然大了。代码的编译只需要分为两部分就好了嘛:
1.从代码本身到CIL的编译(其实之后CIL还会被编译成一种位元码,生成一个CLI assembly)
2.运行时从CIL(其实是CLI assembly,不过为了直观理解,不必纠结这种细节)到本地指令的即时编译(这就引出了为何U3D官方没有提供热更新的原因:在iOS平台中Mono无法使用JIT引擎,而是以Full AOT模式运行的,所以此处说的额即时编译不包括IOS)
当然看官博的文章,他们似乎也在开发自己的“mono”,也就是被称为脚本的未来的IL2Cpp,这种类似运行时的功能是将IL再编译成c++,再由c++编译成原生代码,据说效率提升很可观,
Lua
LuaJIT is a Just-In-Time Compiler (JIT) for the Lua programming language
LuaInterface is a library for integration between the Lua language and Microsoft .NET platform's Common Language Runtime (CLR)
Lua + LuaJIT + LuaInterface
cstolua-》最初基于ulua,现在优化的很棒和ulua关联已不多的一个基于静态导出的lua绑定
@Chiuan 老大,我用了一个线程专门负责读取socket数据,其它平台都没有问题,就是在ios平台上不稳定,在数据量偏大的时候,线程跑几分钟或者时间分钟状态就变为stopped了,也没有抛任何异常。是unity中有什么未知规定吗? 10:08:39
【吐槽】诚心诚意 2016/1/9 10:08:39 il2cpp的iosapp 如果线程使用lock ,当socket断了,线程也会停
【吐槽】诚心诚意 2016/1/9 10:11:42 之前4.6.8是这样的
@诚心诚意 谢了。应该不是这个原因。
【传说】Chiuan 2016/1/9 10:52:03 @IndexOne socket你用c#那个完成端口异步回调就行了。
【活跃】IndexOne
@Chiuan 好。
//////////////////////////////
【传说】骏擎【CP】 2016/1/9 10:14:17 发现xcode build 静态库的时候没有发现优化等级选项optimization level 10:15:53 【传说】骏擎【CP】 2016/1/9 10:15:53 找到了
./1.png
【活跃】IndexOne 2016/1/9 10:20:44 @骏擎【CP】 用ulua 选择 smallest 在ios64上部分功能会有闪退。选择none就不会出现。
【传说】骏擎【CP】 2016/1/9 10:22:17 smallest 可能有些API给优化掉了 【传说】骏擎【CP】 2016/1/9 10:22:23 我现在在看这个事情 【传说】骏擎【CP】 2016/1/9 10:23:00 少跟安卓上 LOCAL_WHOLE_STATIC_LIBRARIES += libluajit 【传说】骏擎【CP】 2016/1/9 10:23:14 如果能找到基本应该没啥问题 10:31:09 【传说】骏擎【CP】 2016/1/9 10:31:09 安卓下已经启用-O3优化,iOS下 -Os 用的是-O2 【传说】骏擎【CP】 2016/1/9 10:32:20 安卓加了个-mfloat-abi=soft,其将调用软浮点库(softfloat lib)来支持对浮点的运算 【传说】骏擎【CP】 2016/1/9 10:32:40 -mfloat-abi=softfp 【传说】骏擎【CP】 2016/1/9 10:33:34 -Os相当于-O2.5。是使用了所有-O2的优化选项,但又不缩减代码尺寸的方法
./2.png
把这个优化选项关掉,然后选择-O3 【传说】骏擎【CP】 2016/1/9 10:41:32 应该就能OK了 【活跃】IndexOne 2016/1/9 10:42:17 好,我试试。我的ulua框架是11份的,应该可以把? 【传说】骏擎【CP】 2016/1/9 10:42:27 没关系, 【传说】骏擎【CP】 2016/1/9 10:42:58 Dead Code Stripping选项就是安卓上 LOCAL_WHOLE_STATIC_LIBRARIES 10:43:25 【活跃】IndexOne 2016/1/9 10:43:25 嗯
【传说】骏擎【CP】 ios闪退是N多原因, 10:51:37 【传说】骏擎【CP】 2016/1/9 10:51:37 如果你们自己编译的底层库不想闪退,可以选择None 【传说】骏擎【CP】 -O0 【传说】骏擎【CP】 2016/1/9 10:52:22 如果再闪就是别的地方原因跟这里没关系
./3.png 修改后跟之前的
【传说】骏擎【CP】 2016/1/9 10:55:59 估计之前的Dead Code都进来了 【传说】骏擎【CP】 2016/1/9 10:55:59 不过不是-Os,换成-O3了 10:59:43 【传说】骏擎【CP】 2016/1/9 10:59:43 尺寸大点无所谓,效率再高点,稳定点,也值了
【传说】骏擎【CP】 晕 intel x86 竟然不支持-mfloat-abi=softfp 【传说】骏擎【CP】 2016/1/9 11:03:11 先改armv7-a吧
【传说】骏擎【CP】 发现框架在-O3模式下会异常 【传说】骏擎【CP】 2016/1/9 13:15:28 默认的 -Os下很正常
Unity动态字体文字破碎的解决方法(Dynamic Font Broken)
战斗回放
我们从包内解压到包外 ,都需要30秒左右。 如果是Android包就需要解压,如果是ios包就直接拷贝出来。
【传说】骏擎【CP】 @Keyboard_NOW 没必要,可以直接读取包内资源,如果有更新直接下载,再读取手机磁盘的,这样会加快N倍。
我现在都不解出来了 直接就放在streamasset文件夹里面
读取的时候判断persist有就读persist 没有就读streamasset
就是读取的时候多一个 文件exit的判断
//////////////////////////
./4.png
第一次更新下载要放在temp目录~要不会被草果拒。
以后热更新的所有东西都不能放在persitentPath?
TEMP文件夹再清理的时候会被删除
苹果好像有这个说法 @Oliver 不会吧?我们还是放在persistent下的,没有被拒呢。
如果应用第一次下载很大。。就会被拒 如果你审批过程中不下载,他不知道就不会被拒 按苹果的说法。。放在persistentDataPath目录是会被自动同步到icloud的。。。。
有个api可以禁用同步icloud吧。。。 编译的时候可以禁止同步吧
https://developer.apple.com/library/ios/qa/qa1719/_index.html 这个可以解决。过滤同步的目录。
Application.persistentDataPath感觉用Application.temporaryCachePath代替也可以。
禁止上传到 icoud UnityEngine.iOS.Device.SetNoBackupFlag(Util.dataPath)
prevent data from being backup on icloud
/////////////////////////////////////
uLua 相关学习笔记
uLua+SimpleFramework常见问题的解答及学习笔记
Xcode Debugger console reports: ExecutionEngineException: Attempting to JIT compile method ‘(wrapper native-to-managed) Test:TestFunc (int)’ while running with –aot-only ?
Typically such message is received when managed function delegate is passed to the native function, but required wrapper code wasn’t generated when building application. You can help AOT compiler by hinting which methods will be passed as delegates to the native code. This can be done by adding “MonoPInvokeCallbackAttribute” custom attribute. Currently only static methods can be passed as delegates to the native code.
Sample code:
using UnityEngine; using System.Collections; using System; using System.Runtime.InteropServices; using AOT;
public class NewBehaviourScript : MonoBehaviour { [DllImport ("__Internal")] private static extern void DoSomething (NoParamDelegate del1, StringParamDelegate del2);
delegate void NoParamDelegate ();
delegate void StringParamDelegate (string str);
[MonoPInvokeCallback(typeof(NoParamDelegate))]
public static void NoParamCallback() {
Debug.Log ("Hello from NoParamCallback");
}
[MonoPInvokeCallback(typeof(StringParamDelegate))]
public static void StringParamCallback(string str) {
Debug.Log(string.Format("Hello from StringParamCallback {0}", str));
}
// Use this for initialization
void Start() {
DoSomething(NoParamCallback, StringParamCallback);
}
}
【潜水】通背猿猴 lua 中想调用 c# 的泛型方法,这个怎么破?
_GT (typeof(DG.Tweening.Core.TweenerCore<Quaternion, Vector3, DG.Tweening.Plugins.Options.QuaternionOptions>)).SetWrapName("TweenerCore_Q_V_Q"),
吐槽】木心干 问个问题: internal void collectObject(int udata) { object o; bool found = objects.TryGetValue(udata, out o);
// The other variant of collectObject might have gotten here first, in that case we will silently ignore the missing entry
if (found)
{
objects.Remove(udata);
if (o != null && !o.GetType().IsValueType)
{
objectsBackMap.Remove(o);
}
}
}
为什么只有非ValueType的对象才会从objectsBackMap中清除?
valuetype 是值类型。 【唠叨】 kubility 2016/1/19 21:50:08 非valuetype就是引用 【唠叨】 kubility 2016/1/19 21:50:44 值类型与引用类型共有的基类是object,然后值类型继承valuetype ,valuetype继承object 【唠叨】 kubility 2016/1/19 21:50:56 只是个缓存池而已
【吐槽】木心干 嗯,但是奇怪的是下面的添加: public static void Push(IntPtr L, System.Enum e) { LuaScriptMgr mgr = GetMgrFromLuaState(L); ObjectTranslator translator = mgr.lua.translator; int weakTableRef = translator.weakTableRef; object obj = GetEnumObj(e);
int index = -1;
bool found = translator.objectsBackMap.TryGetValue(obj, out index);
if (found)
{
if (LuaDLL.tolua_pushudata(L, weakTableRef, index))
{
return;
}
translator.collectObject(index);
}
index = translator.addObject(obj, false);
LuaDLL.tolua_pushnewudata(L, mgr.enumMetaRef, weakTableRef, index);
}
【吐槽】木心干 2016/1/19 22:06:44 枚举是值类型,也可以被添加到objectsBackMap中 【吐槽】木心干 2016/1/19 22:07:05 但是不能被清除
//////////////////////////////
最近有人放出一个开源项目 用连线的方式 打assetbundle 依赖包 谁收藏地址了 麻烦再给一下 【唠叨】糖果 2016/1/27 23:18:29 我的哪个? 【唠叨】糖果 2016/1/27 23:18:39 那个 2016/1/27 23:20:41 【活跃】titi 2016/1/27 23:20:41 不知道 当时就看到一眼 没来得及保存 想再看找不到链接了 麻烦你再发一次 【唠叨】糖果 2016/1/27 23:21:15 我是好久以前发的 2016/1/27 23:21:33 【活跃】titi 2016/1/27 23:21:33 求地址 我去看看 【唠叨】糖果 2016/1/27 23:22:04 回家了,没有链接 【活跃】titi 2016/1/27 23:22:30 那明天我pm你求连接 【唠叨】糖果 2016/1/27 23:22:46 我回家了 【活跃】titi 2016/1/27 23:23:32 ......... 2016/1/27 23:23:36 【活跃】titi 2016/1/27 23:23:36 回家过年? 【唠叨】糖果 2016/1/27 23:23:45 是啊 【吐槽】love妖 2016/1/27 23:25:20 @titi 搞到地址麻烦给我一份吧,我也研究研究 【活跃】titi 2016/1/27 23:25:25 哈哈 群聊天记录里搜索到了 【活跃】titi 2016/1/27 23:25:25 https://github.com/unity3d-jp/AssetGraph
http://h00w.gitcafe.io/tags.html#Lua-ref
http://www.xionggf.com/articles/graphic/u3d/u3d_ulua_faq.html#q2
我先导出ecplise工程 然后导入成android studio工程 然后就拿这个工程做模板 以后我就每次导出ecplise工程后 就先复制过来这个as工程 然后把各种文件拷贝进来 然后就命令执行gradle 这样靠谱不
我想用 gradle来自动化打包 不是用ant
命令行打包啊 【唠叨】雷疯(21726248) 0:02:38 我要先导出工程 再打包 【唠叨】不说害怕(335264417) 0:02:39 雷锋牛逼 【唠叨】不说害怕(335264417) 0:02:52 不需要导出工程的 【唠叨】不说害怕(335264417) 0:02:59 你这样麻烦
命令行打包啊 【唠叨】雷疯(21726248) 0:02:38 我要先导出工程 再打包 【唠叨】不说害怕(335264417) 0:02:39 雷锋牛逼 【唠叨】不说害怕(335264417) 0:02:52 不需要导出工程的 【唠叨】不说害怕(335264417) 0:02:59 你这样麻烦
快说啊 不导出工程 怎么改libmono和assembly的dll
打好apk解开替换重新打包 【唠叨】不说害怕(335264417) 0:13:15 双击查看原图 【唠叨】不说害怕(335264417) 0:13:32 jdk命令签名 【活跃】三日月 · ⑨ · 夜空(409396598) 0:13:41 。。。 【传说】Chiuan(121238591) 0:13:45 .... 【传说】Chiuan(121238591) 0:13:55 重新把里面的文件替换? 【唠叨】不说害怕(335264417) 0:14:39 嗯 【唠叨】不说害怕(335264417) 0:15:13 这样你原流程不需变动 【唠叨】不说害怕(335264417) 0:15:31 若有其他不加密工程打包也不影响
这是加密apk的流程? 【活跃】小强(596809147) 0:19:00 大神们 【唠叨】不说害怕(335264417) 0:19:07 是的 【唠叨】不说害怕(335264417) 0:19:24 先正常流程走完,再解开加密 【唠叨】不说害怕(335264417) 0:19:34 再压缩签名 【活跃】小强(596809147) 0:19:59 这样被解开的几率大不大? 【唠叨】不说害怕(335264417) 0:20:14 晕,几率超大 【唠叨】不说害怕(335264417) 0:20:43 但对付一般人够了 【活跃】小强(596809147) 0:21:42 以前我们的apk包加密是给第三方付费加密的,后面启动游戏的时候要等大概10s,我们主策就傻眼了,就下掉了 【活跃】小强(596809147) 0:22:00 现在裸奔双击查看原图 【活跃】小强(596809147) 0:22:08 反正代码自带混淆 【活跃】小强(596809147) 0:22:24 有些代码自带混淆双击查看原图 【活跃】三日月 · ⑨ · 夜空(409396598) 0:23:58 自带混淆太6 233 【唠叨】不说害怕(335264417) 0:25:26 双击查看原图 【唠叨】不说害怕(335264417) 0:25:31 6啊 【唠叨】不说害怕(335264417) 0:25:37 为啥只带混淆 【唠叨】不说害怕(335264417) 0:25:41 咋做到的 【唠叨】不说害怕(335264417) 0:25:48 自带 【活跃】小强(596809147) 0:26:03 现在好多了,抓的严,以前有个关系户,俗称3A哥,只因为有个temp变量命名成aaa,就出名了