Unity發布錯誤的可能性問題整理

2021-08-07 09:36:09 字數 3363 閱讀 3080

被問了幾次乙個同樣的問題,即使unity在編輯器模式下執行的時候都是好用的,但是一發布就掛掉了。想了一下,這可能的原因很多啊,問了幾個經驗豐富的朋友,滔滔不絕給我介紹了一大通,總之就一句話概括:得具體問題具體討論!

那我整理一下可能性吧:

1.某些方法只能在編輯器模式下執行,因為它原本就是給編輯器來除錯用的。

2.某些方法只能在固定的平台上執行,下面有具體講解的乙個例子

3.你程式的某些選項、某些值或者直接說你寫的程式**就有問題,就好比有乙個型別你選了個editoronly,那就肯定之時editoronly了。

下面詳細列舉一下一些常見的問題,也感謝幾位朋友的參與解答。

1、最常見的編輯器執行沒問題,但是發布出來就有問題的是螢幕自適應的問題,很容易出現位置偏差和大小問題。

解決辦法:錨點的設定、規格也可以適當調,其實主要就是調啦。

2、.0.0版本c#的執行緒池在編輯器裡執行沒問題,在ios、安卓也都可以,但是發布webgl之後,直接就會爆出執行緒錯誤。

解決辦法:用協程。(發布webgl是html5,使用多執行緒初始化就崩了,可能跟unity自身有關)

3、編輯器裡執行沒問題,發布到安卓或者ios平台後光影消失或者產生鋸齒。

原因:a、跟硬體的渲染有關係,電腦的硬體渲染和手機的硬體渲染不同,底層相同的程式硬體的支援程度不一樣,所以就會導致產生不同的效果。

b、本身的shader就有問題。

解決辦法:重新做支援度差不多的光影以及修改除錯shader。

4、編輯器內執行,貼圖沒問題,但是匯出後出現閃爍的情況。

原因:模型有好幾個面,角度稍微不同可能會導致幾個面的切換。另外,htc vive的閃爍也有可能是這樣。還有就是模型製作的時候重面、uv分的有問題、貼圖中帶透明通道資訊或者是質量選擇不對都可能造成這種錯誤。

5、發布安卓平台時出問題,可能還有如下的原因:

a、打包安卓的時候sd卡的許可權沒讀。

b、c#api版本沒選好

c、**優化的問題,需要的記憶體大於安卓剩餘記憶體,記憶體溢位導致閃退

d、發布的時候各選項的勾選問題。

其實渲染裡的問題居多,原因還是那個硬體的不同導致的,更換shader之類的就可以解決,但是過程是很費時的,要慢慢來。

二下面是查了一下debug和release的本質區別與除錯和發布時出錯的除錯辦法,在unity中可能用不上,但也放出來吧:

debug和release

作為程式設計師看到這兩個詞應該是很平常的事情吧,但是有多少程式設計師能夠確切地清楚這兩個之間的本質區別呢?

無獨有偶,網上隨便一搜,就會找到區別,不管懂不懂,先列出來:

debug通常稱為除錯版本,它包含除錯資訊,並且不做任何優化,以便於程式設計師除錯程式。

release稱為發布版本,它往往是進行了各種優化,使得程式在**大小和執行速度上都是最優的,以便使用者很好地使用。

debug和release的真正秘密,在於一組編譯選項。下面列出了分別針對二者的選項。

debug版本:

/mdd /mld 或/mtd     使用debug runtime library(除錯版本的執行時刻函式庫)

/od                        關閉優化開關

/d 「_debug」                相當於 #define _debug,開啟編譯除錯**開關(主要針對assert函式)

/zi                        建立edit and continue(編輯繼續)資料庫,這樣在除錯過程中如果修改了源**不需要重新編譯

/gz                        可以幫助捕獲記憶體錯誤

/gm                        開啟最小化重鏈結開關,減少鏈結時間

release版本:

/md /ml 或 /mt        使用發布版本的執行時刻函式庫

/o1 或 /o2                優化開關,使程式最小或最快

