幀同步的邏輯工程維護


title: 幀同步的邏輯工程維護
date: 2019-02-03 11:52:33
tags: 工作反思 幀同步
categories: 技術積累

目前在做其他項目,之前維護接近一個月的邏輯工程,覺得寫點什麼才能對的起這段時光。當然來說,我也覺得做的不夠好。既有經驗的問題,也有在思考需求的不明確。在時間緊迫情況下,會有動作變形。

一.接手前的狀況

客戶端主要邏輯邏輯是使用C#寫,但是邏輯工程是把客戶端中抽出了一些邏輯部分的內容,2月份纔開始做了第一版本。當時已經到4月低的版本,中間更新能編譯成功,但不清楚是否有效。

我接手的時候已經到6月初了。當時7月給騰訊的版本中,有一項內容是戰後做邏輯驗證。邏輯工程要保持更新到最新,要在服務端可以啓用。

客戶端在開發功能的同時,也有人整理代碼和同步加載改成異步加載的加載優化,涉及代碼變更很大,有點不知道從何處下手。 客戶端在啓動更新等等,加入整個遊戲狀態機。

其次一些配置文件的讀取,因修改兩邊需要不同的代碼來管理了。

二.遇到的問題

無從下手的我,只想到把代碼更新到最新。中間2個月一直有新的功能開發,一直有更新代碼。情況就是一個人
要去整合處理十多人的提交,有點暈。

配置和代碼雖然是通過批處理拷貝過來的,但是並沒有被正確調用。脫離unity工程的DLL工程,看對應的報錯很不方便。只能有try Catch捕捉。

前期一個能編譯的成功的版本都不行,中間涉及改動,一直以最新客戶端版本爲準。通過看代碼和缺少報錯,把一些新的內容和缺少內容加入。運行過程中是一直報錯的。看下來是配置有問題。

重新梳理,把客戶端版本的狀態機機制看懂,並加入到邏輯工程中。配置更新到最新。對應讀取方式做了區分。但還是不行。

深入去看每一個配置內容,有5個在戰鬥加載前要讀取的配置,在考慮中間的時候,有人在調整相關配置的路徑,配置讀取方式有同步改成異步讀取,可是整個邏輯工程只支持同步。

三.調整

1.老大給的版本思路,定到某個一個提交版本。客戶端和邏輯工程同一個版本進行對比Log。
2.在另外一個同事加入後,在客戶端代碼里加入邏輯工程的宏,通過bat同步後不用在手工修改了。
3.配合的服務器調整打印的log格式。
4.梳理整個戰鬥流程,和之前版本的相比,一些配置的加載順序有修改。
5.單例初始化時機的問題,邏輯工程不同,有些單例初始化時機不同。

四.總結

1.從整個需求上並沒有定位清楚,這個邏輯工程的目的,我收到需求是能編譯成功就行。而從版本計劃上來說,要在測試版本中做戰鬥驗證。
2.從經驗來說,之前沒寫過C++工程的,對於dll有點陌生
3.一個人針對很多人提交,沒做過版本合併的經驗,需要定一個svn提交記錄並進行更新。
4.從維護邏輯工程,確實幀同步查找問題,就打log,看調用棧。長時間看有點考驗耐心
5.做log對比,最好的方式是讓兩邊的打印方式同步。我有點懵,並沒有要求服務器配合,而是自己看着打印日記查了幾天,老大介入後,服務器做了相關的配合
6.正因爲缺少相關的經驗,客戶端要在對應的cs,要加對應的邏輯工程宏。我想着不污染客戶端代碼,自己去修改。
7.邏輯工程確實查出了一些問題,很有意思
* 排序問題,兩個變量,對某個屬性的數值相同,沒有加入第二條件做排序輔助,客戶端和邏輯工程排序結果不同。這個問題比較難復現。只有一些特殊條件下才能觸發。
* 隨機種子的調用數量不一致,這是看打印日記很容易看出來得,在執行上有用到隨機種子的地方沒屏蔽乾淨。隨機轟炸,客戶端表現屏蔽,但是調用隨機種子的邏輯沒處理
* MainRole概念,在很多遊戲中都主端處理和非本端處理。當一些地方爲null,會強制把MainRole的數據放進去。邏輯工程不作爲一個主端,MainRole是沒有數據的。這種執行肯定會出錯。邏輯工程dll是把各個端數據拿來驗證。一個房間24個人,邏輯工程就第25個。但是實際處理中,他不參與房間裏任何數據處理。
* 先理順整個處理流程,纔開始動手纔是關鍵,接手的時候,並沒有注意到客戶端和邏輯工程在流程上修改了,花了很多冤枉的時間。
8.非常謝謝對應的服務器開發高韓寫了邏輯驗證的dll,用幀數據流在查找dll的問題。在查找問題的時候更方便多了。
9.對幀同步開發理解更深了,正是有了這樣的機會。
10.如果時間可以的話,在邏輯工程還是先做成dll給客戶端調用,畢竟那纔是正確的執行步驟。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章