From 7d8e3ed8acae7fd34140e92c72e93d9ebb2e97bd Mon Sep 17 00:00:00 2001
From: client_Wu Xijin <364452445@qq.com>
Date: 星期三, 13 二月 2019 14:12:49 +0800
Subject: [PATCH] 3335 配置表读取重构。

---
 Core/GameEngine/Model/ConfigManager.cs               |    2 
 Core/GameEngine/Model/Config/ActorShowConfig.cs.meta |    2 
 Utility/LogicUpdate.cs                               |   51 +++++
 Utility/LogicUpdate.cs.meta                          |   12 +
 Utility/LogicEngine.cs                               |   61 ++++++
 Utility/ConfigInitiator.cs                           |   52 +++++
 Utility/ConfigInitiator.cs.meta                      |   12 +
 Core/GameEngine/Model/Config/ActorShowConfig.cs      |  315 +++++++++++++++++++++-------------
 Utility/LogicEngine.cs.meta                          |   12 +
 9 files changed, 396 insertions(+), 123 deletions(-)

diff --git a/Core/GameEngine/Model/Config/ActorShowConfig.cs b/Core/GameEngine/Model/Config/ActorShowConfig.cs
index 955f8f9..639309e 100644
--- a/Core/GameEngine/Model/Config/ActorShowConfig.cs
+++ b/Core/GameEngine/Model/Config/ActorShowConfig.cs
@@ -1,136 +1,211 @@
 锘�//--------------------------------------------------------
-//    [Author]:			绗簩涓栫晫
-//    [  Date ]:		   Tuesday, February 12, 2019
+//    [Author]:           Fish
+//    [  Date ]:           Wednesday, February 13, 2019
 //--------------------------------------------------------
 
-using UnityEngine;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
 using System;
+using UnityEngine;
 
