From fcce9ab0e54e4580569ba4ed5be0f4e3ba4d37fa Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期二, 09 十二月 2025 17:12:02 +0800
Subject: [PATCH] 0312 优化字符串拼接 - 改名

---
 Assets/Editor/Tool/BytesVersionMaker.cs                 |    4 
 Assets/Editor/Tool/UpdateSpritePackingSetting.cs        |    6 
 Assets/Launch/Manager/LocalResManager.cs                |    4 
 Assets/Editor/Tool/AssetsVersionCmpMaker.cs             |    2 
 Assets/Editor/Tool/AssetsVersionMaker.cs                |    4 
 Assets/Launch/Common/AssetVersion.cs                    |    4 
 Assets/Editor/Tool/SpriteManageTool.cs                  |   16 
 Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs |   28 +-
 Assets/Editor/Tool/ClientPackage_Standalone.cs          |   24 +-
 Assets/Launch/Common/FileExtersion.cs                   |    2 
 Assets/Editor/Tool/ClientPackage.cs                     |   62 +++---
 Assets/Launch/UI/LaunchWins/LaunchExWin.cs              |    4 
 Assets/Editor/Web/NetPkgTool.cs                         |    4 
 Assets/Launch/Common/DownLoadAndDiscompressTask.cs      |    4 
 Assets/Launch/Utility/StringUtility.cs                  |  199 +++++++++++++++++----
 Assets/Editor/Tool/AssetBundleBuildExtersion.cs         |   10 
 Assets/Launch/Launch.cs                                 |    1 
 Assets/Editor/Tool/BuildExtersion.cs                    |    8 
 Assets/Editor/ConfigGen/ConfigClassGenerate.cs          |  130 +++++++-------
 Assets/Editor/Tool/AssetBundleBuildTool.cs              |    6 
 20 files changed, 318 insertions(+), 204 deletions(-)

diff --git a/Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs b/Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs
index 112d4e1..95a28ef 100644
--- a/Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs
+++ b/Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs
@@ -37,12 +37,12 @@
                 switch (m_UserData.m_BuildTarget)
                 {
                     case ValidBuildTarget.Android:
-                        return StringUtility.Contact("Assets/StreamingAssets", "/android");
+                        return StringUtility.Concat("Assets/StreamingAssets", "/android");
                     case ValidBuildTarget.iOS:
-                        return StringUtility.Contact("Assets/StreamingAssets", "/ios");
+                        return StringUtility.Concat("Assets/StreamingAssets", "/ios");
                     case ValidBuildTarget.StandaloneWindows:
                     case ValidBuildTarget.StandaloneWindows64:
-                        return StringUtility.Contact("Assets/StreamingAssets", "/standalone");
+                        return StringUtility.Concat("Assets/StreamingAssets", "/standalone");
                     default:
                         return "Assets/StreamingAssets";
                 }
@@ -680,7 +680,7 @@
         {
             UpdateScriptableObjectsSetting.SetAllScriptableObjectAssetBundleName();
             ExcuteBuildAsset("config");
-            TableTool.CopyConfigsToOutPutPath(StringUtility.Contact(m_UserData.m_OutputPath, "/config"));
+            TableTool.CopyConfigsToOutPutPath(StringUtility.Concat(m_UserData.m_OutputPath, "/config"));
             Debug.Log("config 澶勭悊瀹屾垚");
         }
         //鍙戝寘鏃惰幏鍙栫儹鏇磀ll鍜岃鍓狝OT
@@ -690,7 +690,7 @@
             PrebuildCommand.GenerateAll();
             // 杈撳嚭鍒癆ssetBundles鐩綍
             var outputPath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
-            outputPath = StringUtility.Contact(outputPath, "/logicbytes");
+            outputPath = StringUtility.Concat(outputPath, "/logicbytes");
             if (Directory.Exists(outputPath))
                 Directory.Delete(outputPath, true);
             //澶嶅埗鏂扮敓鎴愮殑AOT dll鍒版寚瀹氳矾寰�
@@ -712,7 +712,7 @@
             }
             // 杈撳嚭鍒癆ssetBundles鐩綍
             var outputPath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
-            outputPath = StringUtility.Contact(outputPath, "/logicbytes");
+            outputPath = StringUtility.Concat(outputPath, "/logicbytes");
             CopyHotUpdateDll(outputPath);
             MakeBytesVersionFile();
             AssetDatabase.Refresh();
@@ -721,7 +721,7 @@
         private void MakeBytesVersionFile()
         {
             var fileInfos = new List<FileInfo>();
-            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(m_UserData.m_OutputPath, "/logicbytes"), fileInfos);
+            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(m_UserData.m_OutputPath, "/logicbytes"), fileInfos);
             BytesVersionMaker.WriteAssetsVersionFile(Path.Combine(Directory.GetParent(Application.dataPath).FullName, m_UserData.m_OutputPath), fileInfos);
             Debug.Log("鐑洿鏂颁唬鐮佹洿鏂板畬姣曪紝鐢熸垚md5鏂囦欢");
         }
@@ -738,7 +738,7 @@
             //HybridCLR Settings闈㈡澘涓婅缃殑瑁佸噺鍚嶢OT dll杈撳嚭鏍圭洰褰�
             string strippedAOTDllOutputRootDir = "/" + HybridCLRSettings.Instance.strippedAOTDllOutputRootDir;
             //閲嶆柊鐢熸垚鐨凙OT鎵�鍦ㄨ矾寰�
