关于Texture2D Crunched压缩格式
Posted uwatechnologies
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Texture2D Crunched压缩格式相关的知识,希望对你有一定的参考价值。
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(原群已满员)
Texture
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问答社区提供了回答
Script
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问答社区提供了回答
Shader
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问答社区提供了回答
Build
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问答社区提供了回答
Editor
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(原群已满员)
以上是关于关于Texture2D Crunched压缩格式的主要内容,如果未能解决你的问题,请参考以下文章