-namespace TableConfig {
+public partial class ActorShowConfig
+{
 
-    
-	public partial class ActorShowConfig : ConfigBase {
+    public readonly int ID;
+	public readonly int NpcID;
+	public readonly int MapID;
+	public readonly int line;
+	public readonly int[] showNpcs;
+	public readonly int length;
+	public readonly int showNameTime;
+	public readonly int BindMissionID;
+	public readonly int type;
+	public readonly int[] scale;
+	public readonly int[] NpcFace;
+	public readonly int[] PosX;
+	public readonly int[] PosY;
+	public readonly int shadow;
+	public readonly int effect;
+	public readonly int uieffect;
+	public readonly string[] mob;
+	public readonly string cam;
+	public readonly int[] Height;
+	public readonly int DialogueTime;
+	public readonly int Dialogue;
+	public readonly int soundId;
+	public readonly int soundTime;
+	public readonly int step;
 
-		public int ID;
-		public int NpcID;
-		public int MapID;
-		public int line;
-		public int[] showNpcs;
-		public int length;
-		public int showNameTime;
-		public int BindMissionID;
-		public int type;
-		public int[] scale;
-		public int[] NpcFace;
-		public int[] PosX;
-		public int[] PosY;
-		public int shadow;
-		public int effect;
-		public int uieffect;
-		public string[] mob;
-		public string cam;
-		public int[] Height;
-		public int DialogueTime;
-		public int Dialogue;
-		public int soundId;
-		public int soundTime;
-		public int step;
-
-		public override string getKey()
+    public ActorShowConfig(string input)
+    {
+        try
         {
-            return ID.ToString();
+            var tables = input.Split('\t');
+
+            int.TryParse(tables[0],out ID); 
+
+			int.TryParse(tables[1],out NpcID); 
+
+			int.TryParse(tables[2],out MapID); 
+
+			int.TryParse(tables[3],out line); 
+
+			string[] showNpcsStringArray = tables[4].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+			showNpcs = new int[showNpcsStringArray.Length];
+			for (int i=0;i<showNpcsStringArray.Length;i++)
+			{
+				 int.TryParse(showNpcsStringArray[i],out showNpcs[i]);
+			}
+
+			int.TryParse(tables[5],out length); 
+
+			int.TryParse(tables[6],out showNameTime); 
+
+			int.TryParse(tables[7],out BindMissionID); 
+
+			int.TryParse(tables[8],out type); 
+
+			string[] scaleStringArray = tables[9].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+			scale = new int[scaleStringArray.Length];
+			for (int i=0;i<scaleStringArray.Length;i++)
+			{
+				 int.TryParse(scaleStringArray[i],out scale[i]);
+			}
+
+			string[] NpcFaceStringArray = tables[10].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+			NpcFace = new int[NpcFaceStringArray.Length];
+			for (int i=0;i<NpcFaceStringArray.Length;i++)
+			{
+				 int.TryParse(NpcFaceStringArray[i],out NpcFace[i]);
+			}
+
+			string[] PosXStringArray = tables[11].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+			PosX = new int[PosXStringArray.Length];
+			for (int i=0;i<PosXStringArray.Length;i++)
+			{
+				 int.TryParse(PosXStringArray[i],out PosX[i]);
+			}
+
+			string[] PosYStringArray = tables[12].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+			PosY = new int[PosYStringArray.Length];
+			for (int i=0;i<PosYStringArray.Length;i++)
+			{
+				 int.TryParse(PosYStringArray[i],out PosY[i]);
+			}
+
+			int.TryParse(tables[13],out shadow); 
+
+			int.TryParse(tables[14],out effect); 
+
+			int.TryParse(tables[15],out uieffect); 
+
+			mob = tables[16].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+
+			cam = tables[17];
+
+			string[] HeightStringArray = tables[18].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+			Height = new int[HeightStringArray.Length];
+			for (int i=0;i<HeightStringArray.Length;i++)
+			{
+				 int.TryParse(HeightStringArray[i],out Height[i]);
+			}
+
+			int.TryParse(tables[19],out DialogueTime); 
+
+			int.TryParse(tables[20],out Dialogue); 
+
+			int.TryParse(tables[21],out soundId); 
+
+			int.TryParse(tables[22],out soundTime); 
+
+			int.TryParse(tables[23],out step); 
+        }
+        catch (Exception ex)
+        {
+            DebugEx.Log(ex);
+        }
+    }
+
+    static Dictionary<int, ActorShowConfig> configs = new Dictionary<int, ActorShowConfig>();
+    public static ActorShowConfig Get(int id)
+    {   
+		if (!inited)
+        {
+            Debug.Log("ActorShowConfig 杩樻湭瀹屾垚鍒濆鍖栥��");
+            return null;
+        }
+		
+        if (configs.ContainsKey(id))
+        {
+            return configs[id];
         }
 
-		public override void Parse(string content) {
-			try
-            {
-                var contents = content.Split('\t');
+        ActorShowConfig config = null;
+        if (rawDatas.ContainsKey(id))
+        {
+            config = configs[id] = new ActorShowConfig(rawDatas[id]);
+            rawDatas.Remove(id);
+        }
 
-                int.TryParse(contents[0],out ID);
-			
-				int.TryParse(contents[1],out NpcID);
-			
-				int.TryParse(contents[2],out MapID);
-			
-				int.TryParse(contents[3],out line);
-			
-				var showNpcsStringArray = contents[4].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
-				showNpcs = new int[showNpcsStringArray.Length];
-				for (int i=0;i<showNpcsStringArray.Length;i++)
-				{
-					 int.TryParse(showNpcsStringArray[i],out showNpcs[i]);
-				}
-			
-				int.TryParse(contents[5],out length);
-			
-				int.TryParse(contents[6],out showNameTime);
-			
-				int.TryParse(contents[7],out BindMissionID);
-			
-				int.TryParse(contents[8],out type);
-			
-				var scaleStringArray = contents[9].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
-				scale = new int[scaleStringArray.Length];
-				for (int i=0;i<scaleStringArray.Length;i++)
-				{
-					 int.TryParse(scaleStringArray[i],out scale[i]);
-				}
-			
-				var NpcFaceStringArray = contents[10].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
-				NpcFace = new int[NpcFaceStringArray.Length];
-				for (int i=0;i<NpcFaceStringArray.Length;i++)
-				{
-					 int.TryParse(NpcFaceStringArray[i],out NpcFace[i]);
-				}
-			
-				var PosXStringArray = contents[11].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
-				PosX = new int[PosXStringArray.Length];
-				for (int i=0;i<PosXStringArray.Length;i++)
-				{
-					 int.TryParse(PosXStringArray[i],out PosX[i]);
-				}
-			
-				var PosYStringArray = contents[12].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
-				PosY = new int[PosYStringArray.Length];
-				for (int i=0;i<PosYStringArray.Length;i++)
-				{
-					 int.TryParse(PosYStringArray[i],out PosY[i]);
-				}
-			
-				int.TryParse(contents[13],out shadow);
-			
-				int.TryParse(contents[14],out effect);
-			
-				int.TryParse(contents[15],out uieffect);
-			
-				mob = contents[16].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
-			
-				cam = contents[17];
-			
-				var HeightStringArray = contents[18].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
-				Height = new int[HeightStringArray.Length];
-				for (int i=0;i<HeightStringArray.Length;i++)
-				{
-					 int.TryParse(HeightStringArray[i],out Height[i]);
-				}
-			
-				int.TryParse(contents[19],out DialogueTime);
-			
-				int.TryParse(contents[20],out Dialogue);
-			
-				int.TryParse(contents[21],out soundId);
-			
-				int.TryParse(contents[22],out soundTime);
-			
-				int.TryParse(contents[23],out step);
-            }
-            catch (Exception ex)
+        return config;
+    }
+
+	public static bool Has(int id)
+    {
+        return configs.ContainsKey(id) || rawDatas.ContainsKey(id);
+    }
+
+	public static bool inited { get; private set; }
+    protected static Dictionary<int, string> rawDatas = null;
+    public static void Init(bool sync=false)
+    {
+	    inited = false;
+		var path = string.Empty;
+        if (AssetSource.refdataFromEditor)
+        {
+            path = ResourcesPath.CONFIG_FODLER +"/ActorShow.txt";
+        }
+        else
+        {
+            path = AssetVersionUtility.GetAssetFilePath("config/ActorShow.txt");
+        }
+
+        if (sync)
+        {
+            var lines = File.ReadAllLines(path);
+            rawDatas = new Dictionary<int, string>(lines.Length - 3);
+            for (int i = 3; i < lines.Length; i++)
             {
-                DebugEx.Log(ex);
+                var line = lines[i];
+                var index = line.IndexOf("\t");
+                var idString = line.Substring(0, index);
+                var id = int.Parse(idString);
+
+                rawDatas[id] = line;
             }
-		}
-	
-	}
+			inited = true;
+        }
+        else
+        {
+            ThreadPool.QueueUserWorkItem((object _object) =>
+            {
+                var lines = File.ReadAllLines(path);
+                rawDatas = new Dictionary<int, string>(lines.Length - 3);
+                for (int i = 3; i < lines.Length; i++)
+                {
+                    var line = lines[i];
+                    var index = line.IndexOf("\t");
+                    var idString = line.Substring(0, index);
+                    var id = int.Parse(idString);
+
+                    rawDatas[id] = line;
+                }
+
+                inited = true;
+            });
+        }
+    }
 
 }
 
diff --git a/Core/GameEngine/Model/Config/ActorShowConfig.cs.meta b/Core/GameEngine/Model/Config/ActorShowConfig.cs.meta
index 96539f5..a2a9a17 100644
--- a/Core/GameEngine/Model/Config/ActorShowConfig.cs.meta
+++ b/Core/GameEngine/Model/Config/ActorShowConfig.cs.meta
@@ -1,6 +1,6 @@
 fileFormatVersion: 2
 guid: bda508e995d835441ae75633251ca0d2
-timeCreated: 1549978954
+timeCreated: 1550037241
 licenseType: Pro
 MonoImporter:
   serializedVersion: 2
diff --git a/Core/GameEngine/Model/ConfigManager.cs b/Core/GameEngine/Model/ConfigManager.cs
index f54bcfd..5cae9c7 100644
--- a/Core/GameEngine/Model/ConfigManager.cs
+++ b/Core/GameEngine/Model/ConfigManager.cs
@@ -134,7 +134,6 @@
         AddAsyncTask<QuestionBankConfig>();
         AddAsyncTask<WingRefineExpConfig>();
         AddAsyncTask<UnionLivenConfig>();
-        AddAsyncTask<ActorShowConfig>();
         AddAsyncTask<FunctionForecastConfig>();
         AddAsyncTask<GmCmdConfig>();
         AddAsyncTask<GetItemWaysConfig>();
@@ -289,7 +288,6 @@
     {
         StartSyncTask<NPCConfig>();
         StartSyncTask<ModelResConfig>();
-        StartSyncTask<ActorShowConfig>();
         StartSyncTask<IconConfig>();
         StartSyncTask<SysInfoConfig>();
         StartSyncTask<LanguageConfig>();
diff --git a/Utility/ConfigInitiator.cs b/Utility/ConfigInitiator.cs
new file mode 100644
index 0000000..b04a56c
--- /dev/null
+++ b/Utility/ConfigInitiator.cs
@@ -0,0 +1,52 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class ConfigInitiator
+{
+    public static bool preInited {
+        get {
+            return false;
+        }
+    }
+
+    public static void PreInit()
+    {
+    }
+
+    static int taskCount = 0;
+    static int completeCount = 0;
+    static bool done = false;
+    public static float progress { get; private set; }
+
+    public static void Init()
+    {
+
+        ActorShowConfig.Init();
+		taskCount++;
+		//鍒濆鍖栫粨鏉�
+
+        var logicUpdate = new LogicUpdate();
+        logicUpdate.Start(
+            () =>
+            {
+                CountInitedConfig();
+                if (done)
+                {
+                    logicUpdate.Destroy();
+                }
+            }
+            );
+    }
+
+    private static void CountInitedConfig()
+    {
+        completeCount += ActorShowConfig.inited ? 1 : 0;
+		//缁熻閰嶇疆琛ㄨВ鏋愯繘搴�
+
+        done = completeCount >= taskCount;
+        progress = (float)completeCount / taskCount;
+    }
+
+
+}
diff --git a/Utility/ConfigInitiator.cs.meta b/Utility/ConfigInitiator.cs.meta
new file mode 100644
index 0000000..c424666
--- /dev/null
+++ b/Utility/ConfigInitiator.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 6731b290e00f46a40a7f7974c3ddb503
+timeCreated: 1550036577
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Utility/LogicEngine.cs b/Utility/LogicEngine.cs
new file mode 100644
index 0000000..5918237
--- /dev/null
+++ b/Utility/LogicEngine.cs
@@ -0,0 +1,61 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class LogicEngine : MonoBehaviour
+{
+    public static LogicEngine Instance { get; private set; }
+
+    [RuntimeInitializeOnLoadMethod]
+    static void Init()
+    {
+        if (FindObjectOfType<LogicEngine>() == null)
+        {
+            var gameObject = new GameObject("LogicEngine");
+            Instance = gameObject.AddMissingComponent<LogicEngine>();
+            GameObject.DontDestroyOnLoad(gameObject);
+        }
+    }
+
+    List<LogicUpdate> logicUpdates = new List<LogicUpdate>();
+    public void Register(LogicUpdate logicUpdate)
+    {
+        if (!logicUpdates.Contains(logicUpdate))
+        {
+            logicUpdates.Add(logicUpdate);
+        }
+    }
+
+    public void UnRegister(LogicUpdate logicUpdate)
+    {
+        if (logicUpdates.Contains(logicUpdate))
+        {
+            logicUpdates.Remove(logicUpdate);
+        }
+    }
+
+    void Update()
+    {
+        for (var i = logicUpdates.Count - 1; i >= 0; i--)
+        {
+            var item = logicUpdates[i];
+            if (item.destroyDirty)
+            {
+                logicUpdates.RemoveAt(i);
+            }
+            else
+            {
+                try
+                {
+                    item.Update();
+                }
+                catch (System.Exception ex)
+                {
+                    DebugEx.LogError(ex);
+                }
+            }
+        }
+
+    }
+
+}
diff --git a/Utility/LogicEngine.cs.meta b/Utility/LogicEngine.cs.meta
new file mode 100644
index 0000000..4d3554a
--- /dev/null
+++ b/Utility/LogicEngine.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: 0e911575c672d8f4eab0e066f163a2fd
+timeCreated: 1550036706
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Utility/LogicUpdate.cs b/Utility/LogicUpdate.cs
new file mode 100644
index 0000000..1c2a344
--- /dev/null
+++ b/Utility/LogicUpdate.cs
@@ -0,0 +1,51 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System.Threading;
+using System;
+
+public class LogicUpdate
+{
+    public readonly float stepInterval = 0.033333f;
+
+    public bool destroyDirty { get; private set; }
+    float nextUpdateTime = 0f;
+    Action update;
+
+    public LogicUpdate(float stepInterval = 0.033333f)
+    {
+        this.stepInterval = Mathf.Clamp(stepInterval, 0.033333f, float.MaxValue);
+    }
+
+    public void Start(Action updateCallBack)
+    {
+        this.destroyDirty = false;
+        this.update = updateCallBack;
+        LogicEngine.Instance.Register(this);
+    }
+
+    public void Destroy()
+    {
+        this.destroyDirty = true;
+        this.update = null;
+        OnDestroy();
+    }
+
+    public virtual void OnDestroy()
+    {
+
+    }
+
+    public void Update()
+    {
+        if (Time.time >= nextUpdateTime)
+        {
+            nextUpdateTime = Time.time + stepInterval;
+            if (update != null)
+            {
+                this.update();
+            }
+        }
+    }
+
+}
diff --git a/Utility/LogicUpdate.cs.meta b/Utility/LogicUpdate.cs.meta
new file mode 100644
index 0000000..47162e2
--- /dev/null
+++ b/Utility/LogicUpdate.cs.meta
@@ -0,0 +1,12 @@
+fileFormatVersion: 2
+guid: c0ac79931c41d0e4c8a56f85e740ccdc
+timeCreated: 1550036706
+licenseType: Pro
+MonoImporter:
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

--
Gitblit v1.8.0