1. 程式人生 > 其它 >專案UI框架中存在的問題分析

專案UI框架中存在的問題分析

目前我們遊戲中使用的UI框架是採用樹形結構記錄父子節點之間的跳轉關係,然後每個節點上提前設定好上下級介面的關閉開啟方式。這種樹形結構最大的好處是不管我們跳轉了多少層都可以一層層返回來(理論上上這樣,但是我們實際使用中還是要儘量規避一下跳轉層級太深,這個也是我們目前的遊戲的一個痛點),應對諸如MMORPG這種有大量UI跳轉的遊戲也不在話下。

當然,這種樹形結構也有很多缺點,比如無法支援環形跳轉,也就是說A>B>C>A這種結構,我個人覺得這種環形跳轉本質上是設計問題,需要避免掉。由於我們每個介面都對應一個樹形結構的節點,所以需要維護一個複雜的樹形結構,每次新增跟刪除都會非常麻煩,特別是在專案後期,介面很多,層級很深,相同的介面節點超級多,簡直是個災難。

最近剛好專案剛上線,抽時間對這套UI框架存在的問題進行了一下總結:

1、某些異常情況下導致一個介面都沒有,需要加強保護;
2、每個彈出的介面都要有對應的節點,維護重複的介面節點比較麻煩,操作的時候非常容易遺漏;
3、"顯示的時候隱藏所有UI"功能存在隱患,同時觸發這個選項會相互干擾;
4、現在顯示和隱藏介面的時候是實時遞迴查詢對應節點的,需要針對父節點和孩子節點進行快取,提高效率;
5、之前的查詢方案為了儘可能的找到對應的節點,會遞迴遍歷孩子節點和整個樹,有時候會查詢到了錯誤的節點,效率比較低,而且也不合理,容易把問題掩蓋;
6、顯示介面的時候不支援可變個數的引數;
7、介面預設上需要手動填寫介面圖集,有點不靈活;


8、UI的遮罩表現雖然是全域性的,但是每次開關介面都會各自執行,因為我們介面開關的時候會觸發多個其他介面的開關,導致這個遮罩的演算法邏輯重複執行,而且可能相互干擾,得到錯誤的結果;
9、“是否需要貨幣欄”跟“貨幣欄型別”可以合併成一個選項,統一用“貨幣欄型別”,不設定則不需要;


優化方向:

1、每個介面節點下儲存自己的父節點和孩子節點,提高查詢效率,在首次訪問父節點或者孩子節點的時候動態初始化,避免所有節點同時初始化造成效能浪費;
2、"顯示的時候隱藏所有UI"功能存在隱患,將發起臨時隱藏的介面節點記錄下來,介面恢復的時候,只有記錄清空才能還原臨時隱藏狀態;
3、節點上新增“繼承孩子節點”功能,可以選定一個已存在的節點,用來繼承它的所有孩子節點,避免維護重複的節點關係。執行時根據引用動態生成真實
的孩子節點(之前嘗試過把引用的節點臨時掛靠到當前節點下,實踐的時候發現父節點頻繁變動有坑隱患,關係一旦錯亂會造成不可逆轉的錯誤,最後還是採用了更加保險的方案)。
4、刪除"關閉的時候關閉所有子介面"功能,預設直接關閉子介面。
5、刪除"關閉的時候顯示上級介面"功能,預設開啟上級介面。
6、介面遮罩的演算法邏輯可以考慮放到所有介面開關後統一處理,新增一個用於重新整理遮罩的事件,用於特殊情況下的額外重新整理,比如臨時關閉的一些UI,不走介面開關事件,但是遮罩需要重新重新整理;
7、節點查詢方案優化:
     a、第一優先順序從直接子節點進行查詢;
     b、第二優先順序從直接父節點遞迴往上查詢;
   c、第三優先順序從兄弟節點(父節點的子節點)進行查詢;
     d、第四優先順序從預設的節點開始查詢,這個預設的節點需要提前自定義,沒有的話就不查詢;
     e、沒有找到的話直接報異常,這樣既避免了查詢到了錯誤的節點帶來bug,也規避了大量的遞迴查詢帶來的效能損耗;