Database Hot Loader 首部曲:Introduction

mana-energy-potion「我有一個夢想,期望有天我們能夠免於調校遊戲資料數據的苦痛。」馬丁路德博士夢想,是人人生而平等並且免於種族歧視的迫害。而我的夢想,沒有這麼崇高偉大,只是希望能夠幫助團隊成員改善遊戲的開發流程。

每次當我看到遊戲企畫者,為了調整遊戲中的各種數據,而必須不斷重複一連串繁瑣而且漫長的操作程序,就替他們感到很辛苦。為了測試資料數據的正確性,首先要在 Microsoft Office Excel 上輸入資料內容,存檔後匯出,接著以外部工具將文字檔轉換為遊戲自訂的檔案格式,把檔案置入遊戲目錄中,最後再開啟遊戲,等待遊戲程式以及遊戲資料載入完成,然後檢視執行的結果。

「咦,食人怪的偵察範圍太遠,而火球魔法的距離太近了些。」於是按下離開遊戲的快速鍵,然後在 Excel 表格中修改相對應的數據後,再次存檔匯出,再次以外部工具轉換為遊戲自訂的檔案格式,再次把檔案置入遊戲目錄中,然後再次開啟遊戲,再次等待遊戲程式與遊戲資料載入完成。

(圖片來源:www.play-gadgets.com)

除非企畫設計者擁有強大的靈動感知能力,能夠精準地預測出合適的遊戲數值,否則總是需要不斷地嘗試錯誤並且經歷許多修改程序,才能夠將遊戲數據調校到完美平衡的狀態。不停地、不停地、不停地重開遊戲,幾乎是每位遊戲企畫設計者都曾經歷過的處境。在遊戲專案開發初期時,可能還感受不到特別的困擾之處;然而當專案到了後期階段,遊戲中的美術素材動輒佔有成千上百 MB 的份量,所以每次開啟遊戲都必須要等待漫長的遊戲初始化載入時間,甚至只是修改單一一個欄位的數據,同樣難以免於遊戲重開的等待過程。

有沒有可能改善這種狀況,減少重新開啟遊戲程式的頻率?有沒有可能在不需要重新啟動遊戲程式的情況下,讓企畫設計者能夠即時調整遊戲的資料庫數據?

為了達成這個目標,我將以大約四篇文章左右的篇幅,從無到有完整實做出 Database Hot Loader 系統(簡稱為 DHL),在文章裡討論其中各種設計決定、實作細節以及系統效能的測試成果,並且附上完整程式碼與應用範例。這個系統是在我思考另一個設計問題時,意外衍生出來的想法;最近進行了初步的實作測試後,發現系統的可行性很高,值得將想法與實作的過程整理出來給各位參考。目前 DHL 系統仍有許多未盡完善之處,隨著後續文章的介紹,如果有其他的功能需求、設計想法或者實作技巧的改進意見,還望各位讀者能不吝給予評論指教。

遊戲界裡,幾乎所有的商業遊戲,都需要某種形式的資料庫,不論遊戲中所使用的是純文字、二進位制、XML 格式或是其他自訂的格式,「資料庫」可以說是最適合企畫設計者用於建立資料數據的方法。而為了能夠系統化且大量化執行資料庫的相關工作,業界中大部分的企畫設計者,都相當倚重 Microsoft 的 Office Excel 試算軟體做為建立與編輯資料表格的得力工具。

我曾經以程式設計者的角度,詢問企畫設計者以自製的資料編輯器取代 Excel 使用的可能性,但是如果未能提供大量作業、搜尋字串、取代內容以及公式運算等等功能,對企畫設計者來說,自製的編輯器並沒有足夠的吸引力。另外,在使用者的熟悉度與介面操作的習慣性上,Excel 同樣具有極大的優勢,所以除了極少部分比較特殊的資料,使用其他編輯器能夠得到良好的成效以外,Excel 仍然是無可取代的資料編輯器霸主

