1)FairyGUI圖標文字合批失敗的原因
2)為什么Cubemap的內存占用超高
3)如何找到網格某個切面的中心點
4)為什么SafeZone在倒屏后方向相反
這是第428篇UWA技術知識分享的推送,精選了UWA社區的熱門話題,涵蓋了UWA問答、社區帖子等技術知識點,助力大家更全面地掌握和學習。
UI
Q1:項目現在使用的是FairyGUI,界面中會有一排類似下圖的比較常見的組合按鈕(圖+特效+文字)。
在FrameDebugger中注意到這部分的DrawCall情況有點慘;老項目用UGUI+TMP作類似的UI應該是沒有問題都能合的。父節點FairyBatching是勾了的,圖集是合好了的,圖和圖、文字和文字之間應該也沒有互相遮擋覆蓋;考慮到可能是特效穿插的問題,所以運行調試時直接把特效的節點刪掉了,還是不行。請問還有什么思路?
A:遇到過類似的問題。首先FairyGUI的結構在導出后應該就是固定的了,有可能你運行時做了修改刪掉改掉某些東西,但原來的區域規格和UI元素仍然占位。所以這里刪特效、對TextField覆蓋面積的調試檢查,可能都得請UI同學幫忙,回到FairyGUI編輯器階段處理和檢查,再重新導出看效果。
Q2:操作了下,確實有變化。但現在又有兩個新問題:
1. 確實導出前就把特效移除有效果,但圖和文字中夾著特效是表現需要,最終不大可能刪,這個是不是就沒什么辦法了?
2. 就算移除了特效,還是發現只有圖和圖之間合了,文字之間仍然不合。而且這次是確認了TextField之間也沒有重疊。這時候看FrameDebugger合批失敗原因變成了超過300個頂點不能動態合批。請問這個怎么解決呢?
A:第一個確實想不到什么辦法了。第二個就像FrameDebugger寫的一樣,你若是用了Shadow、Outline這種效果,文字的頂點就會成倍上升,再加上你字一多,就會超了。不過如果你這些表現上都要用的話,也和特效一樣沒什么辦法了。
感謝Faust@UWA問答社區提供了回答
Memory
Q:在MemoryProfiler里發現Graphics分類下面Cubemap的內存占用有40多MB,比我們項目用的網格都多,這個量正常嗎?
A:確實高了,尤其移動端游戲很少有必要用這么多。可以看下是不是有些Cubemap單個就占好幾MB。一個Cubemap本質是6張Texture 2D,所以一個10241024、ASTC44格式的資源就占6MB內存了。但其實我測下來其規格對表現的影響很微妙,像我們項目里有些物體上把Cubemap改到128128、ASTC88看上去都沒什么區別,但內存就小到可以忽視。最終也是說服美術在低分檔上用這版了。
感謝Faust@UWA問答社區提供了回答
Script
Q:我想要找到一個網格中某個切面的中心點,有什么實現的思路嗎?
A:提供一種追蹤的方式,大致思路是:
- 通過Get Component Bounds得到網格包圍球的半徑,乘二以保證追蹤起點足夠遠,得到追蹤的半徑(Float)。
- 在For Loop中配合Rotate Vector Around Aixs和追蹤半徑來得到足夠多的追蹤點(Float→Vector),它們是LineTrace的起點。
- 再找到追蹤的終點,就可開始Line Trace(起點和終點還要加上Actor自身的Location,相當于Local→World)。
- 返回的Out Hit中拿到Location便可加到一個新的Vector Array中(這個要是局部變量,這樣每幀得到的都是新的)。
- 在For Loop的Completed階段用Draw Debug String來顯示內容(也可以別的類型),輸出一個白色的x,位置為Get Vector Array Average,即該切面的中心點。
藍圖如下:
進階版:若希望這個切面不只是水平面,還可以換成其它角度。加一個Plane進來,藍圖如下這樣改,旋轉Plane即可調整切面的角度(理論上還可以繼續優化,因為沒把Plane的位移算進去)。
藍圖如下:
該回答由UWA提供
Script
Q:在左右橫屏切換之后,原本設置的安全區位置出現了錯位,請問是什么原因呢?
A:該現象確認為UE的Bug,已在5.2中解決,可參考:
Unreal Engine Issues and Bug Tracker (UE-170632)
之前版本不修改源碼解決該問題的方法:在屏幕旋轉時,手動觸發安全區更新。
實現的關鍵點包括:
- 安全區更新。可以通過全局代理觸發:
- 獲取屏幕旋轉事件。屏幕旋轉時會觸發代理廣播,因此可以將相應函數綁定至該代理:
另外,對于移動平臺,可以直接使用PlatfromGameInstance提供的委托,在藍圖中綁定相應事件:
自己的GI類中可以做類似的實現:
基于以上關鍵點,項目組可根據自身項目需求進行實現。
實現參考:1. 創建PlaftormGameInstance,并替換為項目使用的GI。
2. 創建UBlueprintFunctionLibrary類,并在其中實現函數,該函數用來觸發FCoreDelegates::OnSafeFrameChangedEvent.Broadcast()。
3. 在UI中,實現以下藍圖,注意其中對函數庫中更新函數的調用需要延遲調用。
針對該Bug的源碼變化:
5.2版本源碼中的修改:
5.2版本之前:
該回答由UWA提供
封面圖來源于網絡
今天的分享就到這里。生有涯而知無涯,在漫漫的開發周期中,我們遇到的問題只是冰山一角,UWA社區愿伴你同行,一起探索分享。歡迎更多的開發者加入UWA社區。
UWA官網:www.uwa4d.com
UWA社區:community.uwa4d.com
UWA學堂:edu.uwa4d.com
?