【厚积薄发】LuaJIT性能热点函数优化

1)LuaJIT性能热点函数优化
​2)Unity 2019.4打包Android疑问
3)RenderTexture.GetTemporary报错问题
4)WaitForTargetFPS耗时过高
5)ParticleSystem.Main的有效性html


这是第214篇UWA技术知识分享的推送。今天咱们继续为你们精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。android

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)ios

Script

Q:咨询项目中的这个函数耗时很是严重,有什么优化的方法吗? git

A1:这个是table.get,对应获取字段或者访问数组时调用的函数:github

  1. 优先使用连续数组而不是英文名字段,能够显著提高访问效率并下降内存消耗,不少团队喜欢使用Class的写法,能够这样改造:
    local obj = ClassA.New()
    obj.abc = 1
    obj.cde = "test"
    变成:
    local obj = ClassA.New()
    obj[1] = 1
    obj[2] = "test"
    这个方法能够针对使用频率较高的代码进行改造。
  2. 本身开发工具,在编译Lua以前,将Lua代码中的常量从英文名变量转换为数值,这个能够结合1使用,就能够在开发期写英文名字段名,而后编译时转换为数组。

感谢招文勇@UWA问答社区提供了回答数组

A2:字符串应该是哈希值计算的消耗,这样的开销应该是很频繁地调用了。

感谢王欢@UWA问答社区提供了回答网络

A3:赞成你的观点,但可读性变差了,得不偿失。第二点,可能比较容易出错。

感谢Robot.Huang@UWA问答社区提供了回答app

Build

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问答社区提供了回答

Script

Q:使用GetTemporary这个方法进行图片资源的建立时,发生了这个错误:ArgumentException: RenderTextureDesc width must be greater than zero.

望各位赐教。请问这部分源代码在哪里能够看到?

A:源代码:
https://github.com/Unity-Technologies/UnityCsReference

参数Width不能小于等于0。

感谢羽飞@UWA问答社区提供了回答

Script

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问答社区提供了回答

Script

Q:Main为Struct值类型的只读属性,在不从新设置回对象字段的状况下修改有效。请问各位大佬,在运行时进行属性修改操做时,这种机制的底层实现原理是什么?

A1:能够参考 《Particle System Modules – FAQ》

感谢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(原群已满员)

相关文章
相关标签/搜索