Unity的一些問答

開發中遇到了很多比較奇怪和難解決的問題,這裡進行了一些記錄,很多問題得到Unity官方技術支持同學的大力幫助,非常感謝!

  • Unity5.5.1p2版本,IL2CPP切到後台可能會報錯:

EGL

Unable to acquire context EGL_BAD_NATIVE_WINDOW a nativewindowtype argument

does not refer to a valid native window.

解決方案:

官方建議只要沒有Crash可以忽略。

The

error message "Unable to acquire context - EGL_BAD_NATIVE_WINDOW: A

NativeWindowType argument does not refer to a valid native window" occurs

occasionally on some Android devices when restoring the app from a minimised

state.

This

issue has been reported as a bug and we are currently working on a fix.

Other

than creating noise in logs and crash dumps the the error causes no problems so

you are safe to ignore it.

  • 第一次安裝完apk包之後,在剛進遊戲啟動瞬間遊戲切到後台必定會閃退。Unity會彈框提示:Error

    Failed to extract resources needed by il2cpp。

解決方案:

官方反饋在5.6版本得到修復。因為升級版本風險太高,這個bug影響較小,繼續嘗試其他解決方案。

Having

looked through the forum post you mentioned. As-well as the bug reports

mentioned in there and searching for other reports:

It

looks like these particular reports, were possibly fixed in 5.6 via other fixes

and changes. But we have no local report that we have been able to reliably

find a concrete fix or evidence of a fix with.

The

error message is flagged when the file system fails to copy files needed.

Can

you check if the devices being affected have this problem have little disk

space free?

Have

you been able to test the issue in 5.6 and see if the problem persists?

  • Unity是否有獲得設備唯一ID的功能?新版IOS唯一ID的介面SystemInfo.deviceUniqueIdentifier可能重複。

解決方案:

沒有直接的api。官方建議如下

forum.unity3d.com/threa

  • 升級UNITY5.5.1P2版本之後MAC機上報錯:

Extension

was not registered, that means it relies on default UnityExtensions settings,

please register extension and apply necessary settings for it in the callback.

解決方案:

官方建議如下。

The error is caused by importers

which have a zero length asset path name. This happens when you have a Unity

version installed with an addon, its calling for an assets physical location,

and if you save the project and open with a Unity version without the addon it

will return an empty string since the physical location of this asset doesnt

exist. So the fix in 5.6 Unity will skip initialization for these plugins. If

you later add the addon, upon project opening it will return a valid path and

settings for it will be initialized.

This issue is not supposed to

affect your project or the editor.

In order to get rid off this

error just try to reimport all assets, it should solve the issue.

  • 升級Unity之後IOS出包時報錯。Showing

    Recent Issues ld:

    /Users/hanyufei/.jenkins/workspace/MGameIOSMacPro/mgame/Program/trunk/Client/0.0.17.0/Libraries/Plugins/iOS/libulua.a(array.o)

    does not contain bitcode. You must rebuild it with bitcode enabled (Xcode

    setting ENABLE_BITCODE), obtain an updated library from the vendor, or

    disable bitcode for this target. for architecture armv7

解決方案:

使用的Lua庫不支持BitCode。一種是升級Lua庫支持BitCode,一種是關閉BitCode功能,但是會增大包體。這個bug出現在升級Unity5.5之後,主要是Unity5.3.1p1開始,bitcode是默認打開的。

  • 升級Unity5.5之後出包報錯:

2017-02-14

12:09:10.329 xcodebuild[21554:19722352] [MT] PluginLoading: Required plug-in

compatibility UUID E0A62D1F-3C18-4D74-BFE5-A4167D643966 for plug-in at path

~/Library/Application

Support/Developer/Shared/Xcode/Plug-ins/Unity4XC.xcplugin not present in

DVTPlugInCompatibilityUUIDs

===

BUILD TARGET Unity-iPhone OF PROJECT Unity-iPhone WITH THE DEFAULT

CONFIGURATION (Release) ===

Check

dependencies

Signing

for "Unity-iPhone" requires a development team. Select a development

team in the project editor.

Code

signing is required for product type Application in SDK iOS 10.2

解決方案:

因為升級之後多了AutoSign選項並默認開啟導致證書和簽名設置不正確導致。

  • Animator性能的問題:

為每個角色製作一個Animator

controller同為所有角色製作一個Animator controller並採用Animator controller

override去填充每個角色動畫這兩種方式的問題:

1-相同狀態機結構下,兩者之間在內存佔用上,哪一種會更多?

2-相同狀態機結構下,哪一種佔用cpu會更多?

3-部分角色用不到全部的動作,如果不指定這些動作,是否會在內存佔用以及cpu佔用上更省?

4-一個角色一個獨立animator

controller與一個角色獨立animator controller並且使用Animator controller

override去替換自身動作在效率上有沒有損害

5-能否比較詳細的描述下Animator

controller,Animator controller override的工作原理以及內存佔用,cpu佔用方面的詳細情況

解決方案:

官方反饋如下。

第一和第二個問題:內存方面,使用Animator

override

