1. 程式人生 > >還原堆疊資訊,分析地形系統使用ASTC格式的紋理導致Crash的問題

還原堆疊資訊,分析地形系統使用ASTC格式的紋理導致Crash的問題

0x00 前言

在這篇文章中,我們選擇了過去一週Unity官方社群交流群中比較有代表性的幾個問題,總結在這裡和大家進行分享。主要涵蓋了IL2CPP、Scripting、Virtual Reality、Graphics、Editor、Terrain、Plugins 、Education等領域,其中會著重介紹一下在原生的地形系統中使用ASTC格式紋理導致Crash的問題。

在文章結尾處我們還總結了社群小夥伴們過去一週在群裡分享的一些乾貨連線。

同時,也歡迎大家加入我們這個討論乾貨的官方技術群,交流看法分享經驗。
Unity官方社群交流群:629212643

0x01 IL2CPP

Q: 有人遇到過GZipStream在安卓上沒辦法正常工作的問題麼?在Editor中工作是正常的。但是在安卓手機上會無法執行,檢視logcat發現在執行時丟擲了下面的異常:

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: 如何求一個數最大能是2的多少次冪啊? 比如513最大是2的9次冪,就多了一位數. math裡有沒有這樣的方法,想要模擬cullingmask那樣的篩選層出來。

A: 用查詢表,儘量限制在512之內。
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數,記憶體佔用爆炸。位運算log2正解,這裡下面也有個例子。
https://stackoverflow.com/questions/13654499/calculating-log-base-2
(上海-Weiqi “Xylt” Gu)

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

0x03 Virtual Reality

Q: 在開發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。細節可以檢視:https://forum.unity.com/threads/beta-7-case-943170-windows-mixed-reality-far-clip-and-rendertexture-generatemips-error.488714/

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

0x04 Graphics

Q: tonemapping和打包設定裡colorspace是衝突的嗎?是不是用tonemapping,colorspace需要改成線性?

A: 用tonemapping的話要用hdr,hdr最好和線性空間一起用,才能保證準確度。如果你的專案設定為gamma的話,postprocessing中的color grading會有一個警告的。
螢幕快照 2018-07-13 下午2.32.53.png

Q: 難道我理解錯了。攝像機可以開HDR,但是打包到手機渲染設定裡預設是不開的啊 我可不可以 用HDR算出來的結果 通過mapping 轉換成ldr給手機顯示
A: tonemapping的作用也是為了將一個高動態範圍的顏色資料映射回可用顏色空間,為的是不被顯示螢幕截斷色彩。(北京-哎呀)
A: 因為顯示器很少支援hdr,安卓手機更是565顏色居多。tonemap就是一個簡單s曲線remapping。(深圳-topameng)

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

小貼士

這裡可以和大家科普一下Graphic Setting中的各個tier和裝置的對應關係:Graphics Settings內的Tier設定,在執行時會根據GPU來選擇對應的Tier。應用相關的設定。具體各個Tier和裝置的對應關係如下:

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

具體也可以查閱相關文件。

Q: unity自帶的螢幕射線反射效果一般,然後我找了好久,找到一個livenda lab開發的,居然離屏追蹤,就是現在還沒出成品。有好的推薦嗎?
A: 可以參考群裡@上海-CGBull在他的文章中的實現。
Unity_StochasticScreenSpaceReflection-實現篇:
https://zhuanlan.zhihu.com/p/38303394
(北京-小小光)

Q: 我這裡想要擾動的方向是隨機的怎麼弄啊 在腳本里setfloat感覺是硬切的。
32A41337C2F9B902D9B43EC5D821C34D.png

A: 從一張噪聲貼圖裡讀。
15FBFCCBF78868125F605311A25090A9.png
可以看看和失真效果相關的這篇部落格:
https://zhuanlan.zhihu.com/p/37696836。(北京-破曉)

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