在遊戲程式資料庫的傳統作法裡,我們會先將 Excel 檔案另存為以逗號或者 Tab 字元分隔的 .csv 純文字格式,接著由於程式系統讀取效能上的考量以及防止遊戲玩家修改資料的目的,通常會再將 .csv 格式的檔案經過自製程式的轉換程序,進一步轉換為二進位制格式的資料。所以對於企畫設計者來說,如果要修改遊戲所使用的測試資料,大致上可以分為以下三個程序:

  1. 於 Excel 中修改資料數據。
  2. 轉換成遊戲程式可使用的資料格式。
  3. 重新開啟遊戲以載入新的資料檔案。

由上述步驟可知,程式設計者需要撰寫一個資料格式的轉換程式,能夠讀取 .csv 檔案並且產生出二進位制的檔案以供企畫設計者使用;接著再於遊戲主程式系統中,撰寫出能夠讀取這個二進位制檔案的類別與函式;最後,達成在遊戲中可動態重新讀取資料的功能。所以,如果再進一步將以上的程序以操作步驟詳細說明,設計 DHL 系統的目標步驟為:

  1. 匯出資料:在 Excel 中修改資料後,另存為 .csv 格式的檔案。
  2. 轉換格式:使用轉換程式將 .csv 檔案轉換為遊戲的資料庫格式。
  3. 載入資料:於遊戲中按下快速鍵,重新載入資料庫檔案。

如果可以達成「載入資料」這個步驟,就能夠免除離開遊戲後再重新開啟遊戲的繁瑣程序了!以前在「使用Lua實做GUI系統的遊戲實例」文中,曾提到能夠將 Lua 語言當作一種資料描述語言。在 DHL 系統中,就是要利用 Lua 語言的強大威力,幫助我們實現「資料熱抽換」的功能。所以只要能夠將 .csv 格式的檔案,轉換成為 .lua 格式的檔案,就可以輕易地達到即時載入資料庫的目標!

但光是這樣仍然有所不足。雖然匯出資料、轉換格式,最後載入資料的三拍子節奏,確實能夠達到即時修改數據且載入資料的目標,但對於使用者來說,這幾個連續動作仍然不是非常直覺易用的操作程序。在電腦作業系統中,企畫設計者必須同時開啟 Excel 軟體、轉換程式以及遊戲程式三個視窗,然後在這三個視窗之間依序切換,才能夠達到熱抽換遊戲資料的目標。

「如果能夠省略轉換格式的步驟就好了!」

你的心聲我聽到了!想要省略轉換格式的步驟其實並不困難,只要能夠把原來的 .csv 格式檔案,直接轉換成合法的 .lua 格式檔案即可達成目標。但是要怎麼在 Excel 中直接將 .csv 格式的檔案轉換成 .lua 格式的檔案呢?關於這個難題,Visual Studio Tools for Office(簡稱為 VSTO)的現身,將為我們帶來答案的曙光。因此,在只需要同時開啟 Excel 資料表以及遊戲程式的情況下,DHL 系統的理想操作步驟就可以修改為:

  1. 匯出資料:在 Excel 中修改資料後,匯出為 .lua 格式的檔案。
  2. 載入資料:於遊戲中按下快速鍵,重新載入資料庫檔案。

只要在 Excel 視窗以及遊戲程式視窗裡按下兩個 Click,就能夠輕鬆地重新載入遊戲資料,兩個步驟就搞定!如前文所述,DHL 系統的實作目標,就是在無須重新啟動遊戲的情況下,可以在 Excel 表格中修改資料數據,然後立即動態載入遊戲程式之中。在後續的 Database Hot Loader 系列文章裡,將大力倚賴 Lua 語言與 VSTO 幫助我們實現夢想中的目標。

當然,DHL 系統的設計與實作方法並不是無懈可擊般的完美。首先,列出使用 DHL 系統的缺點:

  • 企畫設計者使用 Microsoft Office Excel 軟體,需要錢。
  • 程式設計者開發 DHL 系統必須使用 Microsoft Visual Studio 軟體的 Team Suite 版本,同樣需要錢。
  • DHL 系統的使用者必須額外安裝 .NET Framework Runtime 以及 VSTO Runtime。
  • 與同事的聊天時間以及瀏覽網頁時間減少。

