From f72479e4a61f6f1cf9b99bd12edcb3f22c941a44 Mon Sep 17 00:00:00 2001 From: Merlin <36685500+Merlin-san@users.noreply.github.com> Date: Thu, 19 Mar 2020 02:46:59 -0700 Subject: [PATCH] Add a few profiling markers and make errors pink --- .../Editor/UdonSharpCompilationModule.cs | 16 ++++++++++++++++ Assets/UdonSharp/Editor/UdonSharpCompiler.cs | 5 +++++ Assets/UdonSharp/Editor/UdonSharpProgramAsset.cs | 2 +- Assets/UdonSharp/Editor/UdonSharpUtils.cs | 2 +- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Assets/UdonSharp/Editor/UdonSharpCompilationModule.cs b/Assets/UdonSharp/Editor/UdonSharpCompilationModule.cs index 352ac3a5..2fed3b9d 100644 --- a/Assets/UdonSharp/Editor/UdonSharpCompilationModule.cs +++ b/Assets/UdonSharp/Editor/UdonSharpCompilationModule.cs @@ -8,6 +8,7 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using UnityEditor; using UnityEngine; +using UnityEngine.Profiling; namespace UdonSharp { @@ -42,11 +43,16 @@ public int Compile(List classDefinitions) if (programAsset.sourceCsScript == null) throw new System.ArgumentException($"Asset '{AssetDatabase.GetAssetPath(programAsset)}' does not have a valid program source to compile from"); + Profiler.BeginSample("Compile Module"); + programAsset.compileErrors.Clear(); sourceCode = File.ReadAllText(AssetDatabase.GetAssetPath(programAsset.sourceCsScript)); + Profiler.BeginSample("Parse AST"); SyntaxTree tree = CSharpSyntaxTree.ParseText(sourceCode); + Profiler.EndSample(); + int errorCount = 0; string errorString = ""; @@ -71,9 +77,11 @@ public int Compile(List classDefinitions) if (errorCount > 0) { ErrorCount = errorCount; + Profiler.EndSample(); return errorCount; } + Profiler.BeginSample("Visit"); UdonSharpFieldVisitor fieldVisitor = new UdonSharpFieldVisitor(fieldsWithInitializers); fieldVisitor.Visit(tree.GetRoot()); @@ -112,19 +120,27 @@ public int Compile(List classDefinitions) errorCount++; } + Profiler.EndSample(); if (errorCount == 0) { + Profiler.BeginSample("Build assembly"); string dataBlock = BuildHeapDataBlock(); string codeBlock = visitor.GetCompiledUasm(); programAsset.SetUdonAssembly(dataBlock + codeBlock); + Profiler.EndSample(); + + Profiler.BeginSample("Assemble Program"); programAsset.AssembleCsProgram((uint)(moduleSymbols.GetAllUniqueChildSymbols().Count + visitor.GetExternStrCount())); + Profiler.EndSample(); programAsset.behaviourIDHeapVarName = visitor.GetIDHeapVarName(); programAsset.fieldDefinitions = visitor.visitorContext.localFieldDefinitions; } + Profiler.EndSample(); + return errorCount; } diff --git a/Assets/UdonSharp/Editor/UdonSharpCompiler.cs b/Assets/UdonSharp/Editor/UdonSharpCompiler.cs index 83213828..34cee6d6 100644 --- a/Assets/UdonSharp/Editor/UdonSharpCompiler.cs +++ b/Assets/UdonSharp/Editor/UdonSharpCompiler.cs @@ -11,6 +11,7 @@ using Microsoft.CSharp; using UnityEditor; using UnityEngine; +using UnityEngine.Profiling; using VRC.Udon.Common.Interfaces; namespace UdonSharp @@ -33,6 +34,8 @@ public UdonSharpCompiler(UdonSharpProgramAsset[] programAssets) public void Compile() { + Profiler.BeginSample("UdonSharp Compile"); + System.Diagnostics.Stopwatch compileTimer = new System.Diagnostics.Stopwatch(); compileTimer.Start(); @@ -90,6 +93,8 @@ public void Compile() Debug.Log($"[UdonSharp] Compile of script{(modules.Length > 1 ? "s" : "")} {string.Join(", ", modules.Select(e => Path.GetFileName(AssetDatabase.GetAssetPath(e.programAsset.sourceCsScript))))} finished in {compileTimer.Elapsed.ToString("mm\\:ss\\.fff")}"); } } + + Profiler.EndSample(); } public int AssignHeapConstants() diff --git a/Assets/UdonSharp/Editor/UdonSharpProgramAsset.cs b/Assets/UdonSharp/Editor/UdonSharpProgramAsset.cs index 7c747c96..0a7d392a 100644 --- a/Assets/UdonSharp/Editor/UdonSharpProgramAsset.cs +++ b/Assets/UdonSharp/Editor/UdonSharpProgramAsset.cs @@ -55,7 +55,7 @@ private void DrawCompileErrorTextArea() // todo: convert this to a tree view that just has a list of selectable items that jump to the error EditorGUILayout.LabelField($"Compile Error{(compileErrors.Count > 1 ? "s" : "")}", EditorStyles.boldLabel); - EditorGUILayout.TextArea(string.Join("\n", compileErrors.Select(e => e.Replace("[UdonSharp] ", ""))), errorTextStyle); + EditorGUILayout.TextArea(string.Join("\n", compileErrors.Select(e => e.Replace("[UdonSharp] ", ""))), errorTextStyle); } protected override void DrawProgramSourceGUI(UdonBehaviour udonBehaviour, ref bool dirty) diff --git a/Assets/UdonSharp/Editor/UdonSharpUtils.cs b/Assets/UdonSharp/Editor/UdonSharpUtils.cs index cf5c315a..0a8d98f9 100644 --- a/Assets/UdonSharp/Editor/UdonSharpUtils.cs +++ b/Assets/UdonSharp/Editor/UdonSharpUtils.cs @@ -361,7 +361,7 @@ public static string LogBuildError(string message, string filePath, int line, in { MethodInfo buildErrorLogMethod = typeof(UnityEngine.Debug).GetMethod("LogPlayerBuildError", BindingFlags.NonPublic | BindingFlags.Static); - string errorMessage = $"[UdonSharp] {filePath}({line},{character}): {message}"; + string errorMessage = $"[UdonSharp] {filePath}({line},{character}): {message}"; buildErrorLogMethod.Invoke(null, new object[] { errorMessage,