-            string aotDir = StringUtility.Contact(rootDir, strippedAOTDllOutputRootDir, platformName);
+            string aotDir = StringUtility.Concat(rootDir, strippedAOTDllOutputRootDir, platformName);
 
             if (Directory.Exists(checkAotDir))
             {
@@ -750,7 +750,7 @@
 
             for (int i = 0; i < AOTGenericReferences.PatchedAOTAssemblyList.Count; i++)
             {
-                string dllFile = StringUtility.Contact(aotDir, AOTGenericReferences.PatchedAOTAssemblyList[i]);
+                string dllFile = StringUtility.Concat(aotDir, AOTGenericReferences.PatchedAOTAssemblyList[i]);
                 var outDllFile = outputPath + "/" + AOTGenericReferences.PatchedAOTAssemblyList[i] + ".bytes";
                 if (!File.Exists(dllFile))
                 {
@@ -774,7 +774,7 @@
             //HybridCLR Settings闈㈡澘涓婅缃殑鐑洿鏂癲ll缂栬瘧杈撳嚭鏍圭洰褰�
             string hotUpdateDllCompileOutputRootDir = "/" + HybridCLRSettings.Instance.hotUpdateDllCompileOutputRootDir;
             //鐑洿DLL鐢熸垚鐩綍
-            string hotDllDir = StringUtility.Contact(rootDir, hotUpdateDllCompileOutputRootDir, platformName);
+            string hotDllDir = StringUtility.Concat(rootDir, hotUpdateDllCompileOutputRootDir, platformName);
             //HybridCLR鐨凷ettings闈㈡澘涓婅缃殑鐑洿鏂癆ssembly Definitions 璧勬簮
             var assemblyDefinitionAsset = HybridCLRSettings.Instance.hotUpdateAssemblyDefinitions;
             for (int i = 0; i < assemblyDefinitionAsset.Length; i++)
@@ -782,7 +782,7 @@
                 string assemblyPath = AssetDatabase.GetAssetPath(assemblyDefinitionAsset[i]);
                 string assemblyName = Path.GetFileNameWithoutExtension(assemblyPath);
 
-                string dllFile = StringUtility.Contact(hotDllDir, assemblyName, ".dll");
+                string dllFile = StringUtility.Concat(hotDllDir, assemblyName, ".dll");
                 var outDllFile = outputPath + "/" + assemblyName + ".dll.bytes";
                 if (!File.Exists(dllFile))
                 {
@@ -798,7 +798,7 @@
             string[] hotUpdateAssemblies = HybridCLRSettings.Instance.hotUpdateAssemblies;
             for (int i = 0; i < hotUpdateAssemblies.Length; i++)
             {
-                string dllFile = StringUtility.Contact(hotDllDir, hotUpdateAssemblies[i], ".dll");
+                string dllFile = StringUtility.Concat(hotDllDir, hotUpdateAssemblies[i], ".dll");
                 var outDllFile = outputPath + "/" + hotUpdateAssemblies[i] + ".dll.bytes";
                 if (!File.Exists(dllFile))
                 {
@@ -814,7 +814,7 @@
             string[] preserveHotUpdateAssemblies = HybridCLRSettings.Instance.preserveHotUpdateAssemblies;
             for (int i = 0; i < preserveHotUpdateAssemblies.Length; i++)
             {
-                string dllFile = StringUtility.Contact(hotDllDir, preserveHotUpdateAssemblies[i], ".dll");
+                string dllFile = StringUtility.Concat(hotDllDir, preserveHotUpdateAssemblies[i], ".dll");
                 var outDllFile = outputPath + "/" + preserveHotUpdateAssemblies[i] + ".dll.bytes";
                 if (!File.Exists(dllFile))
                 {
@@ -1067,7 +1067,7 @@
 
         private void ExecuteSwitchVersionConfig()
         {
-            var newVersionConfigPath = StringUtility.Contact("Assets/Resources/ScriptableObject/Config/VersionConfig", ".asset");
+            var newVersionConfigPath = StringUtility.Concat("Assets/Resources/ScriptableObject/Config/VersionConfig", ".asset");
             var versionsFilePath = Application.dataPath + Path.DirectorySeparatorChar + "Editor/VersionConfigs/Versions.txt";
 
             var lines = File.ReadAllLines(versionsFilePath);
diff --git a/Assets/Editor/ConfigGen/ConfigClassGenerate.cs b/Assets/Editor/ConfigGen/ConfigClassGenerate.cs
index 25f551a..098c50b 100644
--- a/Assets/Editor/ConfigGen/ConfigClassGenerate.cs
+++ b/Assets/Editor/ConfigGen/ConfigClassGenerate.cs
@@ -95,79 +95,79 @@
         field = field.Replace(" ", "");
         if (type.Contains("Dictionary<int, int[][]>"))
         {
-            return StringUtility.Contact("public Dictionary<int, int[][]> ", field.Trim(), ";");
+            return StringUtility.Concat("public Dictionary<int, int[][]> ", field.Trim(), ";");
         }
         else if (type.Contains("int[][]"))
         {
-            return StringUtility.Contact("public int[][] ", field.Trim(), ";");
+            return StringUtility.Concat("public int[][] ", field.Trim(), ";");
         }
         else if (type.Contains("Dictionary<int, int>"))
         {
-            return StringUtility.Contact("public Dictionary<int, int> ", field.Trim(), ";");
+            return StringUtility.Concat("public Dictionary<int, int> ", field.Trim(), ";");
         }
         else if (type.Contains("Dictionary<int, int[]>"))
         {
-            return StringUtility.Contact("public Dictionary<int, int[]> ", field.Trim(), ";");
+            return StringUtility.Concat("public Dictionary<int, int[]> ", field.Trim(), ";");
         }
         else if (type.Contains("float[][]"))
         {
-            return StringUtility.Contact("public float[][] ", field.Trim(), ";");
+            return StringUtility.Concat("public float[][] ", field.Trim(), ";");
         }
         else if (type.Contains("int[]"))
         {
-            return StringUtility.Contact("public int[] ", field.Trim(), ";");
+            return StringUtility.Concat("public int[] ", field.Trim(), ";");
         }
         else if (type.Contains("Int2[]"))
         {
-            return StringUtility.Contact("public Int2[] ", field.Trim(), ";");
+            return StringUtility.Concat("public Int2[] ", field.Trim(), ";");
         }
         else if (type.Contains("Int3[]"))
         {
-            return StringUtility.Contact("public Int3[] ", field.Trim(), ";");
+            return StringUtility.Concat("public Int3[] ", field.Trim(), ";");
         }
         else if (type.Contains("float[]"))
         {
-            return StringUtility.Contact("public float[] ", field.Trim(), ";");
+            return StringUtility.Concat("public float[] ", field.Trim(), ";");
         }
         else if (type.Contains("string[]"))
         {
-            return StringUtility.Contact("public string[] ", field.Trim(), ";");
+            return StringUtility.Concat("public string[] ", field.Trim(), ";");
         }
         else if (type.Contains("Vector3[]"))
         {
-            return StringUtility.Contact("public Vector3[] ", field.Trim(), ";");
+            return StringUtility.Concat("public Vector3[] ", field.Trim(), ";");
         }
         else if (type.Contains("int"))
         {
-            return StringUtility.Contact("public int ", field.Trim(), ";");
+            return StringUtility.Concat("public int ", field.Trim(), ";");
         }
         else if (type.Contains("long"))
         {
-            return StringUtility.Contact("public long ", field.Trim(), ";");
+            return StringUtility.Concat("public long ", field.Trim(), ";");
         }
         else if (type.Contains("float"))
         {
-            return StringUtility.Contact("public float ", field.Trim(), ";");
+            return StringUtility.Concat("public float ", field.Trim(), ";");
         }
         else if (type.Contains("string"))
         {
-            return StringUtility.Contact("public string ", field, ";");
+            return StringUtility.Concat("public string ", field, ";");
         }
         else if (type.Contains("Vector3"))
         {
-            return StringUtility.Contact("public Vector3 ", field.Trim(), ";");
+            return StringUtility.Concat("public Vector3 ", field.Trim(), ";");
         }
         else if (type.Contains("bool"))
         {
-            return StringUtility.Contact("public bool ", field.Trim(), ";");
+            return StringUtility.Concat("public bool ", field.Trim(), ";");
         }
         else if (type.Contains("Int2"))
         {
-            return StringUtility.Contact("public Int2 ", field.Trim(), ";");
+            return StringUtility.Concat("public Int2 ", field.Trim(), ";");
         }
         else if (type.Contains("Int3"))
         {
-            return StringUtility.Contact("public Int3 ", field.Trim(), ";");
+            return StringUtility.Concat("public Int3 ", field.Trim(), ";");
         }
         else
         {
@@ -203,11 +203,11 @@
         }
         // else if (type.Contains("Int2[]"))
         // {
-        //     return StringUtility.Contact("public Int2[] ", field.Trim(), ";");
+        //     return StringUtility.Concat("public Int2[] ", field.Trim(), ";");
         // }
         // else if (type.Contains("Int3[]"))
         // {
-        //     return StringUtility.Contact("public Int3[] ", field.Trim(), ";");
+        //     return StringUtility.Concat("public Int3[] ", field.Trim(), ";");
         // }
         else if (type.Contains("float[]"))
         {
@@ -247,11 +247,11 @@
         }
         // else if (type.Contains("Int2"))
         // {
-        //     return StringUtility.Contact("public Int2 ", field.Trim(), ";");
+        //     return StringUtility.Concat("public Int2 ", field.Trim(), ";");
         // }
         // else if (type.Contains("Int3"))
         // {
-        //     return StringUtility.Contact("public Int3 ", field.Trim(), ";");
+        //     return StringUtility.Concat("public Int3 ", field.Trim(), ";");
         // }
         else
         {
@@ -265,79 +265,79 @@
         field = field.Replace(" ", "");
         if (type.Contains("Dictionary<int, int[][]>"))
         {
-            return StringUtility.Contact("public Dictionary<int, int[][]> ", field.Trim(), ";");
+            return StringUtility.Concat("public Dictionary<int, int[][]> ", field.Trim(), ";");
         }
         else if (type.Contains("int[][]"))
         {
-            return StringUtility.Contact("public int[][] ", field.Trim(), ";");
+            return StringUtility.Concat("public int[][] ", field.Trim(), ";");
         }
         else if (type.Contains("Dictionary<int, int>"))
         {
-            return StringUtility.Contact("public Dictionary<int, int> ", field.Trim(), ";");
+            return StringUtility.Concat("public Dictionary<int, int> ", field.Trim(), ";");
         }
         else if (type.Contains("Dictionary<int, int[]>"))
         {
-            return StringUtility.Contact("public Dictionary<int, int[]> ", field.Trim(), ";");
+            return StringUtility.Concat("public Dictionary<int, int[]> ", field.Trim(), ";");
         }
         else if (type.Contains("float[][]"))
         {
-            return StringUtility.Contact("public float[][] ", field.Trim(), ";");
+            return StringUtility.Concat("public float[][] ", field.Trim(), ";");
         }
         else if (type.Contains("int[]"))
         {
-            return StringUtility.Contact("public int[] ", field.Trim(), ";");
+            return StringUtility.Concat("public int[] ", field.Trim(), ";");
         }
         else if (type.Contains("Int2[]"))
         {
-            return StringUtility.Contact("public Int2[] ", field.Trim(), ";");
+            return StringUtility.Concat("public Int2[] ", field.Trim(), ";");
         }
         else if (type.Contains("Int3[]"))
         {
-            return StringUtility.Contact("public Int3[] ", field.Trim(), ";");
+            return StringUtility.Concat("public Int3[] ", field.Trim(), ";");
         }
         else if (type.Contains("float[]"))
         {
-            return StringUtility.Contact("public float[] ", field.Trim(), ";");
+            return StringUtility.Concat("public float[] ", field.Trim(), ";");
         }
         else if (type.Contains("string[]"))
         {
-            return StringUtility.Contact("public string[] ", field.Trim(), ";");
+            return StringUtility.Concat("public string[] ", field.Trim(), ";");
         }
         else if (type.Contains("Vector3[]"))
         {
-            return StringUtility.Contact("public Vector3[] ", field.Trim(), ";");
+            return StringUtility.Concat("public Vector3[] ", field.Trim(), ";");
         }
         else if (type.Contains("int"))
         {
-            return StringUtility.Contact("public int ", field.Trim(), ";");
+            return StringUtility.Concat("public int ", field.Trim(), ";");
         }
         else if (type.Contains("long"))
         {
-            return StringUtility.Contact("public long ", field.Trim(), ";");
+            return StringUtility.Concat("public long ", field.Trim(), ";");
         }
         else if (type.Contains("float"))
         {
-            return StringUtility.Contact("public float ", field.Trim(), ";");
+            return StringUtility.Concat("public float ", field.Trim(), ";");
         }
         else if (type.Contains("string"))
         {
-            return StringUtility.Contact("public string ", field, ";");
+            return StringUtility.Concat("public string ", field, ";");
         }
         else if (type.Contains("Vector3"))
         {
-            return StringUtility.Contact("public Vector3 ", field.Trim(), ";");
+            return StringUtility.Concat("public Vector3 ", field.Trim(), ";");
         }
         else if (type.Contains("bool"))
         {
-            return StringUtility.Contact("public bool ", field.Trim(), ";");
+            return StringUtility.Concat("public bool ", field.Trim(), ";");
         }
         else if (type.Contains("Int2"))
         {
-            return StringUtility.Contact("public Int2 ", field.Trim(), ";");
+            return StringUtility.Concat("public Int2 ", field.Trim(), ";");
         }
         else if (type.Contains("Int3"))
         {
-            return StringUtility.Contact("public Int3 ", field.Trim(), ";");
+            return StringUtility.Concat("public Int3 ", field.Trim(), ";");
         }
         else
         {
@@ -371,19 +371,19 @@
         }
         else if (type.Contains("int[]"))
         {
-            var line0 = StringUtility.Contact("if (tables", "[", index.ToString(), "].Contains(\"[\"))\n");
-            var line0_1 = StringUtility.Contact(retract3, "{\n");
+            var line0 = StringUtility.Concat("if (tables", "[", index.ToString(), "].Contains(\"[\"))\n");
+            var line0_1 = StringUtility.Concat(retract3, "{\n");
             var line0_2 = StringUtility.Concat(retract4, field, " = JsonMapper.ToObject<int[]>(tables", "[", index.ToString(), "]);\n");
-            var line0_3 = StringUtility.Contact(retract3, "}\n");
-            var line0_4 = StringUtility.Contact(retract3, "else\n");
-            var line0_5 = StringUtility.Contact(retract3, "{\n");
+            var line0_3 = StringUtility.Concat(retract3, "}\n");
+            var line0_4 = StringUtility.Concat(retract3, "else\n");
+            var line0_5 = StringUtility.Concat(retract3, "{\n");
             var line1 = StringUtility.Concat(retract4, "string[] ", field, "StringArray", " = ", "tables", "[", index.ToString(), "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
             var line2 = StringUtility.Concat(retract4, field, " = ", "new int", "[", field, "StringArray.Length]", ";", "\n");
             var line3 = StringUtility.Concat(retract4, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n");
-            var line4 = StringUtility.Contact(retract4, "{\n");
+            var line4 = StringUtility.Concat(retract4, "{\n");
             var line5 = StringUtility.Concat(retract5, " int.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n");
-            var line6 = StringUtility.Contact(retract4, "}\n");
-            var line0_6 = StringUtility.Contact(retract3, "}");
+            var line6 = StringUtility.Concat(retract4, "}\n");
+            var line0_6 = StringUtility.Concat(retract3, "}");
 
             return StringUtility.Concat(line0, line0_1, line0_2, line0_3, line0_4, line0_5, line1, line2, line3, line4, line5, line6, line0_6);
         }
@@ -392,9 +392,9 @@
             var line1 = StringUtility.Concat("string[] ", field, "StringArray", " = ", "tables", "[", index.ToString(), "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
             var line2 = StringUtility.Concat(retract3, field, " = ", "new Int2", "[", field, "StringArray.Length]", ";", "\n");
             var line3 = StringUtility.Concat(retract3, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n");
-            var line4 = StringUtility.Contact(retract3, "{\n");
+            var line4 = StringUtility.Concat(retract3, "{\n");
             var line5 = StringUtility.Concat(retract4, " Int2.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n");
-            var line6 = StringUtility.Contact(retract3, "}");
+            var line6 = StringUtility.Concat(retract3, "}");
 
             return StringUtility.Concat(line1, line2, line3, line4, line5, line6);
         }
@@ -403,27 +403,27 @@
             var line1 = StringUtility.Concat("string[] ", field, "StringArray", " = ", "tables", "[", index.ToString(), "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
             var line2 = StringUtility.Concat(retract3, field, " = ", "new Int3", "[", field, "StringArray.Length]", ";", "\n");
             var line3 = StringUtility.Concat(retract3, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n");
-            var line4 = StringUtility.Contact(retract3, "{\n");
+            var line4 = StringUtility.Concat(retract3, "{\n");
             var line5 = StringUtility.Concat(retract4, " Int3.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n");
-            var line6 = StringUtility.Contact(retract3, "}");
+            var line6 = StringUtility.Concat(retract3, "}");
 
             return StringUtility.Concat(line1, line2, line3, line4, line5, line6);
         }
         else if (type.Contains("float[]"))
         {
-            var line0 = StringUtility.Contact("if (tables", "[", index.ToString(), "].Contains(\"[\"))\n");
-            var line0_1 = StringUtility.Contact(retract3, "{\n");
+            var line0 = StringUtility.Concat("if (tables", "[", index.ToString(), "].Contains(\"[\"))\n");
+            var line0_1 = StringUtility.Concat(retract3, "{\n");
             var line0_2 = StringUtility.Concat(retract4, field, " = JsonMapper.ToObject<float[]>(tables", "[", index.ToString(), "]);\n");
-            var line0_3 = StringUtility.Contact(retract3, "}\n");
-            var line0_4 = StringUtility.Contact(retract3, "else\n");
-            var line0_5 = StringUtility.Contact(retract3, "{\n");
+            var line0_3 = StringUtility.Concat(retract3, "}\n");
+            var line0_4 = StringUtility.Concat(retract3, "else\n");
+            var line0_5 = StringUtility.Concat(retract3, "{\n");
             var line1 = StringUtility.Concat(retract4, "string[] ", field, "StringArray", " = ", "tables", "[", index.ToString(), "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
             var line2 = StringUtility.Concat(retract4, field, " = ", "new float", "[", field, "StringArray.Length", "]", ";", "\n");
             var line3 = StringUtility.Concat(retract4, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n");
-            var line4 = StringUtility.Contact(retract4, "{\n");
+            var line4 = StringUtility.Concat(retract4, "{\n");
             var line5 = StringUtility.Concat(retract5, " float.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n");
-            var line6 = StringUtility.Contact(retract4, "}\n");
-            var line0_6 = StringUtility.Contact(retract3, "}");
+            var line6 = StringUtility.Concat(retract4, "}\n");
+            var line0_6 = StringUtility.Concat(retract3, "}");
 
             return StringUtility.Concat(line0, line0_1, line0_2, line0_3, line0_4, line0_5, line1, line2, line3, line4, line5, line6, line0_6);
         }
@@ -437,9 +437,9 @@
             var line1 = StringUtility.Concat("string[] ", field, "StringArray", " = ", "tables", "[", index.ToString(), "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
             var line2 = StringUtility.Concat(retract3, field, " = ", "new Vector3", "[", field, "StringArray.Length", "]", ";", "\n");
             var line3 = StringUtility.Concat(retract3, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n");
-            var line4 = StringUtility.Contact(retract3, "{\n");
+            var line4 = StringUtility.Concat(retract3, "{\n");
             var line5 = StringUtility.Concat(retract4, field, "[i]", "=", field, "StringArray", "[i]", ".Vector3Parse()", ";", "\n");
-            var line6 = StringUtility.Contact(retract3, "}");
+            var line6 = StringUtility.Concat(retract3, "}");
 
             return StringUtility.Concat(line1, line2, line3, line4, line5, line6);
         }
@@ -468,7 +468,7 @@
             var line1 = StringUtility.Concat("var ", field, "Temp", " = 0", ";", "\n");
             var line2 = StringUtility.Concat(retract3, "int.TryParse(tables", "[", index.ToString(), "]", ",", "out ", field, "Temp", ")", "; ", "\n");
             var line3 = StringUtility.Concat(retract3, field, "=", field, "Temp", "!=0", ";");
-            return StringUtility.Contact(line1, line2, line3);
+            return StringUtility.Concat(line1, line2, line3);
         }
         else if (type.Contains("Int2"))
         {
diff --git a/Assets/Editor/Tool/AssetBundleBuildExtersion.cs b/Assets/Editor/Tool/AssetBundleBuildExtersion.cs
index 7dc8aab..bcb716e 100644
--- a/Assets/Editor/Tool/AssetBundleBuildExtersion.cs
+++ b/Assets/Editor/Tool/AssetBundleBuildExtersion.cs
@@ -47,11 +47,11 @@
             assets.Add(assetBundleBuild);
         }
 
-        var rootPath = StringUtility.Contact(output, Path.AltDirectorySeparatorChar.ToString(), category);
-        var mainFile = StringUtility.Contact(output, Path.AltDirectorySeparatorChar.ToString(), GetMainFestFileName(buildTarget));//鏀瑰悕瀛楀墠
-        var mainFileRename = StringUtility.Contact(output, Path.AltDirectorySeparatorChar.ToString(), AssetVersionUtility.EncodeFileName(category), "_assetbundle");//鏀瑰悕瀛楀悗
-        var manifest = StringUtility.Contact(output, Path.AltDirectorySeparatorChar.ToString(), GetMainFestFileName(buildTarget), ".manifest");
-        var manifestRename = StringUtility.Contact(output, Path.AltDirectorySeparatorChar.ToString(), AssetVersionUtility.EncodeFileName(category), "_assetbundle.manifest");
+        var rootPath = StringUtility.Concat(output, Path.AltDirectorySeparatorChar.ToString(), category);
+        var mainFile = StringUtility.Concat(output, Path.AltDirectorySeparatorChar.ToString(), GetMainFestFileName(buildTarget));//鏀瑰悕瀛楀墠
+        var mainFileRename = StringUtility.Concat(output, Path.AltDirectorySeparatorChar.ToString(), AssetVersionUtility.EncodeFileName(category), "_assetbundle");//鏀瑰悕瀛楀悗
+        var manifest = StringUtility.Concat(output, Path.AltDirectorySeparatorChar.ToString(), GetMainFestFileName(buildTarget), ".manifest");
+        var manifestRename = StringUtility.Concat(output, Path.AltDirectorySeparatorChar.ToString(), AssetVersionUtility.EncodeFileName(category), "_assetbundle.manifest");
 
         if (rebuild && Directory.Exists(rootPath))
             Directory.Delete(rootPath, true);
diff --git a/Assets/Editor/Tool/AssetBundleBuildTool.cs b/Assets/Editor/Tool/AssetBundleBuildTool.cs
index 6c70301..3aac266 100644
--- a/Assets/Editor/Tool/AssetBundleBuildTool.cs
+++ b/Assets/Editor/Tool/AssetBundleBuildTool.cs
@@ -13,8 +13,8 @@
     //     {
     //         BuildAssetBundleOptions opt = BuildAssetBundleOptions.ChunkBasedCompression | BuildAssetBundleOptions.DeterministicAssetBundle | BuildAssetBundleOptions.StrictMode;
 
-    //         string outputPath = StringUtility.Contact(System.Environment.CurrentDirectory, "/AssetBundles/", EditorUserBuildSettings.activeBuildTarget.ToString());
-    //         string streamingPath = StringUtility.Contact(Application.streamingAssetsPath, Path.AltDirectorySeparatorChar, EditorUserBuildSettings.activeBuildTarget.ToString());
+    //         string outputPath = StringUtility.Concat(System.Environment.CurrentDirectory, "/AssetBundles/", EditorUserBuildSettings.activeBuildTarget.ToString());
+    //         string streamingPath = StringUtility.Concat(Application.streamingAssetsPath, Path.AltDirectorySeparatorChar, EditorUserBuildSettings.activeBuildTarget.ToString());
 
     //         if (!Directory.Exists(outputPath))
     //             Directory.CreateDirectory(outputPath);
@@ -26,7 +26,7 @@
     //         AssetBundleBuildExtersion.Build(outputPath, "mobeffectshader", opt, EditorUserBuildSettings.activeBuildTarget, false);
 
     //         AssetBundleBuildExtersion.Build(outputPath, "config", opt, EditorUserBuildSettings.activeBuildTarget, false);
-    //         TableTool.CopyConfigsToOutPutPath(StringUtility.Contact(outputPath, "/config"));
+    //         TableTool.CopyConfigsToOutPutPath(StringUtility.Concat(outputPath, "/config"));
 
     //         LuaBuildHelper.OnPreBuild();
     //         UpdateLuaSetting.SetAllLuaAssetBundleName();
diff --git a/Assets/Editor/Tool/AssetsVersionCmpMaker.cs b/Assets/Editor/Tool/AssetsVersionCmpMaker.cs
index 609efaa..fcc6689 100644
--- a/Assets/Editor/Tool/AssetsVersionCmpMaker.cs
+++ b/Assets/Editor/Tool/AssetsVersionCmpMaker.cs
@@ -51,7 +51,7 @@
             lines.Add(StringUtility.Concat(relativePath, "\t", extersion, "\t", fileSize.ToString(), "\t", md5));
         }
 
-        var assetVersionFile = StringUtility.Contact(Application.dataPath, "/Resources/AssetsVersionCmp.txt");
+        var assetVersionFile = StringUtility.Concat(Application.dataPath, "/Resources/AssetsVersionCmp.txt");
         if (File.Exists(assetVersionFile))
         {
             File.Delete(assetVersionFile);
diff --git a/Assets/Editor/Tool/AssetsVersionMaker.cs b/Assets/Editor/Tool/AssetsVersionMaker.cs
index ecbb1e8..497d41e 100644
--- a/Assets/Editor/Tool/AssetsVersionMaker.cs
+++ b/Assets/Editor/Tool/AssetsVersionMaker.cs
@@ -42,13 +42,13 @@
             lines.Add(StringUtility.Concat(relativePath, "\t", extersion, "\t", fileSize.ToString(), "\t", md5));
         }
 
-        var assetVersionFile = StringUtility.Contact(_path, Path.DirectorySeparatorChar.ToString(), "AssetsVersion.txt");
+        var assetVersionFile = StringUtility.Concat(_path, Path.DirectorySeparatorChar.ToString(), "AssetsVersion.txt");
         if (File.Exists(assetVersionFile))
         {
             File.Delete(assetVersionFile);
         }
 
-        File.WriteAllText(StringUtility.Contact(_path, Path.DirectorySeparatorChar.ToString(), "AssetsVersion.txt"), string.Join(FileExtersion.lineSplit, lines.ToArray()));
+        File.WriteAllText(StringUtility.Concat(_path, Path.DirectorySeparatorChar.ToString(), "AssetsVersion.txt"), string.Join(FileExtersion.lineSplit, lines.ToArray()));
     }
 
 }
diff --git a/Assets/Editor/Tool/BuildExtersion.cs b/Assets/Editor/Tool/BuildExtersion.cs
index 1d50699..59edbe0 100644
--- a/Assets/Editor/Tool/BuildExtersion.cs
+++ b/Assets/Editor/Tool/BuildExtersion.cs
@@ -89,7 +89,7 @@
             if (!buildParameters.error)
             {
                 ExcuteBuildAsset("config", buildParameters);
-                TableTool.CopyConfigsToOutPutPath(StringUtility.Contact(buildParameters.GetWholeOutPutPath(), "/config"));
+                TableTool.CopyConfigsToOutPutPath(StringUtility.Concat(buildParameters.GetWholeOutPutPath(), "/config"));
             }
             else
             {
@@ -295,11 +295,11 @@
             switch (buildTarget)
             {
                 case BuildTarget.Android:
-                    return StringUtility.Contact(outputPath, "/android");
+                    return StringUtility.Concat(outputPath, "/android");
                 case BuildTarget.iOS:
-                    return StringUtility.Contact(outputPath, "/ios");
+                    return StringUtility.Concat(outputPath, "/ios");
                 case BuildTarget.StandaloneWindows:
-                    return StringUtility.Contact(outputPath, "/standalone");
+                    return StringUtility.Concat(outputPath, "/standalone");
                 default:
                     return string.Empty;
             }
diff --git a/Assets/Editor/Tool/BytesVersionMaker.cs b/Assets/Editor/Tool/BytesVersionMaker.cs
index e11c980..6ca070b 100644
--- a/Assets/Editor/Tool/BytesVersionMaker.cs
+++ b/Assets/Editor/Tool/BytesVersionMaker.cs
@@ -34,13 +34,13 @@
             lines.Add(StringUtility.Concat(relativePath, "\t", extersion, "\t", fileSize.ToString(), "\t", md5));
         }
 
-        var assetVersionFile = StringUtility.Contact(_path, Path.DirectorySeparatorChar.ToString(), "logicbytes.txt");
+        var assetVersionFile = StringUtility.Concat(_path, Path.DirectorySeparatorChar.ToString(), "logicbytes.txt");
         if (File.Exists(assetVersionFile))
         {
             File.Delete(assetVersionFile);
         }
 
-        File.WriteAllText(StringUtility.Contact(_path, Path.DirectorySeparatorChar.ToString(), "logicbytes.txt"), string.Join(FileExtersion.lineSplit, lines.ToArray()));
+        File.WriteAllText(StringUtility.Concat(_path, Path.DirectorySeparatorChar.ToString(), "logicbytes.txt"), string.Join(FileExtersion.lineSplit, lines.ToArray()));
     }
 
 }
diff --git a/Assets/Editor/Tool/ClientPackage.cs b/Assets/Editor/Tool/ClientPackage.cs
index 9897f71..636cea3 100644
--- a/Assets/Editor/Tool/ClientPackage.cs
+++ b/Assets/Editor/Tool/ClientPackage.cs
@@ -162,7 +162,7 @@
                 }
 
                 var relativePath = FileExtersion.GetFileRelativePath(_assetBundlePath, item.FullName);
-                var to = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, relativePath);
+                var to = StringUtility.Concat(ResourcesPath.Instance.StreamingAssetPath, relativePath);
                 var directory = Path.GetDirectoryName(to);
                 if (!Directory.Exists(directory))
                 {
@@ -194,7 +194,7 @@
 
             var excludeFileFullNames = new List<string>();
             var tempFiles = new List<FileInfo>();
-            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/hero"), tempFiles);
+            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(_assetBundlePath, "/hero"), tempFiles);
             foreach (var file in tempFiles)
             {
                 var extersion = Path.GetExtension(file.FullName);
@@ -207,7 +207,7 @@
             }
 
             tempFiles.Clear();
-            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/maps"), tempFiles);
+            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(_assetBundlePath, "/maps"), tempFiles);
             foreach (var file in tempFiles)
             {
                 var extersion = Path.GetExtension(file.FullName);
@@ -220,7 +220,7 @@
             }
 
             tempFiles.Clear();
-            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/audio"), tempFiles);
+            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(_assetBundlePath, "/audio"), tempFiles);
             foreach (var file in tempFiles)
             {
                 var extersion = Path.GetExtension(file.FullName);
@@ -233,7 +233,7 @@
             }
 
             tempFiles.Clear();
-            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/uieffect"), tempFiles);
+            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(_assetBundlePath, "/uieffect"), tempFiles);
             foreach (var file in tempFiles)
             {
                 var extersion = Path.GetExtension(file.FullName);
@@ -247,10 +247,10 @@
 
             //鍓旈櫎瑙嗛璧勬簮
             tempFiles.Clear();
-            var videoPath = StringUtility.Contact(_assetBundlePath, "/video");
+            var videoPath = StringUtility.Concat(_assetBundlePath, "/video");
             if (File.Exists(videoPath))
             {
-                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/video"), tempFiles);
+                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(_assetBundlePath, "/video"), tempFiles);
                 foreach (var file in tempFiles)
                 {
                     var extersion = Path.GetExtension(file.FullName);
@@ -269,7 +269,7 @@
             if (!includeConfig)
             {
                 tempFiles.Clear();
-                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/config"), tempFiles);
+                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(_assetBundlePath, "/config"), tempFiles);
                 foreach (var file in tempFiles)
                 {
                     excludeFileFullNames.Add(file.FullName);
@@ -278,7 +278,7 @@
 
             //鍓旈櫎UI璧勬簮
             //tempFiles.Clear();
-            //FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/ui/sprite"), tempFiles);
+            //FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(_assetBundlePath, "/ui/sprite"), tempFiles);
             //foreach (var file in tempFiles)
             //{
             //    var fileName = Path.GetFileName(file.FullName);
@@ -290,7 +290,7 @@
             if (!includeUI)
             {
                 tempFiles.Clear();
-                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/ui"), tempFiles);
+                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(_assetBundlePath, "/ui"), tempFiles);
                 foreach (var file in tempFiles)
                 {
                     excludeFileFullNames.Add(file.FullName);
@@ -301,7 +301,7 @@
 #if !UNITY_IOS
                 //鍓旈櫎UI璧勬簮
                 tempFiles.Clear();
-                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/ui"), tempFiles);
+                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(_assetBundlePath, "/ui"), tempFiles);
                 foreach (var file in tempFiles)
                 {
                     var extersion = Path.GetExtension(file.FullName);
@@ -329,7 +329,7 @@
             foreach (var item in fromFiles)
             {
                 var relativePath = FileExtersion.GetFileRelativePath(_assetBundlePath, item.FullName);
-                var to = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, relativePath);
+                var to = StringUtility.Concat(ResourcesPath.Instance.StreamingAssetPath, relativePath);
                 if (relativePath.StartsWith("patch"))//涓嶅寘鍚玬eta鏂囦欢鍜岃ˉ涓�
                     continue;
 
@@ -366,7 +366,7 @@
             foreach (var item in fromFiles)
             {
                 var relativePath = FileExtersion.GetFileRelativePath(_assetBundlePath, item.FullName);
-                var to = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, relativePath);
+                var to = StringUtility.Concat(ResourcesPath.Instance.StreamingAssetPath, relativePath);
                 if (relativePath.StartsWith("patch"))//涓嶅寘鍚玬eta鏂囦欢鍜岃ˉ涓�
                     continue;
 
@@ -397,7 +397,7 @@
     public static void BuildApk(string _sdkPath, string _output, string _publisher, int _buildIndex, bool _development)
     {
         PreBuild(_publisher, _buildIndex);
-        var auditTimeFile = StringUtility.Contact(Application.dataPath, Path.DirectorySeparatorChar.ToString(), "Resources/Config/AuditTime.txt");
+        var auditTimeFile = StringUtility.Concat(Application.dataPath, Path.DirectorySeparatorChar.ToString(), "Resources/Config/AuditTime.txt");
         if (File.Exists(auditTimeFile))
         {
             File.Delete(auditTimeFile);
@@ -411,7 +411,7 @@
         // if (text.Contains("VERSION_ALTERNATIVE"))
         // {
         //     var pattern = "VERSION_ALTERNATIVE = \".*\"";
-        //     text = Regex.Replace(text, pattern, StringUtility.Contact("VERSION_ALTERNATIVE = ", "\"", versionConfig.m_Version, "\""));
+        //     text = Regex.Replace(text, pattern, StringUtility.Concat("VERSION_ALTERNATIVE = ", "\"", versionConfig.m_Version, "\""));
 
         //     bool encoderShouldEmitUTF8Identifier = true;
         //     bool throwOnInvalidBytes = false;
@@ -428,7 +428,7 @@
         // 鏇村悕鍘熸湁鏂囦欢
         // string _gradleTemplateUrl = EditorApplication.applicationContentsPath + "/PlaybackEngines/AndroidPlayer/Tools/GradleTemplates/";
         // string _gradleFileUrl = _gradleTemplateUrl + "mainTemplate.gradle";
-        // string _diffGradleFileUrl = StringUtility.Contact(_sdkPath, "/GradleDiff/", versionConfig.appId, "/mainTemplate.gradle");
+        // string _diffGradleFileUrl = StringUtility.Concat(_sdkPath, "/GradleDiff/", versionConfig.appId, "/mainTemplate.gradle");
         // FileInfo _fileInfo = new FileInfo(_diffGradleFileUrl);
 
         // if (!_fileInfo.Exists)
@@ -486,28 +486,28 @@
         string copySdkFile;
 
         channelSdkPath = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/", variant);
-        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/AndroidManifest.xml");
+        copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/AndroidManifest.xml");
         File.Copy(copySdkFile, MANIFEST_PATH);
-        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/baseProjectTemplate.gradle");
+        copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/baseProjectTemplate.gradle");
         File.Copy(copySdkFile, File_baseProjectTemplate);
-        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/deps.gradle");
+        copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/deps.gradle");
         File.Copy(copySdkFile, File_deps);
-        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/google-services.json");
+        copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/google-services.json");
         File.Copy(copySdkFile, File_google_services);
-        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/gradleTemplate.properties");
+        copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/gradleTemplate.properties");
         File.Copy(copySdkFile, File_gradleTemplate);
-        //copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.appId, "/LauncherManifest.xml");
+        //copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.appId, "/LauncherManifest.xml");
         //File.Copy(copySdkFile, File_LauncherManifest);
-        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/launcherTemplate.gradle");
+        copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/launcherTemplate.gradle");
         File.Copy(copySdkFile, File_launcherTemplate);
-        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/mainTemplate.gradle");
+        copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/mainTemplate.gradle");
         File.Copy(copySdkFile, File_mainTemplate);
-        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/settingsTemplate.gradle");
+        copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/settingsTemplate.gradle");
         File.Copy(copySdkFile, File_settingGradle);
 
         if (versionConfig.sdkFileName == "hyyngame_huawei")
         {
-            copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/agconnect-services.json");
+            copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/agconnect-services.json");
             File.Copy(copySdkFile, File_huawei_services);
         }
 
@@ -574,11 +574,11 @@
 
         if (versionConfig1.sdkFileName.Trim().Length != 0)
         {
-            FileExtersion.DirectoryCopy(StringUtility.Contact(_sdkPath, "/Channel/iOS/", versionConfig1.sdkFileName, "/Plugins"), iOS_PLUGIN_PATH);
+            FileExtersion.DirectoryCopy(StringUtility.Concat(_sdkPath, "/Channel/iOS/", versionConfig1.sdkFileName, "/Plugins"), iOS_PLUGIN_PATH);
         }
         else
         {
-            FileExtersion.DirectoryCopy(StringUtility.Contact(_sdkPath, "/Channel/iOS/", versionConfig1.appId, "/Plugins"), iOS_PLUGIN_PATH);
+            FileExtersion.DirectoryCopy(StringUtility.Concat(_sdkPath, "/Channel/iOS/", versionConfig1.appId, "/Plugins"), iOS_PLUGIN_PATH);
         }
 
         DateTime outTime;
@@ -630,7 +630,7 @@
     private static void PreBuild(string _publisher, int _buildIndex)
     {
         MakePackageMD5File();
-        var newVersionConfigPath = StringUtility.Contact("Assets/Resources/VersionConfig", ".asset");
+        var newVersionConfigPath = StringUtility.Concat("Assets/Resources/VersionConfig", ".asset");
         var versionName = string.Empty;
         var fromVersionConfig = GetVersionConfig(_publisher, out versionName);
         var newVersionConfig = ScriptableObject.CreateInstance<VersionConfig>();
@@ -723,7 +723,7 @@
     static void SetIconAndSplashImage(string _versionName)
     {
         var buildTarget = GetBuildTarget();
-        var texture = AssetDatabase.LoadAssetAtPath<Texture2D>(StringUtility.Contact("Assets/Editor/Logo/", _versionName, "/Icon.png"));
+        var texture = AssetDatabase.LoadAssetAtPath<Texture2D>(StringUtility.Concat("Assets/Editor/Logo/", _versionName, "/Icon.png"));
         var iconSizes = PlayerSettings.GetIconSizesForTargetGroup(buildTarget);
         var icons = new Texture2D[iconSizes.Length];
         for (int i = 0; i < iconSizes.Length; i++)
@@ -737,7 +737,7 @@
         PlayerSettings.SplashScreen.showUnityLogo = false;
         PlayerSettings.SplashScreen.unityLogoStyle = PlayerSettings.SplashScreen.UnityLogoStyle.LightOnDark;
 
-        var splashImage = AssetDatabase.LoadAssetAtPath<Sprite>(StringUtility.Contact("Assets/Editor/Logo/", _versionName, "/SplashImage.png"));
+        var splashImage = AssetDatabase.LoadAssetAtPath<Sprite>(StringUtility.Concat("Assets/Editor/Logo/", _versionName, "/SplashImage.png"));
         var splashScreenLogo = PlayerSettings.SplashScreenLogo.Create(3, splashImage);
         PlayerSettings.SplashScreen.logos = new PlayerSettings.SplashScreenLogo[] { splashScreenLogo };
 
diff --git a/Assets/Editor/Tool/ClientPackage_Standalone.cs b/Assets/Editor/Tool/ClientPackage_Standalone.cs
index 9b47154..126949b 100644
--- a/Assets/Editor/Tool/ClientPackage_Standalone.cs
+++ b/Assets/Editor/Tool/ClientPackage_Standalone.cs
@@ -126,7 +126,7 @@
             }
 
             var relativePath = FileExtersion.GetFileRelativePath(assetPath, item.FullName);
-            var to = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, relativePath);
+            var to = StringUtility.Concat(ResourcesPath.Instance.StreamingAssetPath, relativePath);
             File.Copy(item.FullName, to, true);
         }
 
@@ -155,7 +155,7 @@
 
         var excludeFileFullNames = new List<string>();
         var tempFiles = new List<FileInfo>();
-        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(assetPath, "/hero"), tempFiles);
+        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(assetPath, "/hero"), tempFiles);
         foreach (var file in tempFiles)
         {
             var extersion = Path.GetExtension(file.FullName);
@@ -173,7 +173,7 @@
         }
 
         tempFiles.Clear();
-        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(assetPath, "/maps"), tempFiles);
+        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(assetPath, "/maps"), tempFiles);
         foreach (var file in tempFiles)
         {
             var extersion = Path.GetExtension(file.FullName);
@@ -191,7 +191,7 @@
         }
 
         tempFiles.Clear();
-        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(assetPath, "/audio"), tempFiles);
+        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(assetPath, "/audio"), tempFiles);
         foreach (var file in tempFiles)
         {
             var extersion = Path.GetExtension(file.FullName);
@@ -209,7 +209,7 @@
         }
 
         tempFiles.Clear();
-        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(assetPath, "/uieffect"), tempFiles);
+        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(assetPath, "/uieffect"), tempFiles);
         foreach (var file in tempFiles)
         {
             var extersion = Path.GetExtension(file.FullName);
@@ -227,7 +227,7 @@
         }
 
         tempFiles.Clear();
-        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(assetPath, "/ui/sprite"), tempFiles);
+        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(assetPath, "/ui/sprite"), tempFiles);
         foreach (var file in tempFiles)
         {
             var fileName = Path.GetFileName(file.FullName);
@@ -249,7 +249,7 @@
         foreach (var item in fromFiles)
         {
             var relativePath = FileExtersion.GetFileRelativePath(assetPath, item.FullName);
-            var to = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, relativePath);
+            var to = StringUtility.Concat(ResourcesPath.Instance.StreamingAssetPath, relativePath);
             var directory = Path.GetDirectoryName(to);
             if (!Directory.Exists(directory))
             {
@@ -281,7 +281,7 @@
         foreach (var item in fromFiles)
         {
             var relativePath = FileExtersion.GetFileRelativePath(assetPath, item.FullName);
-            var to = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, relativePath);
+            var to = StringUtility.Concat(ResourcesPath.Instance.StreamingAssetPath, relativePath);
             var directory = Path.GetDirectoryName(to);
             if (!Directory.Exists(directory))
             {
@@ -309,7 +309,7 @@
         if (text.Contains("VERSION_ALTERNATIVE"))
         {
             var pattern = "VERSION_ALTERNATIVE = \".*\"";
-            text = Regex.Replace(text, pattern, StringUtility.Contact("VERSION_ALTERNATIVE = ", "\"", versionConfig.m_Version, "\""));
+            text = Regex.Replace(text, pattern, StringUtility.Concat("VERSION_ALTERNATIVE = ", "\"", versionConfig.m_Version, "\""));
 
             var encoderShouldEmitUTF8Identifier = true;
             var throwOnInvalidBytes = false;
@@ -347,7 +347,7 @@
     {
         try
         {
-            var newVersionConfigPath = StringUtility.Contact("Assets/Resources/VersionConfig", ".asset");
+            var newVersionConfigPath = StringUtility.Concat("Assets/Resources/VersionConfig", ".asset");
             var versionName = string.Empty;
             var fromVersionConfig = GetVersionConfig(packageId.ToString(), out versionName);
             var newVersionConfig = ScriptableObject.CreateInstance<VersionConfig>();
@@ -416,7 +416,7 @@
     static void SetIconAndSplashImage(string _versionName)
     {
         var buildTarget = BuildTargetGroup.Standalone;
-        var texture = AssetDatabase.LoadAssetAtPath<Texture2D>(StringUtility.Contact("Assets/Editor/Logo/", _versionName, "/Icon.png"));
+        var texture = AssetDatabase.LoadAssetAtPath<Texture2D>(StringUtility.Concat("Assets/Editor/Logo/", _versionName, "/Icon.png"));
         var iconSizes = PlayerSettings.GetIconSizesForTargetGroup(buildTarget);
         var icons = new Texture2D[iconSizes.Length];
         for (int i = 0; i < iconSizes.Length; i++)
@@ -430,7 +430,7 @@
         PlayerSettings.SplashScreen.showUnityLogo = false;
         PlayerSettings.SplashScreen.unityLogoStyle = PlayerSettings.SplashScreen.UnityLogoStyle.LightOnDark;
 
-        var splashImage = AssetDatabase.LoadAssetAtPath<Sprite>(StringUtility.Contact("Assets/Editor/Logo/", _versionName, "/SplashImage.png"));
+        var splashImage = AssetDatabase.LoadAssetAtPath<Sprite>(StringUtility.Concat("Assets/Editor/Logo/", _versionName, "/SplashImage.png"));
         var splashScreenLogo = PlayerSettings.SplashScreenLogo.Create(3, splashImage);
         PlayerSettings.SplashScreen.logos = new PlayerSettings.SplashScreenLogo[] { splashScreenLogo };
     }
diff --git a/Assets/Editor/Tool/SpriteManageTool.cs b/Assets/Editor/Tool/SpriteManageTool.cs
index 3d5832d..c6ce442 100644
--- a/Assets/Editor/Tool/SpriteManageTool.cs
+++ b/Assets/Editor/Tool/SpriteManageTool.cs
@@ -245,8 +245,8 @@
                     var _detail = _list[i];
                     var _fatherDetail = _detail.fatherDetail;
                     GUILayout.BeginHorizontal();
-                    GUILayout.Label(StringUtility.Contact((i + 1).ToString(), ".", "Path: "));
-                    var _path = StringUtility.Contact(_detail.fatherDetail, _fatherDetail == string.Empty ? string.Empty : "/", _detail.name);
+                    GUILayout.Label(StringUtility.Concat((i + 1).ToString(), ".", "Path: "));
+                    var _path = StringUtility.Concat(_detail.fatherDetail, _fatherDetail == string.Empty ? string.Empty : "/", _detail.name);
                     GUILayout.TextField(_path);
                     if (_fatherDetail != string.Empty && GUILayout.Button("Goto"))
                     {
@@ -288,8 +288,8 @@
             }
             GUILayout.BeginHorizontal();
             var _fatherDetail = _detail.fatherDetail;
-            GUILayout.Label(StringUtility.Contact((i + 1).ToString(), ".", "Path: "));
-            var _path = StringUtility.Contact(_detail.fatherDetail, _fatherDetail == string.Empty ? string.Empty : "/", _detail.name);
+            GUILayout.Label(StringUtility.Concat((i + 1).ToString(), ".", "Path: "));
+            var _path = StringUtility.Concat(_detail.fatherDetail, _fatherDetail == string.Empty ? string.Empty : "/", _detail.name);
             GUILayout.TextField(_path);
             if (_fatherDetail != string.Empty && GUILayout.Button("Goto"))
             {
@@ -425,7 +425,7 @@
                 var _match = _matchs[_index - 1];
                 GetRefComponent(_list[_index], _list[_index].Split('\n'), _match.Groups[1].Value);
                 bool isCancel = EditorUtility.DisplayCancelableProgressBar("鏌ユ壘寮曠敤璧勬簮",
-                    StringUtility.Contact(_index.ToString(), "/", _list.Count.ToString()), (float)_index / (float)_list.Count);
+                    StringUtility.Concat(_index.ToString(), "/", _list.Count.ToString()), (float)_index / (float)_list.Count);
                 _index++;
                 if (isCancel || _index >= _list.Count)
                 {
@@ -447,7 +447,7 @@
                             _details.Add(_detail);
                         }
                         isCancel = EditorUtility.DisplayCancelableProgressBar("鏌ユ壘寮曠敤璧勬簮",
-                            StringUtility.Contact(_index.ToString(), "/", _keys.Count.ToString()), (float)_index / (float)_keys.Count);
+                            StringUtility.Concat(_index.ToString(), "/", _keys.Count.ToString()), (float)_index / (float)_keys.Count);
                         _index++;
                         if (isCancel || _index >= _keys.Count)
                         {
@@ -575,7 +575,7 @@
             if (_detail.rectId == _fatherId)
             {
                 var _father = GetFatherDetail(_detail.fatherId);
-                return StringUtility.Contact(GetFatherDetail(_detail.fatherId), _father == string.Empty ? string.Empty : "/", _detail.name);
+                return StringUtility.Concat(GetFatherDetail(_detail.fatherId), _father == string.Empty ? string.Empty : "/", _detail.name);
             }
         }
         return string.Empty;
@@ -635,7 +635,7 @@
     public static void DisplayExternalPath()
     {
         GUILayout.BeginHorizontal();
-        GUILayout.Label(StringUtility.Contact("鏂囦欢澶硅矾寰勶細", m_ExternalFilePath));
+        GUILayout.Label(StringUtility.Concat("鏂囦欢澶硅矾寰勶細", m_ExternalFilePath));
         if (GUILayout.Button("閫夋嫨鏂囦欢鏍硅矾寰�"))
         {
             var _path = EditorUtility.OpenFolderPanel("鏍硅矾寰�", "", "");
diff --git a/Assets/Editor/Tool/UpdateSpritePackingSetting.cs b/Assets/Editor/Tool/UpdateSpritePackingSetting.cs
index 0cc3ee4..af2be5c 100644
--- a/Assets/Editor/Tool/UpdateSpritePackingSetting.cs
+++ b/Assets/Editor/Tool/UpdateSpritePackingSetting.cs
@@ -26,7 +26,7 @@
 
         foreach (var setting in so.spriteSettings)
         {
-            var directoryPath = StringUtility.Contact(rootPath, Path.DirectorySeparatorChar.ToString(), setting.folderName);
+            var directoryPath = StringUtility.Concat(rootPath, Path.DirectorySeparatorChar.ToString(), setting.folderName);
 
             if (!Directory.Exists(directoryPath))
             {
@@ -79,7 +79,7 @@
 
                     count++;
 
-                    EditorUtility.DisplayProgressBar(StringUtility.Contact("璁剧疆鍥鹃泦鏍囩:", setting.folderName), file.Name, count / (float)total);
+                    EditorUtility.DisplayProgressBar(StringUtility.Concat("璁剧疆鍥鹃泦鏍囩:", setting.folderName), file.Name, count / (float)total);
                 }
                 catch (Exception ex)
                 {
@@ -164,7 +164,7 @@
         int index = 0;
         foreach (SpriteSettingConfig.SpriteSetting setting in so.spriteSettings)
         {
-            var directoryPath = StringUtility.Contact(rootPath, Path.DirectorySeparatorChar.ToString(), setting.folderName);
+            var directoryPath = StringUtility.Concat(rootPath, Path.DirectorySeparatorChar.ToString(), setting.folderName);
 
             if (!Directory.Exists(directoryPath))
             {
diff --git a/Assets/Editor/Web/NetPkgTool.cs b/Assets/Editor/Web/NetPkgTool.cs
index 3064213..cdb127c 100644
--- a/Assets/Editor/Web/NetPkgTool.cs
+++ b/Assets/Editor/Web/NetPkgTool.cs
@@ -87,7 +87,7 @@
 
             try
             {
-                contain = Regex.IsMatch(package.name, StringUtility.Contact(".*(", filterNetPkgStr.Replace(" ", "|"), ").*"));
+                contain = Regex.IsMatch(package.name, StringUtility.Concat(".*(", filterNetPkgStr.Replace(" ", "|"), ").*"));
             }
             catch (System.Exception ex)
             {
@@ -216,7 +216,7 @@
                         }
 
                         GUI.skin.button.normal.textColor = professionalSkin ? Color.white : Color.black;
-                        var showName = StringUtility.Contact(package.time, "  ", package.name);
+                        var showName = StringUtility.Concat(package.time, "  ", package.name);
                         EditorGUILayout.LabelField(package.socketType == ServerType.B430 ? new GUIContent($"<color=#119911>{showName}</color>") : 
                         (package.socketType == ServerType.MainFight ? new GUIContent($"<color=#9C5E13>{showName}</color>") : new GUIContent(showName)),
                          new GUIStyle(EditorStyles.label) { richText = true }, GUILayout.Width(260));
diff --git a/Assets/Launch/Common/AssetVersion.cs b/Assets/Launch/Common/AssetVersion.cs
index 3440015..06ff4a5 100644
--- a/Assets/Launch/Common/AssetVersion.cs
+++ b/Assets/Launch/Common/AssetVersion.cs
@@ -56,7 +56,7 @@
         //checkList 鐢ㄤ簬澶栭儴妫�鏌ユ枃浠朵笅杞藉悗鏄惁涓�鑷达紝涓嶅寘鍚病鏈夋枃浠剁殑鎯呭喌
         public bool CheckLocalFileValid(List<bool> checkList = null)
         {
-            string path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, m_RelativePath);
+            string path = StringUtility.Concat(ResourcesPath.Instance.ExternalStorePath, m_RelativePath);
             var fileInfo = new FileInfo(path);
 
             if (!fileInfo.Exists)
@@ -92,7 +92,7 @@
         // 瀛樺湪鍒欐瘮杈�
         public bool CheckLocalFileValid(AssetVersion otherAssetInfo)
         {
-            string path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, m_RelativePath);
+            string path = StringUtility.Concat(ResourcesPath.Instance.ExternalStorePath, m_RelativePath);
 
             if (!File.Exists(path))
             {
diff --git a/Assets/Launch/Common/DownLoadAndDiscompressTask.cs b/Assets/Launch/Common/DownLoadAndDiscompressTask.cs
index e1d806a..65f2b26 100644
--- a/Assets/Launch/Common/DownLoadAndDiscompressTask.cs
+++ b/Assets/Launch/Common/DownLoadAndDiscompressTask.cs
@@ -74,8 +74,8 @@
             for (int i = 0; i < tasks.Count; i++)
             {
                 var assetVersion = tasks[i];
-                var remoteURL = StringUtility.Contact(LocalResManager.Instance.versionInfo.GetResourcesURL(VersionConfigEx.Get().branch), LocalResManager.fixPath, "/", assetVersion.relativePath);
-                var localURL = StringUtility.Contact(LocalResManager.Instance.ExternalStorePath, assetVersion.relativePath);
+                var remoteURL = StringUtility.Concat(LocalResManager.Instance.versionInfo.GetResourcesURL(VersionConfigEx.Get().branch), LocalResManager.fixPath, "/", assetVersion.relativePath);
+                var localURL = StringUtility.Concat(LocalResManager.Instance.ExternalStorePath, assetVersion.relativePath);
                 DownloadMgr.Instance.AddTask(new DownloadTask(remoteURL, localURL));
             }
 
diff --git a/Assets/Launch/Common/FileExtersion.cs b/Assets/Launch/Common/FileExtersion.cs
index 0604e01..a59d144 100644
--- a/Assets/Launch/Common/FileExtersion.cs
+++ b/Assets/Launch/Common/FileExtersion.cs
@@ -105,7 +105,7 @@
         {
             var startIndex = index + 9;
             fileName = fileName.Substring(startIndex, fileName.Length - startIndex);
-            return StringUtility.Contact(Path.GetDirectoryName(_fullName), Path.DirectorySeparatorChar.ToString(), fileName);
+            return StringUtility.Concat(Path.GetDirectoryName(_fullName), Path.DirectorySeparatorChar.ToString(), fileName);
         }
         else
         {
diff --git a/Assets/Launch/Launch.cs b/Assets/Launch/Launch.cs
index 16480c8..70c331b 100644
--- a/Assets/Launch/Launch.cs
+++ b/Assets/Launch/Launch.cs
@@ -85,6 +85,7 @@
         System.Globalization.CultureInfo.DefaultThreadCurrentCulture = culture;
         System.Globalization.CultureInfo.DefaultThreadCurrentUICulture = culture;
         System.Net.ServicePointManager.DefaultConnectionLimit = 100;
+        StringUtility.WarmupPool();
 
 #if UNITY_EDITOR
         //鍐呯綉涓嬭浇娴嬭瘯
diff --git a/Assets/Launch/Manager/LocalResManager.cs b/Assets/Launch/Manager/LocalResManager.cs
index d46cd85..550556d 100644
--- a/Assets/Launch/Manager/LocalResManager.cs
+++ b/Assets/Launch/Manager/LocalResManager.cs
@@ -236,9 +236,9 @@
     {
         Sprite sprite = null;
 #if UNITY_EDITOR
-        if (excludePngs.Contains(StringUtility.Contact(name, ".png")))
+        if (excludePngs.Contains(StringUtility.Concat(name, ".png")))
         {
-            var path = StringUtility.Contact("Assets/ResourcesOut/BuiltIn/Sprites/", name, ".png");
+            var path = StringUtility.Concat("Assets/ResourcesOut/BuiltIn/Sprites/", name, ".png");
             sprite = UnityEditor.AssetDatabase.LoadAssetAtPath<Sprite>(path);
         }
         else
diff --git a/Assets/Launch/UI/LaunchWins/LaunchExWin.cs b/Assets/Launch/UI/LaunchWins/LaunchExWin.cs
index ebb557b..198100f 100644
--- a/Assets/Launch/UI/LaunchWins/LaunchExWin.cs
+++ b/Assets/Launch/UI/LaunchWins/LaunchExWin.cs
@@ -117,13 +117,13 @@
         }
         if (ShowCircleView)
         {
-            m_IosProgressTip.text = StringUtility.Contact(sliderText, " ", ((int)(value * 100)).ToString(), "%");
+            m_IosProgressTip.text = StringUtility.Concat(sliderText, " ", ((int)(value * 100)).ToString(), "%");
             //circleImg.Rotate(Vector3.forward, -1800 * Time.deltaTime);
         }
         else
         {
             m_TotalProgressSlider.value = value;
-            m_StageDescription.text = StringUtility.Contact(sliderText, " ", ((int)(value * 100)).ToString(), "%");
+            m_StageDescription.text = StringUtility.Concat(sliderText, " ", ((int)(value * 100)).ToString(), "%");
         }
 
     }
diff --git a/Assets/Launch/Utility/StringUtility.cs b/Assets/Launch/Utility/StringUtility.cs
index 72bd249..de0c656 100644
--- a/Assets/Launch/Utility/StringUtility.cs
+++ b/Assets/Launch/Utility/StringUtility.cs
@@ -2,88 +2,201 @@
 using System.Collections;
 using System.Text;
 using System;
+using System.Collections.Concurrent;
 
+
+// AI鎻愰啋瀹為檯鍦ㄧ幇浠g紪杈戝櫒涓紝浣庝簬4涓瓧绗︿覆鐨�+ 鎿嶄綔绗︾殑鎬ц兘鍜� string.Concat 鍑犱箮鐩稿悓锛屼細琚櫤鑳戒紭鍖栦负 string.Concat
 public class StringUtility
 {
     public static readonly string[] splitSeparator = new string[] { "|" };
 
+    // 瀵硅薄姹犳柟妗堬細绾跨▼瀹夊叏鐨凷tringBuilder姹�
+    private static readonly ConcurrentQueue<StringBuilder> _stringBuilderPool = new ConcurrentQueue<StringBuilder>();
+    private const int MAX_POOL_SIZE = 32;  // 澧炲姞姹犲ぇ灏忎互閫傚簲楂樺苟鍙�
+    private const int DEFAULT_CAPACITY = 64;
+    private const int SMALL_CAPACITY = 64;   // 閫傜敤浜庡皬瑙勬ā鎷兼帴
+    private const int TINY_CAPACITY = 32;    // 閫傜敤浜庢瀬灏忚妯℃嫾鎺�
+    private const int MEDIUM_CAPACITY = 128; // 鏂板涓瓑瀹归噺绾у埆
+    private const int LARGE_CAPACITY = 256;  // 鏂板澶у閲忕骇鍒�
 
-    // 鏂板锛氫负寰幆璋冪敤鐨勪紭鍖栫増鏈紙澶嶇敤StringBuilder锛�
-    [ThreadStatic]
-    private static StringBuilder _threadLocalStringBuilder;
-    
+
     /// <summary>
-    /// 鑾峰彇褰撳墠绾跨▼鐨凷tringBuilder
+    /// 鏅鸿兘瀹归噺浼扮畻锛堜紭鍖栫増锛�
     /// </summary>
-    private static StringBuilder GetThreadLocalStringBuilder()
+    private static int EstimateCapacity(params string[] objects)
     {
-        if (_threadLocalStringBuilder == null)
+        if (objects == null || objects.Length == 0)
+            return TINY_CAPACITY;
+
+        int totalLength = 0;
+
+        // 鍗曟閬嶅巻璁$畻鎬婚暱搴︼紝鎻愰珮鎬ц兘
+        foreach (string str in objects)
         {
-            _threadLocalStringBuilder = new StringBuilder();
+            if (str != null)
+                totalLength += str.Length;
         }
-        return _threadLocalStringBuilder;
+
+        // 鏇寸簿缁嗙殑瀹归噺绛栫暐锛屽噺灏戝唴瀛樻氮璐�
+        if (totalLength <= TINY_CAPACITY)
+            return TINY_CAPACITY;
+        else if (totalLength <= SMALL_CAPACITY)
+            return SMALL_CAPACITY;
+        else if (totalLength <= MEDIUM_CAPACITY)
+            return MEDIUM_CAPACITY;
+        else if (totalLength <= LARGE_CAPACITY)
+            return LARGE_CAPACITY;
+        else
+            // 瀵逛簬瓒呭ぇ瀛楃涓诧紝棰勭暀25%鐨勭紦鍐茬┖闂达紙鍑忓皯鍐呭瓨娴垂锛�
+            return totalLength + (totalLength >> 2);
     }
 
     /// <summary>
-    /// 鏅鸿兘瀛楃涓叉嫾鎺ユ柟娉曪紝鑷姩閫夋嫨鏈�浼樼瓥鐣�
-    /// - 2-4涓瓧绗︿覆锛氱洿鎺ヤ娇鐢� string.Concat() (鏈�楂樻�ц兘)
-    /// - 5涓互涓婂瓧绗︿覆锛氫娇鐢ㄧ嚎绋嬫湰鍦� StringBuilder 澶嶇敤 (寰幆浼樺寲)
+    /// 浠庡璞℃睜鑾峰彇StringBuilder
+    /// </summary>
+    private static StringBuilder GetPooledStringBuilder(int capacity = DEFAULT_CAPACITY)
+    {
+        if (_stringBuilderPool.TryDequeue(out StringBuilder sb))
+        {
+            sb.Clear();
+            // 濡傛灉瀹归噺涓嶈冻锛岄噸鏂板垱寤�
+            if (sb.Capacity < capacity)
+            {
+                sb = new StringBuilder(capacity);
+            }
+            return sb;
+        }
+        return new StringBuilder(capacity);
+    }
+
+    /// <summary>
+    /// 灏哠tringBuilder褰掕繕鍒板璞℃睜锛堜紭鍖栫増锛�
+    /// </summary>
+    private static void ReturnToPool(StringBuilder sb)
+    {
+        if (sb == null)
+            return;
+
+        // 瀹归噺杩囧ぇ鎴栬繃闀匡紝涓嶅洖鏀朵互閬垮厤鍐呭瓨闂
+        if (sb.Capacity > 2048 || sb.Length > 1024)
+        {
+            SecureClear(sb);
+            return;
+        }
+
+        // 姹犳湭婊℃椂鎵嶅洖鏀�
+        if (_stringBuilderPool.Count < MAX_POOL_SIZE)
+        {
+            sb.Clear();
+            _stringBuilderPool.Enqueue(sb);
+        }
+        else
+        {
+            // 姹犳弧鏃惰繘琛屽畨鍏ㄦ竻鐞�
+            SecureClear(sb);
+        }
+    }
+
+    /// <summary>
+    /// 瀹夊叏娓呯悊StringBuilder鍐呭锛堥槻姝㈡晱鎰熸暟鎹硠闇诧級
+    /// </summary>
+    private static void SecureClear(StringBuilder sb)
+    {
+        if (sb == null || sb.Length == 0)
+            return;
+
+        // 鍩虹娓呯悊
+        sb.Clear();
+
+        // 瀹夊叏娓呯悊锛氱敤绌哄瓧绗﹁鐩栫紦鍐插尯
+        // #if UNITY_EDITOR || DEVELOPMENT_BUILD
+        // // 浠呭湪寮�鍙戠増鏈腑鎵ц鏇村交搴曠殑娓呯悊锛岄伩鍏嶅奖鍝嶆�ц兘
+        // int originalCapacity = sb.Capacity;
+        // if (originalCapacity <= 1024) // 浠呭灏忓閲廠tringBuilder杩涜瀹夊叏娓呯悊
+        // {
+        //     sb.Capacity = originalCapacity;
+        //     for (int i = 0; i < originalCapacity; i++)
+        //     {
+        //         sb.Append('\0');
+        //     }
+        //     sb.Clear();
+        // }
+        // #endif
+    }
+
+    /// <summary>
+    /// 鏅鸿兘瀛楃涓叉嫾鎺ユ柟娉曪紙浼樺寲鐗堬級锛岃嚜鍔ㄩ�夋嫨鏈�浼樼瓥鐣�
+    /// - 1-4涓瓧绗︿覆锛氱洿鎺ヤ娇鐢� string.Concat() (鏈�楂樻�ц兘)
+    /// - 4-8涓瓧绗︿覆锛氫娇鐢ㄥ璞℃睜 StringBuilder锛屽閲忛鍒嗛厤
+    /// - 9涓互涓婂瓧绗︿覆锛氫娇鐢ㄥ璞℃睜 StringBuilder + 瀹归噺浼扮畻
     /// </summary>
     public static string Concat(params string[] _objects)
     {
+        if (_objects == null || _objects.Length == 0)
+            return string.Empty;
+
         // 灏戦噺瀛楃涓茬洿鎺ヤ娇鐢–oncat锛屾�ц兘鏈�浣�
         if (_objects.Length <= 4)
         {
             return string.Concat(_objects);
         }
 
-        // 澶ч噺瀛楃涓蹭娇鐢ㄧ嚎绋嬫湰鍦癝tringBuilder锛岄伩鍏嶉噸澶嶅垱寤�
-        var sb = GetThreadLocalStringBuilder();
-        sb.Clear();
-        foreach (string str in _objects)
+        // 涓瓑鏁伴噺瀛楃涓蹭娇鐢ㄧ畝鍗曞閲忕瓥鐣�
+        int estimatedCapacity;
+        if (_objects.Length <= 8)
         {
-            sb.Append(str);
+            estimatedCapacity = DEFAULT_CAPACITY;
         }
-        return sb.ToString();
-    }
-    
-    // AI鎻愰啋瀹為檯鍦ㄧ幇浠g紪杈戝櫒涓紝浣庝簬4涓瓧绗︿覆鐨�+ 鎿嶄綔绗︾殑鎬ц兘鍜� string.Concat 鍑犱箮鐩稿悓锛屼細琚櫤鑳戒紭鍖栦负 string.Concat
-    // 娣诲姞甯哥敤2涓瓧绗︿覆鎷兼帴鐨勪紭鍖栫増鏈�
-    public static string Contact(string str1, string str2)
-    {
-        return string.Concat(str1, str2);
-    }
-    
-    // 娣诲姞甯哥敤3涓瓧绗︿覆鎷兼帴鐨勪紭鍖栫増鏈�
-    public static string Contact(string str1, string str2, string str3)
-    {
-        return string.Concat(str1, str2, str3);
-    }
-    
-    // 娣诲姞甯哥敤4涓瓧绗︿覆鎷兼帴鐨勪紭鍖栫増鏈�
-    public static string Contact(string str1, string str2, string str3, string str4)
-    {
-        return string.Concat(str1, str2, str3, str4);
-    }
-   
+        else
+        {
+            // 澶ч噺瀛楃涓叉墠杩涜瀹归噺浼扮畻锛堜紭鍖栨�ц兘锛�
+            estimatedCapacity = EstimateCapacity(_objects);
+        }
 
-  
+        var sb = GetPooledStringBuilder(estimatedCapacity);
+        try
+        {
+            foreach (string str in _objects)
+            {
+                sb.Append(str);
+            }
+            return sb.ToString();
+        }
+        finally
+        {
+            ReturnToPool(sb);
+        }
+    }
 
 
     public static string FormatSpeed(float speed)
     {
         if (speed > 1048576f)
         {
-            return Contact((speed / 1048576f).ToString("f1"), " M/S");
+            return Concat((speed / 1048576f).ToString("f1"), " M/S");
         }
         else if (speed > 1024f)
         {
-            return Contact((speed / 1024f).ToString("f1"), " KB/S");
+            return Concat((speed / 1024f).ToString("f1"), " KB/S");
         }
         else
         {
-            return Contact(speed.ToString("f1"), " B/S");
+            return Concat(speed.ToString("f1"), " B/S");
         }
     }
 
+    /// <summary>
+    /// 棰勭儹瀵硅薄姹狅紙鍦ㄥ簲鐢ㄥ惎鍔ㄦ椂璋冪敤锛�
+    /// </summary>
+    public static void WarmupPool(int count = 4)
+    {
+        // 棰勭儹涓嶅悓瀹归噺鐨凷tringBuilder浠ラ�傚簲涓嶅悓鍦烘櫙
+        for (int i = 0; i < count && _stringBuilderPool.Count < MAX_POOL_SIZE; i++)
+        {
+            _stringBuilderPool.Enqueue(new StringBuilder(DEFAULT_CAPACITY));
+        }
+    }
+
+
+
 }

--
Gitblit v1.8.0