controller會更加節省內存,開發效率上也會更高,cpu佔用差異兩者基本可以忽略。動畫的瓶頸大多都在計算骨骼和skin上。如果使用blend

tree的話會有動畫融合的消耗。特別的,使用一個大型、複雜的狀態機(animator controller)需要注意其初始化開銷。

第三個問題:

是的,理論上越精簡的controller是會佔用更少的資源的。不過因為不同角色使用相同的animator

controller並不會增大內存,角色只是引用了controller,而如果新建一個精簡的controller則會有額外的內存消耗。所以是否新建controller需要斟酌一下。

第四個問題:

對於不同的角色使用animator

controller,我們建議的最佳實踐是:儘可能簡化animator controller的內部邏輯,可以適當把不同邏輯放在多個animator

controller中,再使用Animator controller override去動態替換animation

clip;而不要使用一個大型的、複雜的、全能的、包含所有邏輯的animator controller。

第五個問題:

簡單來說,Animator

controller是一個動畫狀態樹。而blend tree則類似於ue和cryEngine的blend space。Animator

controller如果使用blend tree的話,則內存佔用會多一些。

Animator

override controller可以簡單理解為一個實例化的animator controller,所以在內存佔用上會小於它所引用的animator

controller。

PS:最後發現使用Animator性能開銷還是比較高,並且把Animator下面的樹刪光開銷也沒有明顯下降。最終還是把很多簡單的動作改為了Animation。

  • 我們不但使用了Bugly來收集錯誤和crash,還使用了Unity官方的GAMEPERFORMANCE,但是升級5.5之後雖然不用集成插件了,但是也不能自定義版本號和玩家ID了,這樣就不能進行一些過濾甚至開發過程中編輯器出現的臨時error也會上報,很是不方便。

解決方案:

升級之後確實沒有了,只能當作一個feature反饋,希望能早日開發。

  • 魅藍3S會無限旋轉。

解決方案:

確認是陀螺儀的問題導致,Unity開啟陀螺儀在魅藍3S上就會無限旋轉,其他遊戲有會有這個問題。可以在這個設備上關閉陀螺儀。

  • 遊戲開始時切出去,登陸畫面會變窄

解決方案:

確認是開始時切出去會連續切換兩次解析度。修改相關代碼加判斷防止切換兩次。

  • Unity物理相關的崩潰:

1#00 pc cbea16b0 <unknown>

2#01 pc 006a1920 libunity.so CastFilter::preFilter(physx::PxFilterData

const&, physx::PxShape const*, physx::PxRigidActor const*,

physx::PxFlags<physx::PxHitFlag::Enum, unsigned short>&)

[armeabi-v7a]

3#02 pc 00f32090 libunity.so

MultiQueryCallback<physx::PxOverlapHit>::invoke(float&,

physx::Sq::PrunerPayload const*, unsigned int) [armeabi-v7a]

4#03 pc 01053f90 libunity.so BucketPrunerOverlapTraversal<OBBAABBTest_SIMD,

false>::operator()(physx::Sq::BucketPrunerCore const&, OBBAABBTest_SIMD

const&, physx::Sq::PrunerCallback&, physx::PxBounds3 const&)

(.part.26) [armeabi-v7a]

5#04 pc 010594c0 libunity.so

physx::Sq::BucketPrunerCore::overlap(physx::Sq::ShapeData const&,

physx::Sq::PrunerCallback&) const [armeabi-v7a]

6#05 pc 0104ce88 libunity.so physx::Sq::AABBPruner::overlap(physx::Sq::ShapeData

const&, physx::Sq::PrunerCallback&) const [armeabi-v7a]

7#06 pc 00f3383c libunity.so bool

physx::NpSceneQueries::multiQuery<physx::PxOverlapHit>(physx::MultiQueryInput

const&, physx::PxHitCallback<physx::PxOverlapHit>&,

physx::PxFlags<physx::PxHitFlag::Enum, unsigned short>, physx::PxQueryCache

const*, physx::PxQueryFilterData const&, physx::PxQueryFilterCallback*,

physx::BatchQueryFilterData*) const [armeabi-v7a]

解決方案:

升級Unity的物理引擎之後解決,應該是Physx的bug。

  • 使用il2cpp的包比mono的大12M。

解決方案:

因為會額外生成一些代碼所以il2cpp會比mono大,官方提供一些縮小包體的建議

docs.unity3d.com/Manual

docs.unity3d.com/Manual

forum.unity3d.com/threa

  • ANDROID的包在固定設備上,華為榮耀3X上啟動黑屏閃退。

解決方案:

只有這台設備會出現,存在兼容性問題。測試編譯使用IL2CPP並且不開啟Development開關不會閃退,使用mono或者開啟Development必然閃退,可以保證release版沒問題。


推薦閱讀:

到底是誰的bug?聊聊模塊化
malloc時出錯。提示 0xC0000374: 堆已損壞 (參數: 0x778CD8D0)什麼原因?
應用程序熱補丁(三):完整的設計與實現
遊戲史上有哪些經典 Bug?

TAG:Unity游戏引擎 | Bug | 游戏Bug |