Q: 有人實現過手機上面能用的雪地踩踏效果嗎?主美還想著要那種曲面細分的效果。。。戰神 古墓麗影。。。
A: 思路並不複雜。簡單的說, 就是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上顯示的該資源的記憶體佔用大小資料是如何獲得的?螢幕快照 2018-07-14 下午8.50.47.png

A: 你可以呼叫AnimationUtility.GetAnimationClipStats(clip)來獲取某個clip的status,即AnimationClipStats類的例項,其中的size欄位即inspector上顯示的記憶體佔用大小。可以參考下面的程式碼:

        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: 有人遇到過地形上用的紋理的紋理格式設定為astc,在手機上會崩潰的問題嗎?我的unity版本是2018.1。

A: 遇到過這個問題。我下午也做了一些測試,這其實並非Unity2018上出現的新bug。我測試了一些2018之前的版本,比如2017.3.0p1,發現同樣會由於在原生地形系統中使用astc格式紋理而出現crash。
螢幕快照 2018-07-15 下午12.20.33.png

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

不過這個問題我已經提交了Bug報告給開發,開發那邊已經知道了。以後的版本會修掉。並且目前在原生地形中使用ETC2格式的紋理是沒有問題的。
不過,我們其實可以通過crash日誌資訊,來看看程式是在哪一步crash掉的。同時,也可以在這裡和大家分享一下如何通過crash日誌來還原堆疊資訊。
首先說明的是,我這裡使用的Unity版本是2018.1.0f1,並且使用的Script Backend是Mono。
開啟手機上的測試程式,檢視程式crash時的日誌:
螢幕快照 2018-07-14 下午9.47.46.png
在這份堆疊資訊裡,我們可以看到例如0049b647這樣的數字,它們是在crash時,程式正在執行的方法的記憶體地址。每行的結尾則是所使用的庫,這裡是libunity.so
但是,記憶體地址對我們來說顯然沒有什麼意義,所以接下來我們需要將記憶體地址轉換成我們可以看懂的內容。
在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,萬事俱備,我們接下來就來解析一下第一條記憶體地址所對應的方法。

./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相關的操作時crash了。

當然,這個bug已經提交了,並且會在以後的版本中修復的。現在大家可以在地形中使用ETC2格式的貼圖

0x07 Plugins

Q: 有沒有大佬 知不知道 unity支不支援 64位動態庫的呼叫?使用安卓平臺。
A: 在Unity2018.1.0 Beta 2版本中提供了對 Android 64-bit ARM(experimental)的支援。
首先要將scripting backend設定為IL2CPP,之後就可以在Player Setting中選擇ARM 64了。螢幕快照 2018-07-14 下午11.11.39.png

另外,在剛推出的2018.2正式版中,對ARM64的支援應該已經很完善了。

0x08 Education

Q: 請問目前Unity提供的資質認證中,是隻有“專家程式設計師認證”有培訓課程嗎?B22A35F67942884B811DFAEF30D03EF1.png

A: 除了初級開發者考試有相應的課程外,其他證書的課程還在製作中,暫時還沒有。初級的8月份才會搬到coursera,中文的現在網易雲 51cto 已經有了。http://study.163.com/course/introduction/1005268010.htm

0x09 後記

這一週恰好也迎來了Unity2018.2的正式版本的釋出,大家可以通過Unity Hub來直接下載:
螢幕快照 2018-07-15 下午12.42.00.png
也可以點選這個連結來下載:https://unity3d.com/cn/get-unity/update

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

Ref

