问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

(Unity) 为被 Lua 隔断的 C# 实现添加 Profiler 支持

发布网友 发布时间:2024-10-02 18:51

我来回答

1个回答

热心网友 时间:2024-10-19 23:36

在使用 Unity 项目时,我们通常会选择 Lua 作为更上层的逻辑脚本,以利用其热更灵活性和简化与服务器共享代码与数据。庞巍伟同学的 slua 方案是实践中使用较多的一种 Unity + Lua 集成方案。

当逻辑脚本使用 Lua 时,团队倾向于使用 "较重" 的集成,通过暴露大量引擎接口给 Lua,实现对游戏和引擎的全面控制。然而,当 C#/Lua 的互操作接口增长到数千个,问题就会浮现:C# 和 Lua 之间的交互层对引擎封闭,无法使用引擎内建工具,尤其是 Unity Profiler,跨越宿主和脚本边界。 Unity Profiler 是一个强大的性能分析工具,能帮助我们定位瓶颈,发现潜在的 bug。当遇到 Lua 函数开销大(CPU 或内存 GC Alloc)时,使用 Unity Profiler 的挑战性就在于跨语言边界的影响。

“正常”做法包括查找 C# 代码中的问题调用,翻到对应的 Lua 代码,读取逻辑,为潜在高开销的逻辑添加 Profiler.BeginSample()/EndSample(),再检查 C# 代码中的表现。由于 Lua 代码的 CPU 开销相对较低,主要问题是托管内存分配导致的 GC 卡顿,这些在 C# 代码中生成。这种方法虽然有效,但效率低下,需要在脚本中兜圈子,耗费时间和精力。

在寻找一劳永逸的解决方案时,注意力转向了 AOP(面向切面编程),一种能在不修改目标函数代码的情况下插入所需代码的技术。虽然对于 C# 的 AOP 方法在 Unity 的 mono 中存在局限性,最接近成功的方法是在绑定代码生成时添加 lambda 表达式的包装,然后使用 slua 注册。然而,C# 不支持为 lambda expression 添加 attribute,使得这一方法受限制。

面对此问题,我找到了解决方案:通过修改 slua 代码生成,将采样代码直接生成到接口绑定函数中。找到普通函数接口生成的位置,在头尾添加对应的生成代码,如 BeginSample() 和 EndSample() 的调用,可以实现这一目的。对于粒度控制需求,可以通过筛选参数来仅为特定类和函数生成代码,以实现更灵活的定制。

通过上述方法,我们能够解决 Unity 项目中 C# 和 Lua 之间的互操作性问题,特别是有关 Unity Profiler 的使用困难。这种方法不仅简化了流程,而且提高了效率,有助于更有效地分析和优化性能。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
挖矿笔记本电脑一般什么配置 ...全五分截图就可以返现两元,可是我截图了发了好评,他们就问我支付宝... 桂林数之城澜庭值得买吗? 华联都市澜庭可以买吗 云荟澜庭可以买吗 海和澜庭值得买吗 澜庭雅致能买吗 仿"瞧"写四个与"看"有关的词 用目旁表示眼的器官的字有那些 用瞅,瞧,盯,瞪,眺,瞥填空。你不要一直怎么着我,我又没做错事 一些新潮的Unity热更方案 Lua的编译和反编译 小腿抽筋,好了之后腿肚子很痛,都痛了好几天了,怎么办啊? 小腿肚抽筋的那根神经,现在弯腿的时候从膝盖到小腿肚疼不能弯腿是什么... 2024年农历四月初六是黄道吉日吗为什么 生肖属鸡2023年农历四月提车黄道吉日一览表本月宜提车好日子?_百度知 ... 毕业办报到证都需要什么啊 为什么腌萝卜水分会流失 我10年大学毕业,毕业前找个了大连单位签了就业协议,后来又解除了协议... 苹果手机怎么使用google地图 请问:在什么地方能找到军人本色的FLASH动画素材 在FLASH比赛中要注意什么 阳光透明flash素材 Flash专栏教程素材大放送 人口密度是我国50多倍的新加坡,为何每人都有房住?还没房奴? 新加坡人多地少,为何没有出现高房价的情况,人人都能买得起房? 我是今年的大专毕业生以后想从事机械工程师如何起步,做什么样的工作 2020四川南充蓬安县可以补缴中断的保险吗? 上通宵班喝什么提神 上网通宵喝什么提神好,不打瞌睡的,而且第二天也不大课睡,咖啡和茶就... VScode lua开发中的一些调试问题 使用Mono.Cecil实现IL代码注入 丹水坑风景区有哪些交通方式 一个人去黄埔丹水坑风景区穷游,应该怎么做攻略? 广州南站丹水坑怎么走 丹水坑路1111号(丹水坑风景区内)怎么去 从广州火车站总站到丹水坑怎么坐公交车,最快需要多久 理财的好习惯是什么 汉语言文学和汉语言文学(师范)的区别是什么? 汉语言文学(师范类)和汉语言文学(非师范类)有什么区别啊?学习的内容... 苗而不秀说的十二生肖中哪一个? 淘宝怎么批量下架宝贝 基金的 单位净值&累计净值的问题?? 王者人是什么意思? 薄樱鬼同人游戏邂逅求助! 收图收图,各种收图各种打包,free黑子巨人妖狐绯色的欠片薄樱鬼等等 谁有土方岁三这个同人游戏?是BL的,不知道叫什么名字,有的请发我邮箱244... 为什么谭杰希的西米露应援色和王乃恩的乃粉的应援色是黄色 国风毛衣图是谁绘的 琥珀酸-Q还原酶珀酸的详细说明