Unity中基於字首樹的高效能紅點系統實現

2021-10-09 08:24:50 字數 1483 閱讀 3812

文章主要介紹了紅點系統的特點,如何基於字首樹這一資料結構實現紅點系統,提出了相關實現中存在的兩個效能問題,以及如何去解決這兩個問題,並在最後基於unityeditor的treeview開發了樹檢視視窗,方便使用者在開發階段的debug需求。

紅點系統是在大部分遊戲中都能看到的常見需求。

其作用在於,在玩家達成某種條件時(如新獲得某個裝備、道具數量達到某個需求),在相關的ui上亮起紅點來提示玩家進行相關操作。

紅點系統的乙個鮮明特徵即是它的「層層套娃」性,子介面亮起紅點時其父介面也需要同時被亮起紅點,一直點亮到主介面為止。

以下圖為例,當某個特定的主線章節亮起紅點時,

其父介面的主線章節按鈕和出擊頁籤也需要被亮起紅點。

最後主介面上的出擊按鈕也會亮起紅點來最終達到提示玩家的目的。

如此層層巢狀下來,如果不對父子紅點進行統一的觸發管理,而是讓負責各個模組的程式設計師各自管理,必將導致各個模組的紅點觸發邏輯難以維護且效能堪憂的結果。

而針對紅點系統這種十分強調父子關係的業務需求,使用「字首樹」進行管理將是非常好的選擇。

那麼何為字首樹呢?

字首樹本質上是一種多叉樹,樹節點儲存了字元,具有相同字首的字串將具有相同的父節點,在進行字串儲存和查詢時具有較好的效能優勢。

通過將紅點抽象為路徑,只需要稍加修改,讓節點中儲存對應的路徑字串和節點值,便可以方便地實現紅點系統。

以之前的圖為例,筆者將每一層ui都依其父子關係設定為樹中節點,最終只需要點亮路徑為mainattack/attack/chapter/18的節點,便可以同時亮起其所有父節點對應的ui的紅點。

而當葉子節點的紅點被隱藏時,其所有父節點也會自動檢測所有子節點狀態來決定是否隱藏自身的紅點。

1. 在處理路徑時直接使用split方法進行字串暴力切割,導致造成額外的記憶體分配。

2. 在子節點狀態改變後需要也改變父節點狀態時不進行限制,多個子節點同時改變將導致額外的無用重新整理。

筆者在後續章節對紅點系統的具體實現中,便試**決這兩個痛點,並開發乙個編輯器下的紅點樹視覺化視窗,輔助使用者對紅點系統進行debug。

課程最後會提供包含完整**與測試用例的demo工程方便讀者學習。

高效能MYSQL 基於binlog的主從複製

mysql的主從配置又叫replication,ab複製,基於binlog二進位制日誌,主資料庫必須開啟binlog二進位制日誌才能進行複製。作為非同步複製,其主庫將事件寫入binlog二進位制檔案,dump執行緒將binlog檔案傳送出去,不保證其他從節點是否會收到binlog二進位制檔案。1.主...

基於MySQL的高效能資料庫應用開發

一 高效能資料庫的選擇 在資料庫的應用開發中,常常會遇到效能和代價的之間矛盾。以作者在開發 行 情查詢和交易系統中遇到的問題為例,要在實時記錄1000多隻 每分鐘更新一次的行 情資料的同時,響應大量併發使用者的資料查詢請求。考慮到價效比和易維護性,系統又 要求在基於pc伺服器,windows nt平...

基於Oracle的高效能動態SQL程式開發

摘要 oracle編譯pl sql程式塊分為兩個種 其一為前期聯編 early binding 即sql語句在程式編譯期間就已經確定,大多數的編譯情況屬於這種型別 另外一種是後期聯編 late binding 即sql語句只有在執行階段才能建立,例如當查詢條件為使用者輸入時,那麼oracle的sql...