關於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問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5eec64f9ea02f0538ce31716


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問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5eda0243eab6db1f8238a372


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問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5ee195b1299ada7c8f9c2590


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問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5ee1a39a6a5b507cc4513c86


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問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5ee21955cb30182b94d10fcf

封面圖來源於網絡


今天的分享就到這裏。當然,生有涯而知無涯。在漫漫的開發週期中,您看到的這些問題也許都只是冰山一角,我們早已在UWA問答網站上準備了更多的技術話題等你一起來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官網:www.uwa4d.com
官方技術博客:blog.uwa4d.com
官方問答社區:answer.uwa4d.com
UWA學堂:edu.uwa4d.com
官方技術QQ羣:793972859(原羣已滿員)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章