Unity的一些問答
開發中遇到了很多比較奇怪和難解決的問題,這裡進行了一些記錄,很多問題得到Unity官方技術支持同學的大力幫助,非常感謝!
- Unity5.5.1p2版本,IL2CPP切到後台可能會報錯:
EGL
Unable to acquire context EGL_BAD_NATIVE_WINDOW a nativewindowtype argumentdoes not refer to a valid native window.解決方案:
官方建議只要沒有Crash可以忽略。
The
error message "Unable to acquire context - EGL_BAD_NATIVE_WINDOW: ANativeWindowType argument does not refer to a valid native window" occursoccasionally on some Android devices when restoring the app from a minimisedstate.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 soyou 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 reportsmentioned in there and searching for other reports:It
looks like these particular reports, were possibly fixed in 5.6 via other fixesand changes. But we have no local report that we have been able to reliablyfind 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 diskspace 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。官方建議如下
https://forum.unity3d.com/threads/ios-advertising-identifier-rejection-faq.226187/
- 升級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 Unityversion 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 itwill 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. Ifyou later add the addon, upon project opening it will return a valid path andsettings 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-incompatibility UUID E0A62D1F-3C18-4D74-BFE5-A4167D643966 for plug-in at path~/Library/ApplicationSupport/Developer/Shared/Xcode/Plug-ins/Unity4XC.xcplugin not present inDVTPlugInCompatibilityUUIDs
===
BUILD TARGET Unity-iPhone OF PROJECT Unity-iPhone WITH THE DEFAULTCONFIGURATION (Release) ===Check
dependenciesSigning
for "Unity-iPhone" requires a development team. Select a developmentteam in the project editor.Code
signing is required for product type Application in SDK iOS 10.2
解決方案:
因為升級之後多了AutoSign選項並默認開啟導致證書和簽名設置不正確導致。
- Animator性能的問題:
為每個角色製作一個Animator
controller同為所有角色製作一個Animator controller並採用Animator controlleroverride去填充每個角色動畫這兩種方式的問題:1-相同狀態機結構下,兩者之間在內存佔用上,哪一種會更多?
2-相同狀態機結構下,哪一種佔用cpu會更多?
3-部分角色用不到全部的動作,如果不指定這些動作,是否會在內存佔用以及cpu佔用上更省?
4-一個角色一個獨立animator
controller與一個角色獨立animator controller並且使用Animator controller
override去替換自身動作在效率上有沒有損害5-能否比較詳細的描述下Animator
controller,Animator controller override的工作原理以及內存佔用,cpu佔用方面的詳細情況解決方案:
官方反饋如下。
第一和第二個問題:內存方面,使用Animator
overridecontroller會更加節省內存,開發效率上也會更高,cpu佔用差異兩者基本可以忽略。動畫的瓶頸大多都在計算骨骼和skin上。如果使用blendtree的話會有動畫融合的消耗。特別的,使用一個大型、複雜的狀態機(animator controller)需要注意其初始化開銷。第三個問題:
是的,理論上越精簡的controller是會佔用更少的資源的。不過因為不同角色使用相同的animator
controller並不會增大內存,角色只是引用了controller,而如果新建一個精簡的controller則會有額外的內存消耗。所以是否新建controller需要斟酌一下。第四個問題:
對於不同的角色使用animator
controller,我們建議的最佳實踐是:儘可能簡化animator controller的內部邏輯,可以適當把不同邏輯放在多個animatorcontroller中,再使用Animator controller override去動態替換animationclip;而不要使用一個大型的、複雜的、全能的、包含所有邏輯的animator controller。第五個問題:
簡單來說,Animator
controller是一個動畫狀態樹。而blend tree則類似於ue和cryEngine的blend space。Animatorcontroller如果使用blend tree的話,則內存佔用會多一些。Animator
override controller可以簡單理解為一個實例化的animator controller,所以在內存佔用上會小於它所引用的animatorcontroller。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_SIMDconst&, 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::MultiQueryInputconst&, physx::PxHitCallback<physx::PxOverlapHit>&,physx::PxFlags<physx::PxHitFlag::Enum, unsigned short>, physx::PxQueryCacheconst*, physx::PxQueryFilterData const&, physx::PxQueryFilterCallback*,physx::BatchQueryFilterData*) const [armeabi-v7a]解決方案:
升級Unity的物理引擎之後解決,應該是Physx的bug。
- 使用il2cpp的包比mono的大12M。
解決方案:
因為會額外生成一些代碼所以il2cpp會比mono大,官方提供一些縮小包體的建議
http://docs.unity3d.com/Manual/ReducingFilesize.html
http://docs.unity3d.com/Manual/iphone-playerSizeOptimization.html
http://forum.unity3d.com/threads/il2cpp-build-size-improvements.322079/
- ANDROID的包在固定設備上,華為榮耀3X上啟動黑屏閃退。
解決方案:
只有這台設備會出現,存在兼容性問題。測試編譯使用IL2CPP並且不開啟Development開關不會閃退,使用mono或者開啟Development必然閃退,可以保證release版沒問題。
推薦閱讀:
※到底是誰的bug?聊聊模塊化
※malloc時出錯。提示 0xC0000374: 堆已損壞 (參數: 0x778CD8D0)什麼原因?
※應用程序熱補丁(三):完整的設計與實現
※遊戲史上有哪些經典 Bug?