| | |
| | | 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";
|
| | | }
|
| | |
| | | {
|
| | | 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 处理完成");
|
| | | }
|
| | | //发包时获取热更dll和裁剪AOT
|
| | |
| | | PrebuildCommand.GenerateAll();
|
| | | // 输出到AssetBundles目录
|
| | | 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到指定路径
|
| | |
| | | }
|
| | | // 输出到AssetBundles目录
|
| | | 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();
|
| | |
| | | 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文件");
|
| | | }
|
| | |
| | | //HybridCLR Settings面板上设置的裁减后AOT dll输出根目录
|
| | | string strippedAOTDllOutputRootDir = "/" + HybridCLRSettings.Instance.strippedAOTDllOutputRootDir;
|
| | | //重新生成的AOT所在路径
|
| | | string aotDir = StringUtility.Contact(rootDir, strippedAOTDllOutputRootDir, platformName);
|
| | | string aotDir = StringUtility.Concat(rootDir, strippedAOTDllOutputRootDir, platformName);
|
| | |
|
| | | if (Directory.Exists(checkAotDir))
|
| | | {
|
| | |
| | |
|
| | | 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))
|
| | | {
|
| | |
| | | //HybridCLR Settings面板上设置的热更新dll编译输出根目录
|
| | | string hotUpdateDllCompileOutputRootDir = "/" + HybridCLRSettings.Instance.hotUpdateDllCompileOutputRootDir;
|
| | | //热更DLL生成目录
|
| | | string hotDllDir = StringUtility.Contact(rootDir, hotUpdateDllCompileOutputRootDir, platformName);
|
| | | string hotDllDir = StringUtility.Concat(rootDir, hotUpdateDllCompileOutputRootDir, platformName);
|
| | | //HybridCLR的Settings面板上设置的热更新Assembly Definitions 资源
|
| | | var assemblyDefinitionAsset = HybridCLRSettings.Instance.hotUpdateAssemblyDefinitions;
|
| | | for (int i = 0; i < assemblyDefinitionAsset.Length; i++)
|
| | |
| | | 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))
|
| | | {
|
| | |
| | | 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))
|
| | | {
|
| | |
| | | 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))
|
| | | {
|
| | |
| | |
|
| | | 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);
|
| | |
| | | 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
|
| | | {
|
| | |
| | | }
|
| | | // 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[]"))
|
| | | {
|
| | |
| | | }
|
| | | // 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
|
| | | {
|
| | |
| | | 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
|
| | | {
|
| | |
| | | }
|
| | | 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);
|
| | | }
|
| | |
| | | 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);
|
| | | }
|
| | |
| | | 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);
|
| | | }
|
| | |
| | | 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);
|
| | | }
|
| | |
| | | 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"))
|
| | | {
|
| | |
| | | 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);
|
| | |
| | | // { |
| | | // 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); |
| | |
| | | // 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(); |
| | |
| | | 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);
|
| | |
| | | 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()));
|
| | | }
|
| | |
|
| | | }
|
| | |
| | | if (!buildParameters.error)
|
| | | {
|
| | | ExcuteBuildAsset("config", buildParameters);
|
| | | TableTool.CopyConfigsToOutPutPath(StringUtility.Contact(buildParameters.GetWholeOutPutPath(), "/config"));
|
| | | TableTool.CopyConfigsToOutPutPath(StringUtility.Concat(buildParameters.GetWholeOutPutPath(), "/config"));
|
| | | }
|
| | | else
|
| | | {
|
| | |
| | | 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;
|
| | | }
|
| | |
| | | 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()));
|
| | | }
|
| | |
|
| | | }
|
| | |
| | | }
|
| | |
|
| | | 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))
|
| | | {
|
| | |
| | |
|
| | | 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);
|
| | |
| | | }
|
| | |
|
| | | 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);
|
| | |
| | | }
|
| | |
|
| | | 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);
|
| | |
| | | }
|
| | |
|
| | | 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);
|
| | |
| | |
|
| | | //剔除视频资源
|
| | | 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);
|
| | |
| | | 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);
|
| | |
| | |
|
| | | //剔除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);
|
| | |
| | | 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);
|
| | |
| | | #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);
|
| | |
| | | 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"))//不包含meta文件和补丁
|
| | | continue;
|
| | |
|
| | |
| | | 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"))//不包含meta文件和补丁
|
| | | continue;
|
| | |
|
| | |
| | | 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);
|
| | |
| | | // 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;
|
| | |
| | | // 更名原有文件
|
| | | // 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)
|
| | |
| | | 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);
|
| | | }
|
| | |
|
| | |
| | |
|
| | | 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;
|
| | |
| | | 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>();
|
| | |
| | | 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++)
|
| | |
| | | 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 };
|
| | |
|
| | |
| | | } |
| | | |
| | | 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); |
| | | } |
| | | |
| | |
| | | |
| | | 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); |
| | |
| | | } |
| | | |
| | | 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); |
| | |
| | | } |
| | | |
| | | 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); |
| | |
| | | } |
| | | |
| | | 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); |
| | |
| | | } |
| | | |
| | | 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); |
| | |
| | | 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)) |
| | | { |
| | |
| | | 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)) |
| | | { |
| | |
| | | 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; |
| | |
| | | { |
| | | 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>(); |
| | |
| | | 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++) |
| | |
| | | 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 }; |
| | | } |
| | |
| | | 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"))
|
| | | {
|
| | |
| | | }
|
| | | 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"))
|
| | | {
|
| | |
| | | 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)
|
| | | {
|
| | |
| | | _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)
|
| | | {
|
| | |
| | | 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;
|
| | |
| | | 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("根路径", "", "");
|
| | |
| | |
|
| | | 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))
|
| | | {
|
| | |
| | |
|
| | | 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)
|
| | | {
|
| | |
| | | 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))
|
| | | {
|
| | |
| | |
|
| | | try
|
| | | {
|
| | | contain = Regex.IsMatch(package.name, StringUtility.Contact(".*(", filterNetPkgStr.Replace(" ", "|"), ").*"));
|
| | | contain = Regex.IsMatch(package.name, StringUtility.Concat(".*(", filterNetPkgStr.Replace(" ", "|"), ").*"));
|
| | | }
|
| | | catch (System.Exception ex)
|
| | | {
|
| | |
| | | }
|
| | |
|
| | | 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));
|
| | |
| | | //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) |
| | |
| | | // 存在则比较 |
| | | 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)) |
| | | { |
| | |
| | | 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)); |
| | | } |
| | | |
| | |
| | | { |
| | | 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 |
| | | { |
| | |
| | | System.Globalization.CultureInfo.DefaultThreadCurrentCulture = culture;
|
| | | System.Globalization.CultureInfo.DefaultThreadCurrentUICulture = culture;
|
| | | System.Net.ServicePointManager.DefaultConnectionLimit = 100;
|
| | | StringUtility.WarmupPool();
|
| | |
|
| | | #if UNITY_EDITOR
|
| | | //内网下载测试
|
| | |
| | | { |
| | | 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 |
| | |
| | | } |
| | | 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(), "%"); |
| | | } |
| | | |
| | | } |
| | |
| | | using System.Collections; |
| | | using System.Text; |
| | | using System; |
| | | using System.Collections.Concurrent; |
| | | |
| | | |
| | | // AI提醒实际在现代编辑器中,低于4个字符串的+ 操作符的性能和 string.Concat 几乎相同,会被智能优化为 string.Concat |
| | | public class StringUtility |
| | | { |
| | | public static readonly string[] splitSeparator = new string[] { "|" }; |
| | | |
| | | // 对象池方案:线程安全的StringBuilder池 |
| | | 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> |
| | | /// 获取当前线程的StringBuilder |
| | | /// 智能容量估算(优化版) |
| | | /// </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> |
| | | /// 将StringBuilder归还到对象池(优化版) |
| | | /// </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) // 仅对小容量StringBuilder进行安全清理 |
| | | // { |
| | | // 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; |
| | | |
| | | // 少量字符串直接使用Concat,性能最佳 |
| | | if (_objects.Length <= 4) |
| | | { |
| | | return string.Concat(_objects); |
| | | } |
| | | |
| | | // 大量字符串使用线程本地StringBuilder,避免重复创建 |
| | | 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提醒实际在现代编辑器中,低于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) |
| | | { |
| | | // 预热不同容量的StringBuilder以适应不同场景 |
| | | for (int i = 0; i < count && _stringBuilderPool.Count < MAX_POOL_SIZE; i++) |
| | | { |
| | | _stringBuilderPool.Enqueue(new StringBuilder(DEFAULT_CAPACITY)); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | } |