1. 程式人生 > >遊戲資料表的資料驅動

遊戲資料表的資料驅動

前言

之前博文介紹過了,一種程式碼匯出的工作方式《如何讓你的程式載入Excel配置檔案》。但這種方式存在一些弊端,比如如果想在執行時替換資料(Reload),就會比較困難(解釋執行語言例外)。但在目前的遊戲架構中,不論是客戶端還是伺服器,都強烈的具有這種需求。

主要思想

此時,我們的思路是,分離類定義和資料本身,類定義必須生成為匯出語言的程式碼,以方便IDE識別。資料匯出成自動生成型別可以識別的檔案格式。

匯出類結構

    public class TestAllTypeConfig
    {
		public uint Id;
		public uint Id2;
		public string[] StringArray;
		public uint[] uintArray;
		public int[] intArray;
		public bool[] boolArray;
		public float[] floatArray;
		public double[] doubleArray;
		public uint uintType;
		public string stringType;
		public float floatType;
		public double doubleType;
	}

把excel檔案中的定義頭,匯出成程式碼(上面的例子是C#),程式設計師不需要在手寫配表匹配的類定義以及資料載入程式碼(ReadFile方法)。其中,資料載入的程式碼是和資料檔案格式相關聯的,這一部分會再匯出資料一節中講解。

此外,我們還需要生成資料容器和訪問函式,提供給程式設計師訪問需要的資料。

        private static Dictionary<uint, ItemConfig> config = new Dictionary<uint, ItemConfig>();
        public static ItemConfig GetConfig(uint id)
        {
            ItemConfig data;
            if (config.TryGetValue(id, out data))
                return data;
            throw new NullReferenceException(string.Format("配置表ItemConfig不存在id={0}", id));
        }

匯出資料

資料檔案的核心部分顯然就是上面config字典中的資料。這應該不是什麼難事,有一萬種方法可以把一個物件序列化成一個位元組流byte[]。我們可要呼叫現有的類庫(比如json),或者自動化生成程式碼,把物件轉化為流。作為逆流程,我們生成對應的Read方法,負責把資料從流讀出,並初始化物件。

此外,我們還需要給這個檔案增加一些安全機制,讓整個檔案的格式更加完整。

|CFGF|----VERSIONCODE----|-------------DATA-------------|CHECKSUM|

|CFGF| 檔案頭,如果讀取錯誤檔案,Read方法可以快速返回錯誤

|VERSIONCODE| 配置表版本碼,如果載入程式碼和資料版本不同,Read方法同樣會返回失敗

|DATA| 之前提到的資料部分

|CHECKSUM| 檔案內容的MD5校驗和,防止檔案內容被篡改的情況等