/d 「ndebug」                關閉條件編譯除錯**開關(即不編譯assert函式)

/gf                        合併重複的字串,並將字串常量放到唯讀記憶體,防止被修改

debug和release沒有本質的界限,他們只是一組編譯選項的集合,編譯器只是按照預定的選項行動。我們甚至可以修改這些選項,從而得到優化過的除錯版本或者是帶跟蹤語句的發布版本。

其中每一項的具體解釋就不多作評述了,其實我也不清楚,網上一查就有了。最近看到社群好多問題都是編輯模式下執行好好的,發布之後就掛了,所以這就需要我們來除錯release版程式,這樣除錯過了就和發布的基本上是一樣的了。

怎麼「除錯」release版的程式?

遇到debug成功但release失敗,顯然是一件很沮喪的事情,而且往往無從下手。那該用怎麼樣的策略來解決呢?我從網上蒐集了以下幾種:

1.修改release版的編譯選項來縮小錯誤範圍。可以把release的選項諸葛改為與之相對應的debug選項,如/md改為/mdd、/o1改為/od,或執行時間優化改為程式大小優化。一次修改乙個選項,看看修改哪個選項的時候錯誤消失,再對應針對性查詢。主意:這些選項在project\settings中都可以直接通過列表選取,通常不要手動修改。這是最有效的方法。

2.在程式設計過程中就要時長注意測試release 版本,以免最後**太多,時間又很緊迫。

3.在debug版中使用/w4警告級別,這樣可以從編輯器獲得最大限度的錯誤資訊,比如 if(i = 0) 就會引起/w4警告。不要忽略這些警告,通常這時你程式中的bug引起的。但有時/w4會帶來很多冗餘資訊,如未使用的函式引數警告,而很多訊息處理函式都會忽略某些引數。我們可以用

#progma warning(disable:4702)//禁止

//…#progma warning(default:4702)//重新允許來暫時禁止某歌警告,或使用

#progma warning(push,3)//設定警告級別為/w3

//…#progma warning(pop)//重設為/w4來暫時改變警告級別,有時你可以只在認為可疑的那部分**使用/w4。

4.你也可以像debug一樣除錯你的release版,只要加入除錯符號。在project/settings...中,選settings for 「win32 release」,選中c/c++標籤,category選general,debug info選program database。再再link標籤project options最後加上「/opt:ref」(引號不要輸)。這樣偵錯程式就能使用pdb檔案中的除錯符號。但除錯時,你會發現斷點很難設定,變數也很難找到--這些都被優化過了。不過令人慶幸的是,call stack視窗仍然工作正常,即使幀指標被優化,棧資訊(特別是返回位址)仍然能找到。這對定位錯誤很有幫助。

Unity入門級問題 腳本報錯的可能性

對於剛開始寫指令碼的同學,報錯最容易出現的可能性主要有 1 拼寫錯誤,c 對大小寫敏感 2 分號錯誤,語句結束忘了寫分號,或寫了中文的分號 3 括號錯誤,無論是大括號 還是小括號 都是一一配對的,條件一多容易遺漏。4 類名與檔名不匹配 5 出現了同名的類名 如果進一步編寫,會出現更多的出錯的可能性 ...

併發訪問超時的問題可能性 引用

用c 模擬網頁登陸,其中去請求幾個頁面,會發起對應的http的請求request,其中keepalive設定為true,提交請求後,然後會有對應的response 之前的多次除錯,一直都是可以正常獲得對應的response,然後讀取html頁面的。但是後來幾次的除錯,在沒有改變 的前提下,結果get...

Qt發布可能遇到的問題

本文只涉及動態鏈結庫,就是編譯出來的exe檔案加上qt 的必要dll檔案。一般跟別人一樣的操作,直接雙擊 xx.exe,提示缺少什麼dll,就去qt的安裝目錄下的bin資料夾裡去找。我找的目錄是d qt qt5.2.0 5.2.0 msvc2010 bin 複製所需的dll後,提示了這個錯誤。這個錯...