還原堆棧信息,分析地形系統(tǒng)使用ASTC格式的紋理導(dǎo)致Crash的問題

0x00 前言

在這篇文章中,我們選擇了過去一周Unity官方社區(qū)交流群中比較有代表性的幾個問題,總結(jié)在這里和大家進(jìn)行分享。主要涵蓋了IL2CPP、Scripting、Virtual Reality、Graphics、Editor、Terrain、Plugins 、Education等領(lǐng)域,其中會著重介紹一下在原生的地形系統(tǒng)中使用ASTC格式紋理導(dǎo)致Crash的問題。

在文章結(jié)尾處我們還總結(jié)了社區(qū)小伙伴們過去一周在群里分享的一些干貨連接。

同時,也歡迎大家加入我們這個討論干貨的官方技術(shù)群,交流看法分享經(jīng)驗。
Unity官方社區(qū)交流群:629212643

0x01 IL2CPP

Q: 有人遇到過GZipStream在安卓上沒辦法正常工作的問題么?在Editor中工作是正常的。但是在安卓手機上會無法執(zhí)行,查看logcat發(fā)現(xiàn)在執(zhí)行時拋出了下面的異常:

Unable to find MonoPosixHelper
DllNotFoundException: MonoPosixHelper

屏幕快照 2018-07-13 上午11.47.11.png

A: 如果項目的scripting backend使用的是Mono,則在使用System.IO.Compression命名空間時的確會拋出類似上面的異常。但是如果使用IL2CPP的話,System.IO.Compression命名空間是可以正常使用的,包括GZipStream同樣也是可以正常使用的。


屏幕快照 2018-07-13 上午11.50.58.png

0x02 Scripting

Q: 如何求一個數(shù)最大能是2的多少次冪啊? 比如513最大是2的9次冪,就多了一位數(shù). math里有沒有這樣的方法,想要模擬cullingmask那樣的篩選層出來。

A: 用查找表,盡量限制在512之內(nèi)。


10F001F907D2BA03480C0AA0C0DE624B.png

(鄭州(???.????)大FC)

A:

int Exp(int i)
{
    int counter = 0;
    while(i > 1)
    {
        i = i >> 1;
        counter++;
    }
    return counter;
}

void outpuLayers(int layerValue)
{
    
    while(layerValue > 0)
    {
        int i = layerValue;
        int counter = 0;
        while (i > 0)
        {
            i = i >> 1;
            counter++;
        }
        Debug.Log(counter);
        i = 1;
        while (counter > 1)
        {
            counter--;
            i = i << 1;
        }
        layerValue = layerValue ^ I;
    }
}

(南京-科穆寧)

A: 查表法如果要支持20+的layer數(shù),內(nèi)存占用爆炸。位運算log2正解,這里下面也有個例子。
https://stackoverflow.com/questions/13654499/calculating-log-base-2
(上海-Weiqi “Xylt” Gu)

A: 范圍小用查表~ 范圍大用位移 ~ 不要用浮點運算~。(成都-xxp)

0x03 Virtual Reality

Q: 在開發(fā)Windows Mixed Reality時,編輯器會報錯“RenderTexture.GenerateMips failed: render texture does not have mip maps (set useMipMap to true).”這個是一個bug嗎?Unity版本為Unity2017.1.1f1, Unity2017.1.2f1, Unity2017.21f1。


A13A5C9EB89FDAD98828621D7CB75673.png

A: 這的確是一個bug。細(xì)節(jié)可以查看:https://forum.unity.com/threads/beta-7-case-943170-windows-mixed-reality-far-clip-and-rendertexture-generatemips-error.488714/

這個bug已經(jīng)修復(fù)了。但是當(dāng)時還沒有backport到2017.1和2017.2,也就是你用來測試的版本。
推薦你使用2017.4來測試和進(jìn)行開發(fā)。2017.4版本作為一個長期維護(hù)版本,會持續(xù)修復(fù)已經(jīng)知道的bug。

0x04 Graphics

Q: tonemapping和打包設(shè)置里colorspace是沖突的嗎?是不是用tonemapping,colorspace需要改成線性?

A: 用tonemapping的話要用hdr,hdr最好和線性空間一起用,才能保證準(zhǔn)確度。如果你的項目設(shè)置為gamma的話,postprocessing中的color grading會有一個警告的。


屏幕快照 2018-07-13 下午2.32.53.png

Q: 難道我理解錯了。攝像機可以開HDR,但是打包到手機渲染設(shè)置里默認(rèn)是不開的啊 我可不可以 用HDR算出來的結(jié)果 通過mapping 轉(zhuǎn)換成ldr給手機顯示
A: tonemapping的作用也是為了將一個高動態(tài)范圍的顏色數(shù)據(jù)映射回可用顏色空間,為的是不被顯示屏幕截斷色彩。(北京-哎呀)
A: 因為顯示器很少支持hdr,安卓手機更是565顏色居多。tonemap就是一個簡單s曲線remapping。(深圳-topameng)

