如何避免动态字体Font Texture过大
這是第148篇UWA技術知識分享的推送。今天我們繼續為大家精選了若干和開發、優化相關的問題,建議閱讀時間10分鐘,認真讀完必有收獲。
UWA 問答社區:answer.uwa4d.com
UWA QQ群2:793972859(原群已滿員)
本期目錄:
- 如何能避免動態字體Font Texture過大
- 場景Object對不同鼠標按鍵產生不同響應事件的實現方式
- UGUI中,在Canvas下改變某一UI是否會引起所有UI的重繪
- 播放Idle動畫后角色產生位移
- 如何解決更新后場景中貼圖會變黑的問題
UI
Q:Failed to update dynamic font (arial) texture; all the needed characters do not fit onto a single texture (max size 4096). Try using less text or a smaller font size.
項目中已經把字號控制在4個(16,22,26,30)了,理論上字號并不多,而且安卓上不會出現這種情況,一直查不清是什么問題。
A:我們使用FairyGUI,默認使用高清字體模式——編輯器下用設計分辨率設計字體大小,手機上根據實際分辨率進行了等比放大。例如設計分辨率用1280x720,手機分辨率1920x1080,字號就擴大了1.5倍。并且我們字體控件使用了自動適配控件大小模式,文本長度超過控件長度的話,會自動進行縮小字號來匹配,這樣字號數量不可控的又多了起來。
我們目前的解決方案是:1.取消了高清字體模式;2.項目約定字號只用偶數,更改源碼自動縮小的字號也只產生偶數。
感謝潘友成@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5c3c51ee050b697811b11e7d
Input
Q:我在場景中實例化一物體,并且該物體會對鼠標指針的進入和進出做出響應(例如,指針指向物體時改變顏色,移出時恢復顏色)。同時,我還需要對鼠標的按鍵狀態進行響應,左鍵和右鍵產生不同的操作。這種需求,除了在Object腳本的Update里做判斷外,還有沒有更效率的實現方式?
A:可以借助IpointerClickHandler接口:
https://docs.unity3d.com/ScriptReference/EventSystems.IPointerClickHandler.html
將以上腳本掛在Object之上即可。
感謝hcj@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5b3e0d212a652c518d8d5300
UGUI
Q:請問如果一個Canvas下的某一個UI改變或者移動了,或者增減某個UI,會導致整個Canvas下所有元素的Rebuild嗎?
我看網絡上的大部分例子都是一個Canvas作為根節點,之后用Panel作為某一個界面的父節點,放在Canvas下。我有點疑惑,如果任何UI的改變都會引起Canvas的重構,重新計算Mesh之類的,那只有一個Canvas的界面布局方法,不是會導致很多無畏的消耗?
我想設計為:每一個功能界面都是以獨立Canvas作為容器。那這個界面下的UI變化就不會影響到其他的Canvas,不會導致所有UI的重繪。這樣的想法會有問題嘛?Canvas多了會有額外性能消耗嗎?(DrawCall這個我已經考慮過了,可以接受)
還有其它可行的設計方案嗎?
A1:首先,推薦UWA博客里面有一篇關于UGUI優化的文章:
https://blog.uwa4d.com/archives/QA_UGUI-1.html
其次,UI元素的位置,顏色,大小變化,都會導致Canvas的更新或者重建,因此要避免重建,要盡可能把頻繁變化的UI元素從復雜的Canvas中分離出來,以此將動態UI元素的變化所引起的網格更新或重建所涉及到的范圍變小,減輕Canvas更新和重建帶來的性能開銷。
再次,通常情況下,如果整個游戲只有一個Canvas,確實會帶來很多無謂的性能消耗。
最后,每一個功能界面以獨立的小Canvas作為容器存在,我們在量級很小(整個游戲不超過10個界面)的產品里面用過。能否通用所有項目情況,我認為需要具體情況具體分析。
感謝張銳@UWA問答社區提供了回答
A2:推一波自己文章,記錄了相關的概念,應該能幫助你有個清晰的認識:
https://www.jianshu.com/p/5c44eb589751
關于Canvas的劃分,首先每個功能肯定有一個獨立的Canvas,在做顯隱控制的時候會方便。然后對于界面復雜的功能,要酌情拆分出子Canvas,拆分條件可以參考UWA文章,基本是動靜分離為主。
UGUI中,Canvas少不一定DrawCall少,所以這方面可以不必太過在意。而且當界面臃腫的時候,重建的消耗是遠高于多幾個DrawCall的。
感謝Walker@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5c5125b97692f15c777a5558
動畫
Q:我希望角色模型在播放Idle動畫時位置保持在原地,當打開Apply Root Motion時,角色會產生微小的位移和旋轉,關閉Apply Root Motion時,角色位置雖然能夠保持在原地,但角色的動畫就會很奇怪,兩只腳不再保持跟地面接觸,而是像漂浮在空中一樣擺動兩腿。
A:如果是Humanoid模式的話,可以試試這邊的Bake Into Pose的選項:
如果是Generic的話,可以先看看這里的設置是不是None:
如果是None也有問題,再把動畫壓縮關了試試,看看是不是精度的問題:
?
該回答由UWA提供,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5c5fdfc32b3589332f1a4951
紋理
Q:從2017.4.17f1更新到2017.4.18f1(19f1和20f1也會有這個問題)后,再打版本運行到Android 4后,場景中某些貼圖會變成黑色,某些貼圖不會。
出問題和不出問題的貼圖,都是ETC1格式,Diffuse材質;
出現問題的設備有:紅米Note1(4.4.4)、紅米2(4.4.4)、三星 G3608(4.4.4)、三星Galaxy S3(4.3)、Oppo1107(4.4.4);
UWA的紅米2(5.1.1)沒有發現這類問題。
補充截圖如下:
?
@deviljz 提到在2018.2 上遇到過一個變黑的Bug,滿足以下4個條件貼圖會變黑色:
1、長寬比不是1:1
2、開Mipmap
3、ETC壓縮
4、在安卓4.4上
感覺應該和我們遇到的問題一樣,請問這種有什么解決辦法,除了降低Unity版本。
A:解決方法:只要讓2、3條件有1個不滿足就行了。
比如寫個OnPreprocessTexture方法,判斷長寬比不是1:1的情況下強制指定壓縮方式是ETC2,不用ETC壓縮。
感謝deviljz@UWA問答社區提供了回答,歡迎大家轉至社區交流:
https://answer.uwa4d.com/question/5c61184763826a332ad994da
今天的分享就到這里。當然,生有涯而知無涯。在漫漫的開發周期中,您看到的這些問題也許都只是冰山一角,我們早已在UWA問答網站上準備了更多的技術話題等你一起來探索和分享。歡迎熱愛進步的你加入,也許你的方法恰能解別人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官網:www.uwa4d.com
官方技術博客:blog.uwa4d.com
官方問答社區:answer.uwa4d.com
官方技術QQ群:793972859(原群已滿員)
封面圖來源:Unreal Landscape
https://lab.uwa4d.com/lab/5b85803f02004fb659765ee1
總結
以上是生活随笔為你收集整理的如何避免动态字体Font Texture过大的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python结合ogr2ogr之地理数据
- 下一篇: xsl 操作