1)LuaJIT 性能热点函数优化
2)Unity 2019.4 打包 Android 疑问
3)RenderTexture.GetTemporary 报错问题
4)WaitForTargetFPS 耗时太高
5)ParticleSystem.Main 的有效性
这是第 214 篇 UWA 技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间 10 分钟,认真读完必有收获。
UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)
Q:咨询项目中的这个函数耗时非常严重,有什么优化的方法吗?
A1:这个是 table.get,对应获取字段或者访问数组时调用的函数:
优先使用连续数组而不是英文名字段,可以显著提升访问效率并降低内存消耗,很多团队喜欢使用 Class 的写法,可以这样改造:
local obj = ClassA.New()
obj.abc = 1
obj.cde = "test"
变成:
local obj = ClassA.New()
obj[1] = 1
obj[2] = "test"
这个方法可以针对使用频率较高的代码进行改造。自己开发工具,在编译 Lua 之前,将 Lua 代码中的常量从英文名变量转换为数值,这个可以结合 1 使用,就可以在开发期写英文名字段名,然后编译时转换为数组。
感谢招文勇@UWA问答社区提供了回答
A2:字符串应该是哈希值计算的消耗,这样的开销应该是很频繁地调用了。
感谢王欢@UWA问答社区提供了回答
A3:同意你的观点,但可读性变差了,得不偿失。第二点,可能比较容易出错。
感谢 Robot.Huang@UWA 问答社区提供了回答
Q:Unity 版本由 2018.4.0f1 升级到 2019.4.5f1,其中 Android 的 Custom Manifest、Custom Gradle Template 都拆分为了两个,分别为 Main 和 Launcher。之前对接的各个 Android SDK 感觉需要重新做了。请问有比较熟悉的,可以指点一下这里吗?
我们之前各个 SDK 都是以 JAR 和 AAR 的形式直接放在 Unity 工程内,直接 Unity 出包,现在直接 Build 会有各种报错,感觉是不兼容之前的格式了。
A1:我们也遇到了外部编译的 AAR 内的 Manifest 和 Unity 内的 Manifest 冲突问题。由于 2019 其实是可以直接编译 Java 的,我们干脆取消了外部工程,直接把 Java 代码和 OC 的代码放入 Unity 工程,然后只使用 Unity 内的 Manifest,就没有冲突错误了。
我们项目是 2017 的,当时记得 MM 可以,但是 Java 不行。后来用 2018 开的其他项目因为暂时没遇到类似需求,就没试,最近另外一个项目直接 2019 来做就这样对应了。
感谢黄程@UWA问答社区提供了回答
A2:找了找文档 https://forum.unity.com/threads/using-unity-as-a-library-in-native-ios-android-apps.685195,我们是手动把原来一个 Manifest 文件的内容给拆了一下,LauncherManifest 只放图标和 App Name 相关的设置。
之后有时间也准备试试黄程大佬的方法。
感谢题主张斌@UWA问答社区提供了回答
Q:使用 GetTemporary 这个方法进行图片资源的创建时,发生了这个错误:ArgumentException: RenderTextureDesc width must be greater than zero.
望各位赐教。请问这部分源代码在哪里可以看到?
A:源代码:
https://github.com/Unity-Technologies/UnityCsReference参数 Width 不能小于等于 0。
感谢羽飞@UWA问答社区提供了回答
Q:使用 GPM 查看项目性能,发现 WaitForTargetFPS 耗时太高,均值在 20ms 左右。网上查找说是因为开了垂直同步的问题,按照网上的解决方式重新打包过后,并没什么效果。
A1:在真机上,如果 Application.targetFrameRate = -1 还是会自动与屏幕的刷新率同步,想把这个 “消耗” 降下来,就设置成 144。
其实这个只是 CPU 在等待屏幕刷新,有这个 “消耗” 其实是好事,说明 CPU 和 GPU 的负载不高,发热不厉害。
感谢张首峰@UWA问答社区提供了回答
A2:你可以看看 Unity 官网文档上关于 WaitForTargetFPS 的解释。
https://docs.unity.cn/cn/2019.4/Manual/ProfilerCPU.html#samples-rendering
感谢 tyer@UWA 问答社区提供了回答
Q:Main 为 Struct 值类型的只读属性,在不重新设置回对象字段的情况下修改有效。请问各位大佬,在运行时进行属性修改操作时,这种机制的底层实现原理是什么?
感谢 jim@UWA 问答社区提供了回答
A2:个人理解是,这个是一个包 Property 的结构体。每个 Property 的 Get 和 Set 又指向的内部子模块的参数。
所以操作这些 Property 就直接操作到了内部的子模块。
感谢欧月松@UWA问答社区提供了回答
A3:MainModule 这个结构体就是一个对 Native 接口的封装。
感谢羽飞@UWA问答社区提供了回答
封面图来源于网络
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在 UWA 问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之 “石”,也能攻你之 “玉”。
官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA 学堂:edu.uwa4d.com
官方技术 QQ 群:793972859(原群已满员)