Q: 攝像機開啟HDR并不表示移動端開啟HDR吧。
A: 手機上不是固定fp16的,可以自己調(diào),如果設(shè)置沒有hdr backbuffer, 你攝像機上的標(biāo)記一點用也沒有。(深圳-topameng)

小貼士

這里可以和大家科普一下Graphic Setting中的各個tier和設(shè)備的對應(yīng)關(guān)系:Graphics Settings內(nèi)的Tier設(shè)置,在運行時會根據(jù)GPU來選擇對應(yīng)的Tier。應(yīng)用相關(guān)的設(shè)置。具體各個Tier和設(shè)備的對應(yīng)關(guān)系如下:

Tier 1:
Android - all devices that have support for OpenGL ES 2 only
iOS - all devices before iPhone 5S (not including 5S, but including 5C), iPods up to and including 5th generation, iPads up to 4th generation, iPad mini first generation
Desktops: DirectX 9, HoloLens

Tier 2:
Android - all devices with OpenGL ES 3 support,Vulkan
iOS - all devices starting from iPhone 5S, iPad Air, iPad mini 2nd generation, iPod 6th generation
AppleTV

Tier 3:
Desktops: OpenGL, Metal, DirectX 11+,Vulkan

具體也可以查閱相關(guān)文檔。

Q: unity自帶的屏幕射線反射效果一般,然后我找了好久,找到一個livenda lab開發(fā)的,居然離屏追蹤,就是現(xiàn)在還沒出成品。有好的推薦嗎?
A: 可以參考群里@上海-CGBull在他的文章中的實現(xiàn)。

Unity_StochasticScreenSpaceReflection-實現(xiàn)篇:
https://zhuanlan.zhihu.com/p/38303394
(北京-小小光)

Q: 我這里想要擾動的方向是隨機的怎么弄啊 在腳本里setfloat感覺是硬切的。


32A41337C2F9B902D9B43EC5D821C34D.png

A: 從一張噪聲貼圖里讀。

15FBFCCBF78868125F605311A25090A9.png

可以看看和失真效果相關(guān)的這篇博客:
https://zhuanlan.zhihu.com/p/37696836。(北京-破曉)

Q: 我想要的就是一團(tuán)紋理在球上面隨機方向位移,并且隨時間變化。
A: 可以參考這篇文章:https://blog.csdn.net/panda1234lee/article/details/52085375
總之采樣的時候以_Time作為種子取個噪聲就行。(北京-破曉)

Q: 有人實現(xiàn)過手機上面能用的雪地踩踏效果嗎?主美還想著要那種曲面細(xì)分的效果。。。戰(zhàn)神 古墓麗影。。。
A: 思路并不復(fù)雜。簡單的說, 就是Mesh變形。

1372105-c552ebae7261538b.gif

至于古墓麗影的那個案例,之前@逍遙劍客 也在知乎上分享過。http://tombraider.tumblr.com/post/131825841425/dev-blog-snow-tech-and-houdini-simulations-mike

A: https://www.cnblogs.com/murongxiaopifu/p/7887614.html (北京-suzakul)

0x05 Editor

Q: 求教animationclip的inspector上顯示的該資源的內(nèi)存占用大小數(shù)據(jù)是如何獲得的?
屏幕快照 2018-07-14 下午8.50.47.png

A: 你可以調(diào)用AnimationUtility.GetAnimationClipStats(clip)來獲取某個clip的status,即AnimationClipStats類的實例,其中的size字段即inspector上顯示的內(nèi)存占用大小??梢詤⒖枷旅娴拇a:

        Assembly asm = Assembly.GetAssembly(typeof(Editor));
        getAnimationClipStats = typeof(AnimationUtility).GetMethod("GetAnimationClipStats", BindingFlags.Static | BindingFlags.NonPublic);
        Type aniclipstats = asm.GetType("UnityEditor.AnimationClipStats");
        sizeInfo = aniclipstats.GetField("size", BindingFlags.Public | BindingFlags.Instance);

另外,c#部分的代碼其實有開源的。你也可以參考github上的代碼:https://github.com/Unity-Technologies/UnityCsReference/blob/3cfc6c4729d5cacedf67a38df5de1bfffb5994a3/Editor/Mono/Inspector/AnimationClipEditor.cs

0x06 Terrain

Q: 有人遇到過地形上用的紋理的紋理格式設(shè)置為astc,在手機上會崩潰的問題嗎?我的unity版本是2018.1。

A: 遇到過這個問題。我下午也做了一些測試,這其實并非Unity2018上出現(xiàn)的新bug。我測試了一些2018之前的版本,比如2017.3.0p1,發(fā)現(xiàn)同樣會由于在原生地形系統(tǒng)中使用astc格式紋理而出現(xiàn)crash。


屏幕快照 2018-07-15 下午12.20.33.png
屏幕快照 2018-07-15 下午12.20.43.png

