littlesome

Results 8 comments of littlesome

补充: 造了个神奇的玩意儿,然而发现Unity里ConditionalWeakTable支持的不好 ```cs static ConditionalWeakTable refTable = new ConditionalWeakTable(); public static void RefJSObject(this object o, Action callback) { refTable.Add(o, callback); } ``` ```TypeScript class MyNodeData extends System.Object { constructor() {...

@Joycraft 例子仅仅是为了说明这个问题,实际情况可能继承后添加很多JS这边特有的数据类型的成员. 一方面C#这边不好表达这些类型,另一方面不能总是修改C#代码. 想讨论一下这种继承能否很好的支持起来, 如果不能支持怎么告知使用者不要这样用.

需求: 用JS扩展C#类, JS部分要随C#对象一起销毁 ConditionalWeakTable的想法是给任意C#对象引用一个JS对象(通过JS函数捕获JS对象,然后通过Action让C#这边持有它的引用) 遇到的问题是: 1. ConditionalWeakTable mono下的实现似乎有问题 https://github.com/mono/mono/issues/13560, il2cpp下未验证 ConditionalWeakTable不支持, 可以自己用WeakReference配合Tick检测实现类似效果 2. 产生了循环引用: ObjectPool引用C#对象, 必须等JS对象销毁; 而JS对象被Action引用, Action在WeakTable里被C#对象引用; 一个可能的解法: 添加到WeakTable的时候, 把ObjectPool里的变成若引用. 这样C#对象就能被释放, 从而打破循环引用. @chexiongsheng

@Joycraft 可能例子没说清楚,rootNode是树控件的一个成员,不是临时的,而rootNode引用了node,node引用了userData; 从JS的使用角度只要rootNode不清空,userData就不应该被回收 --- node.userData = userData; 关键是这一句,目前的实现是“只会提取userData的C#部分进行赋值,JS部分不产生引用”,这个不符合JS用户的使用习惯,容易造踩坑

Same issue, Maybe currently a workaround: start a simple local http server, play video by url like http://127.0.0.1:port/video001.mp4, on http request, feed you video buffer

收到, 我们这边测试下来 `libxlua.so` vs `xlua.a (link to libil2cpp.so)` 性能差异不大,静态链接到libil2cpp.so中反而会略慢一点 但是发现il2cpp在arm64下(C++ Compiler Configuration选Master)居然也没有开启lto,需要进一步测试强制开启后的效果

测试结果: ![94EQPIFVL}D~(`R@WZ P$7L](https://user-images.githubusercontent.com/7804648/226524278-27ba0fd1-890b-41fb-b01c-6739fcc11acd.png) 发现静态编译+开启lto之后性能提升较大(最后2个下降了原因待查),测试环境: * Unity 2019 + xLua (lua5.3.5) + android-ndk-r19 * PlayerSettings C++ Compiler Configuration 设置为 Master * 测试设备:Pixel 4(Android 10) * 测试架构:arm64-v8a * 调用次数改为200w次 开启lto相关改动: 1. xLua...

``` function __adapter_init_js() { System.__proto__.createScript = function(e) { var t = __adapter_get_script(e.replace(__adapter_get_base_url(), "")); var s = document.createElement("script"); setTimeout(() => { eval(t); s.dispatchEvent(new Event("load")); }); return s; } } ``` try...