這裡是社群小夥伴們過去一週在群裡分享的一些乾貨連線:
[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特效——實現“噪聲”【基於ShaderToy】【GLSL】:
https://blog.csdn.net/panda1234lee/article/details/52085375
[5]小隨筆:利用Shader給斯坦福兔子長毛和實現雪地效果:
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官方社群交流群:629212643

相關推薦

還原堆疊資訊分析地形系統使用ASTC格式紋理導致Crash的問題

0x00 前言 在這篇文章中,我們選擇了過去一週Unity官方社群交流群中比較有代表性的幾個問題,總結在這裡和大家進行分享。主要涵蓋了IL2CPP、Scripting、Virtual Reality、Graphics、Editor、Terrain、Plugins 、Education等領域,其中會著重介紹一下

jstack-檢視Java程序的執行緒堆疊資訊鎖定高消耗資原始碼

gracetest jstack-檢視Java程序的執行緒堆疊資訊,鎖定高消耗資原始碼  jstack主要用來檢視某個Java程序內的執行緒堆疊資訊。語法格式如下: jstack [option] pid jstack [option] 

[NSThread callStackSymbols] 堆疊資訊獲取方法執行的類和順序

(lldb) po csss <_NSCallStackArray 0x1c0643ff0>( 0 iOSGeneral 0x00000001011e3514 +[GXJAFNetworking POST:pa

記一次OOM堆疊資訊洩漏分析過程

1、使用者反映生產訂單下不來,馬上開啟伺服器檢視gc日誌(前提是已經先排除了業務邏輯問題) tomcat配置: JAVA_OPTS=”$JAVA_OPTS -server -Xms4096m -Xmx4096m -Xss1024k -XX:PermSize=

554 DT:SPM 傳送的郵件內容包含了未被許可的資訊或被系統識別為垃圾郵件。請檢查是否有使用者傳送病毒或者垃圾郵件;

通過python 指令碼傳送郵件時候總是出現這樣惡劣的錯誤。 之所以稱之為惡劣是這個錯誤很不講道理 1.確保你已經加入了header,不加可能會導致該錯誤。 2.確保你的subject 和content 內容不一樣,如果一樣可能導致錯誤。 3.還是報錯,

爬取微博使用者公開資訊分析為周杰倫打榜的夕陽紅老年團告訴你他們真實年齡!

前段時間為“周杰倫打榜”話題迅速登上微博熱搜榜因為cxk的粉絲們質疑周杰倫微博沒有資料(周杰倫沒有開通微博)於是,無數隱匿江湖多年看不下去的周杰倫老年粉開始被迫營業 於是一場周杰倫中老年粉VS蔡徐坤鐵軍微博打榜大戰拉響為聽了那麼多年的周杰倫粉絲們紛紛拉下老臉和00後的微博飯圈小年輕們從零學習如何做資料 一

1.報出問題: Please change caller according to com.intellij.openapi.project. IndexNotReadyException documentation 2.分析問題: 提示資訊不影響編譯 3.解決方案: 重啟AS

1.報出問題: Please change caller according to com.intellij.openapi.project. IndexNotReadyException documentation 2.分析問題: 提示資訊,不影響編譯 3.解

分析系列之一:使用jstack定位執行緒堆疊資訊

基本概念 在對Java記憶體洩漏進行分析的時候,需要對jvm執行期間的記憶體佔用、執行緒執行等情況進行記錄的dump檔案,常用的主要有thread dump和heap dump。 thread dump 主要記錄JVM在某一時刻各個執行緒執行的情況,以棧的形式顯示,是一個文字檔案。通過

如何爬取了知乎使用者資訊並做了簡單的分析

爬蟲:python27 +requests+json+bs4+time 分析工具: ELK套件 開發工具:pycharm 1.性別分佈 0 綠色代表的是男性 ^ . ^ 1 代表的是女性 -1 性別不確定 可見知乎的使用者男性頗多。

關於專案中的執行緒的堆疊詳細資訊利用jsp頁面來實現。

在實際的專案中我們通過Thread.getAllStacktraces()方法進行檢視相關的資訊。這樣可以隨時方便的管理檢視程式中的執行緒的相關資訊 <%@ page language="java" contentType="text/html; charset=utf-8"  

如何在Linux系統上獲取命令的幫助資訊請詳細列出描述man文件的章節是如何劃分的

由於Linux系統的命令繁多,無論是初學者還是資深人士,很多時候都需要檢視幫助。 1.幫助命令 1)獲取幫助的能力決定了技術的能力 2)多層次的幫助 whatis command --help man and info /usr/share/doc/ Red

Java 堆疊資訊物件 StackTraceElement獲取當前執行緒的執行方法

java.langStackTraceElement類儲存了Java中執行緒中的方法棧資訊: 4個屬性: /** * 宣告的類,是類的全限定名 */ private String declaringClass; /** * 方法名 */ private Stri

智慧園區能源管理資訊平臺搭建能源管理系統開發

園區屬於功能複雜的綜合性建築,配備了電、水、熱等多種能源,園區能源管理中心平臺實時展示是對園區各企業的用能種類和能源消耗量, 以資訊標識的形式向整個園區進行公示的活動,是節能減排工作的重要組成部分。園區能源管理中心平臺是以企業能耗資料為支撐, 通過能源計量資料和生產過程資料的線上採集、統計分析、數學建模等資訊

爬取微信好友資訊進行視覺化分析(頭像人臉識別部分已更新!)(程式碼已上傳)

【Code】下載 1、專案說明 本次專案主要實現了以下功能: 2、微信好友資訊的獲取與檔案儲存 3、微信好友性別分析 4、微信好友地區分佈視覺化 5、微信好友個性簽名詞雲圖及好友備註詞雲圖 6、微信好

python還原微信撤回資訊原來女神這些話想說又不好意思說!

完整的原始碼也可以得到獲取方式 一大早醒來,發現女神昨晚發來三條訊息,但是顯示都已撤回,OMG,我錯過了什麼?群裡有一個漂亮妹紙的爆照照片撤回了,想看又看不到!群裡大佬分享的經典語錄被撤回了,感覺錯過一個億!怎麼辦?用無所不能的 Python 就可以將這些撤回的訊息發給你的微信,讓你從此走上

基於Hive的手機應用資訊統計分析系統

目錄 專案概要 具體實現 HIVE查詢 專案概要 需求 手機應用日誌 定期離線分析手機應用新增使用者、活躍使用者、沉默使用者、啟動次數、版本分佈和留存使用者等業務指標。 工作流程 手機APP啟動時,上報啟動日誌、錯誤日誌、頁面日誌、事件日誌、使用時長日誌等資訊到日誌收集伺

Ubuntu系統備份和還原從此避免系統重灌

大學開始慢慢接觸Linux系統,從開始的CentOS到現在的Ubuntu(也稱烏班圖:“來自南部非洲班圖語“),傳遞著”我的存在是因為大家的存在”的價值觀。Linux的哲學思想深深吸引著我————“一切皆檔案”。 身邊好多朋友也在用Ubuntu,都說好用,很炫

對110W知乎使用者資訊進行分析使用echarts+servlet+jsp視覺化展示

上一篇介紹了使用scrapy框架爬取知乎資訊,爬取了知乎112W使用者的資訊,接下來是對這些資訊進行分析處理和前端視覺化。 使用的工具 Java web servlet + jsp mysql資料庫 echarts 這裡重點是echarts,是一款百度開發的基於canv

獲取已安裝應用資訊判斷是否為系統應用

/** * 獲取已安裝應用資訊 * @param includeSystemApps true:包含系統應用 false:不包含系統應用 */ @SuppressWarnings("static-access") p

Linux如何檢視系統當前登入使用者資訊linux su命令引數及用法詳解(linux切換使用者命令)

作為系統管理員,你可能經常會(在某個時候)需要檢視系統中有哪些使用者正在活動。有些時候,你甚至需要知道他(她)們正在做什麼。本文為我們總結了4種檢視系統使用者資訊(通過編號(ID))的方法。 1. 使用w命令檢視登入使用者正在使用的程序資訊 w命令用於顯示已經登入系統的使用