不過這個問題我已經(jīng)提交了Bug報告給開發(fā),開發(fā)那邊已經(jīng)知道了。以后的版本會修掉。并且目前在原生地形中使用ETC2格式的紋理是沒有問題的。
不過,我們其實可以通過crash日志信息,來看看程序是在哪一步crash掉的。同時,也可以在這里和大家分享一下如何通過crash日志來還原堆棧信息。
首先說明的是,我這里使用的Unity版本是2018.1.0f1,并且使用的Script Backend是Mono。
打開手機上的測試程序,查看程序crash時的日志:

屏幕快照 2018-07-14 下午9.47.46.png

在這份堆棧信息里,我們可以看到例如0049b647這樣的數(shù)字,它們是在crash時,程序正在執(zhí)行的方法的內(nèi)存地址。每行的結(jié)尾則是所使用的庫,這里是libunity.so。
但是,內(nèi)存地址對我們來說顯然沒有什么意義,所以接下來我們需要將內(nèi)存地址轉(zhuǎn)換成我們可以看懂的內(nèi)容。
在Unity 5.3.6之后的版本,我們都提供了libunity的符號表。
屏幕快照 2018-07-14 下午10.31.58.png

在Mac上,符號表的路徑是:

/Applications/Unity/PlaybackEngines/AndroidPlayer/Variations/mono/Release/Symbols

在windows上,符號表的路徑是:

C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Symbols\armeabi-v7a\libunity.sym.so

需要注意的是,接下來我們使用的符號表版本一定要和你打包所使用的Editor版本一致。
有了符號表,接下來我們還需要NDK的addr2line工具。你可以在你的NDK目錄下找到它:

toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-addr2line

OK,萬事俱備,我們接下來就來解析一下第一條內(nèi)存地址所對應(yīng)的方法。

./arm-linux-androideabi-addr2line -f -C -e libunity.sym.so 0049b647

可以看到crash的方法是:
屏幕快照 2018-07-14 下午10.48.44.png

construct_block_size_descriptor_2d似乎還不太明顯。我們再往回追。


屏幕快照 2018-07-14 下午10.50.40.png

原來是在做DecompressASTC相關(guān)的操作時crash了。

當(dāng)然,這個bug已經(jīng)提交了,并且會在以后的版本中修復(fù)的?,F(xiàn)在大家可以在地形中使用ETC2格式的貼圖。

0x07 Plugins

Q: 有沒有大佬 知不知道 unity支不支持 64位動態(tài)庫的調(diào)用?使用安卓平臺。
A: 在Unity2018.1.0 Beta 2版本中提供了對 Android 64-bit ARM(experimental)的支持。

首先要將scripting backend設(shè)置為IL2CPP,之后就可以在Player Setting中選擇ARM 64了。
屏幕快照 2018-07-14 下午11.11.39.png

另外,在剛推出的2018.2正式版中,對ARM64的支持應(yīng)該已經(jīng)很完善了。

0x08 Education

Q: 請問目前Unity提供的資質(zhì)認(rèn)證中,是只有“專家程序員認(rèn)證”有培訓(xùn)課程嗎?
B22A35F67942884B811DFAEF30D03EF1.png

A: 除了初級開發(fā)者考試有相應(yīng)的課程外,其他證書的課程還在制作中,暫時還沒有。初級的8月份才會搬到coursera,中文的現(xiàn)在網(wǎng)易云 51cto 已經(jīng)有了。http://study.163.com/course/introduction/1005268010.htm

0x09 后記

這一周恰好也迎來了Unity2018.2的正式版本的發(fā)布,大家可以通過Unity Hub來直接下載:

屏幕快照 2018-07-15 下午12.42.00.png

也可以點擊這個鏈接來下載:https://unity3d.com/cn/get-unity/update

好了,以上就是想和大家分享的幾個在群里討論的小問題。
再次,歡迎大家加入我們這個討論干貨的官方技術(shù)群,交流分享呀。
Unity官方社區(qū)交流群:629212643

Ref

這里是社區(qū)小伙伴們過去一周在群里分享的一些干貨連接:
[1]Don’t Re-invent Finite State Machines: How to Repurpose Unity’s Animator:
https://medium.com/the-unity-developers-handbook/dont-re-invent-finite-state-machines-how-to-repurpose-unity-s-animator-7c6c421e5785
[2]Calculating Log base 2:
https://stackoverflow.com/questions/13654499/calculating-log-base-2
[3]【翻譯】Shader · 冰:
https://zhuanlan.zhihu.com/p/37696836
[4]Shader特效——實現(xiàn)“噪聲”【基于ShaderToy】【GLSL】:
https://blog.csdn.net/panda1234lee/article/details/52085375
[5]小隨筆:利用Shader給斯坦福兔子長毛和實現(xiàn)雪地效果:
https://www.cnblogs.com/murongxiaopifu/p/7887614.html
[6]Dev Blog: Snow Tech and Houdini Simulations:
http://tombraider.tumblr.com/post/131825841425/dev-blog-snow-tech-and-houdini-simulations-mike

Unity官方社區(qū)交流群:629212643

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容