以及使用 DHL 系統的優點:

  • 不需要撰寫額外的檔案格式轉換程式。
  • 不需要在遊戲程式系統中撰寫資料庫的讀取類別與函式。
  • 減少修改測試資料的時間,使企畫設計者能夠進行更多次測試程序,以獲得更佳的遊戲數據平衡性。
  • 輕輕兩下,快又有效!

經過本篇序曲的介紹之後,你是否有點心動了?次篇文章,將帶領各位進入美妙的 VSTO & Lua 雙重奏鳴曲之中。

9 Replies to “Database Hot Loader 首部曲:Introduction”

  1. 我們用ASP.NET (Web 編輯介面)+ SQL DB 來做
    所以理論上有達到你的DHL系統的理想,
    可是編輯功能卻是很不理想…缺乏execl的方便性
    有想過用Visual Studio Tools for Office + Execl
    但是沒時間研究, 所以期待你接下來的介紹.

  2. @gino:
    用 ASP.NET 的 Web 介面加上 SQL 來編輯 DB? O_Oa
    對我來說,這還真是個新奇而且從來沒想過的作法。
    果然多多交流準沒錯,還請多多指教呀~ XD

  3. 主要的原因應該是因為game server 需要SQL DB
    所以直接就用這個方式寫入DB, 然後export 資料給client端使用
    只是用Web編輯限制很多, 一次只能修改一個row的資料
    無法像execl 這麼方便編輯, 企劃對於這個部份比較多怨言

  4. 對不起前篇錯字連篇請刪,我看了都噴茶……

    重來一次,咳咳,如果能在遊戲中直接切換開發者模式互動式調整數據那是最好的了,最好是連調出來的視覺化……

    但這種作法程式的開發成本好像又更高了

  5. @gino:
    原來如此,那如果是只有 Client 端會使用到的資料表,也是以相同的方式編輯匯出嗎?

    Excel 的各種資料編輯功能還是相當強大而且難以取代,特別是當大家都習慣了這種便利性之後,要更改作業習慣更是難上加難啊。

    @doomleika:
    前一則留言已刪除。

    那種可以在遊戲中直接編輯資料的編輯器,只有在 Unreal Engine 與 CryEngine 等級的遊戲引擎中會有。 XD

    不過並不是所有的遊戲資料都適合用「所見即所得」的方式編輯。那種編輯器通常會用來製作遊戲關卡之類的內容,但是另外還有許多遊戲資料在大量編輯修改時,使用 Excel 之類的文書軟體會來得便利許多。

  6. 是的, 全部都是用Web編輯. 對server來說, 資料直接是SQL DB, 不需要轉換, 可以直接存取
    對於client, 就是作個輸出器, 把需要的表格和欄位, 透過SQL 指令抓出, 然後存成client端要使用的格式
    其實以現在微軟重視Rich Internet Application(RIA)的發展, 或許web化的excel編輯功能終究會出現
    只是不曉得要等待何時..

  7. @gino:
    瞭解~ 能夠輸入成 Server 可直接取用的 SQL DB 形式,對 Server 端來說的確非常便利。
    提到 RIA,Google Doc 的發展也很令人期待,希望有天能夠取代掉 Word 與 Excel 的王位。 XD

  8. 基本上是可以透過Excel搭配VBA,
    以ADO元件直接存取SQL Server,
    如此就可省掉以Web介面編輯資料的不便,
    又可以由企劃將編輯完之資料,
    直接依Server或是Client所需之資料結構直接倒入DB,
    Server端程式執行時,即可直接存取DB。
    Client端於開發階段亦可如此存取DB,等到版本Release時再行自DB export出檔案。
    (末兩句與gino大所述相同,在此為求完整性,贅述了…)

  9. @Mias:
    你好,

    是以 VBA 的語法去存取 ADO 元件嗎?
    我倒是沒有想過可以使用這個做法哩。又學到一招了。 = =+

    感謝你提供的方法。 ^^

Leave a Reply