1)关于 Texture2D Crunched 压缩格式
2)Unity 自身 GC 和.NET 的 GC 如何协调工作
3)关于环境光照球面坐标映射 2D 贴图 UV 的某算法的疑问
4)iOS 审核 dlopen、dlsym 风险
5)Unity 2018.4 在 iOS 上压缩贴图用的是哪个可执行文件
这是第 208 篇 UWA 技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间 10 分钟,认真读完必有收获。
UWA 问答社区:answer.uwa4d.com
UWA QQ 群 2:793972859(原群已满员)
Q1:关于 Texture2D 的压缩格式设置上,想问一下大家有没有 Crunch ETC2 压缩格式的上线经验。效果如何?
A1:当时是使用的 Unity 4.7,后来翻了 5.6 的源码移植。2017 的算法有了更多的优化。为了解决包体大小的问题,曾经在某上线项目中,将 Crunched ETC2 功能移植到了 Unity 早期的版本中。
使用 Crunched ETC2 压缩后会降低包体的大小,但同时会增加运行时解压缩的时间消耗,总体来说效率影响是比较可控的。不同的贴图使用 Crunched ETC2 会有不同的压缩比,于是对于一类贴图批量控制贴图格式将达到更好的压缩性价比。
当时我们针对部分类型的帖图进行了 Crunched ETC2 的压缩,测试下来的效果是默认开启 Crunched ETC2 整体包体可以优化百分之十左右。其中在三星 Note3 上,单张 512 开启 10 级 Mipmap,解压时耗大约在 2ms 左右。
使用最新的 Unity 引擎启用 Crunched 后将获得更好的效率(Unity 本身也持续有优化。貌似之前 Crunched 的作者已被官方收编)如果对包体大小要求较高,建议可以大胆尝试。
Q2:目前用 Crunch ETC2 算法压缩在安卓平台下一个 2048*1536 的图可以压到 342KB。压缩比例很高,使用的版本用的 Unity 2017 还是更早?
A2:当时是使用的 Unity 4.7 后来翻了 5.6 的源码移植。2017 的算法有了更多的优化。
感谢康斯特@UWA问答社区提供了回答
Q:Unity 有自己的 GC,.NET 也有自己的 GC,两者在游戏运行的时候,是如何协调工作的?
A1:提出这个问题之前,先要搞清楚一个问题:Unity 与 Mono 和.NET 三个概念之间的的关系。
维基百科:
.NET 框架(英语:.NET Framework)是由微软开发,一个致力于敏捷软件开发(Agile Software Development)、快速应用开发(Rapid Application Development)、平台无关性和网络透明化的软件框架。.NET Framework 是一个软件框架,可以理解为对一系列结构和功能的期待。不是一个具体的某个软件。最初有一段时间,.NET 框架只能在 Windows 平台上运行。
Mono 是.NET 运行时和开发库的实现版本,为 C# 脚本提供一个编译器和运行的虚拟机(CLR)。Mono 的初衷是:(1) 使微软.NET 应用可以跨平台运行 (2) 支持.NET 在 Linux 上使用。Mono 比.NET Core 支持更多的平台(如:Linux、FreeBSD、Unix、Mac OS X 和 Solaris)。
Unity 引擎对跨平台特性有很大的需求,于是使用 Mono 提供 C# 等符合 CLI 规范的脚本语言的运行环境。
直观的理解参考下图:
总的来说,Unity 驱动 Mono,为 C# 等提供编译和运行的环境。而 C# 等脚本的 GC 便是由 Mono 的虚拟机提供的。
因此,题主说的 Unity 自己的 GC,和.NET 的 GC,应该是一回事,也就是 Mono 的 GC。(如有错误之处,希望大神指出)
Ref:
https://www.cnblogs.com/shanyou/p/4295163.html
https://www.cnblogs.com/zhujinghui/p/3369217.html
https://zh.wikipedia.org/wiki/.NET 框架
https://en.wikipedia.org/wiki/Mono_(software)
https://www.cnblogs.com/u3ddjw/p/10909975.html上面忽略了 Native 层的内存垃圾,不过 Native 的垃圾回收不存在像 Mono 一样的自动回收机制。需要主动调用 Resources.UnloadUnusedAssets() 来触发。
感谢 Prince@UWA 问答社区提供了回答A2:Unity 里面的 C# GC 是针对代码层的。Unity 的所谓 GC 是针对资源的。
感谢欧月松@UWA问答社区提供了回答
Q:在学习某大作的 Shader 的时候发现类似以下算法,不是很明白这些魔术数字的意义。
float h = pow(tmpvar_50, 2);
h = ((((((((((-0.01213232 * h) + 0.05368138) * h) - 0.1173503) * h) + 0.1938925) * h) - 0.3326756) * h) + 0.9999793) * tmpvar_50;
h += float(absEnvRefzx > 1.0) * (h * -2.0 + UNITY_HALF_PI);
因为是在处理环境贴图的球面坐标映射到 2D 贴图 UV 的地方,目测应该是一些快速三角函数计算,但和找到的几个都对不上。
A:好像是 arctan 的近似公式(0-1 对应角度 0-45 很精确),但没找到相关资料。
https://www.desmos.com/calculator/93qwjpebpu推荐的 arctan 近似公式:
https://stackoverflow.com/questions/42537957/fast-accurate-atan-arctan-approximation-algorithm
感谢羽飞@UWA问答社区提供了回答
Q:在 iOS build 的时候会存在 dlopen,dlsym,dlclose 的函数,断点的时候没有发现调用,有人知道这些函数的作用吗?
问题解决:
Unity 2017.4.20 版本经测试发现 Scripting Runtime Version 使用.Net4.6 的编译会出现 dlopen,dlsys,dlclose 这 3 个有风险的 API。使用.Net3.5 的不存在该问题。
另外在 Unity 2018.4.6 版本中发现使用.Net4.6 并不存在该问题。
这些接口是在 IL2CPP 的 Unity 自动生成的,在空的项目也是存在这个问题的,所以应该不是由于使用 System.IO 中接口导致的。(个人猜想,未证实,如有知道原因,欢迎指出)。
还有渲染的模块也用到了 dlsym dlopen。
A:大致查了一下。
根据这篇文章:https://www.jianshu.com/p/b0ce48a22d61,Unity 本身就带的,在送审标注里说明,但是插件最好去掉。另外自己写的 System.IO 相关的代码不需要的可以检查一下并测试去除。
https://blog.csdn.net/qq_36622009/article/details/103882854
感谢倪帅帅@UWA问答社区提供了回答
Q1:过去用的是 PVRTexTool,但是对 Unity 2018.4,将这个可执行文件删除也并没报任何错误,应该是没有被运行。那么现在 Unity 在压缩 ASTC 的时候,用的是那个 exe 文件呢?
A1:回答如下:
(1)Unity 2018.4 在将 Texture 压缩为 PVRTC 的时候使用的是 PVRTexTool,在进行压缩时,可见进程中多了 PVRTexToolCLI,如图:
(2)Unity 2018.4 在将 Texture 压缩为 ASTC 格式时候,没有使用外部的 exe 文件,因为压缩时系统中进程数量没有增加,而 Unity.exe 的 CPU 利用率增高。
(3)但 PVRTexTool 本身应该是可以用来压缩成 ASTC 格式的,可参考文档:
http://cdn.imgtec.com/sdk-documentation/PVRTexTool.User+Manual.pdf。(4)此外,ARM 提供的 astc-encoder 是 ASTC 数据格式的压缩器:
https://github.com/ARM-software/astc-encoder。
Q2:在 Mac OS 上测试的结果是:项目中有 PVRTC 贴图,但将 PVRTexTool 改名,Unity 没有任何抱怨。
A2:换一下 PVRTC 贴图的质量(2 bits, 4 bits 等),点 apply,重新压缩,看会不会报错。
感谢题主 Prince@UWA 问答社区提供了回答
封面图来源于网络
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在 UWA 问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之 “石”,也能攻你之 “玉”。
官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA 学堂:edu.uwa4d.com
官方技术 QQ 群:793972859(原群已满员)