void DrawHorizontalDetails() { using (var f = ProfilerDriver.GetRawFrameDataView(ProfilerWindow.GetActiveVisibleFrameIndex(), 0)) { if (f.valid) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Total Overlaps: " + GetCounterValue(f, "Overlaps"), GUILayout.Width(k_labelWidthTitle)); EditorGUILayout.LabelField("| Discreet: " + GetCounterValue(f, "Discreet Overlaps"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("Continuous: " + GetCounterValue(f, "Continuous Overlaps"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("Trigger: " + GetCounterValue(f, "Trigger Overlaps"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("Modified: " + GetCounterValue(f, "Modified Overlaps"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Broadphase Adds/Removes: " + GetCounterValue(f, "Broadphase Adds/Removes"), GUILayout.Width(k_labelWidthTitle)); EditorGUILayout.LabelField("| Adds: " + GetCounterValue(f, "Broadphase Adds"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("Removes: " + GetCounterValue(f, "Broadphase Removes"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Narrowphase Touches: " + GetCounterValue(f, "Narrowphase Touches"), GUILayout.Width(k_labelWidthTitle)); EditorGUILayout.LabelField("| New: " + GetCounterValue(f, "Narrowphase New Touches"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("Lost: " + GetCounterValue(f, "Narrowphase Lost Touches"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.EndHorizontal(); } } }
void PrintDatas(string dataType) { var parent = Directory.GetParent(Application.dataPath); var directoryPath = parent.FullName + "/ProfilerData"; if (!Directory.Exists(directoryPath)) { Directory.CreateDirectory(directoryPath); } var outputPath = string.Format("{0}/ProfilerDetailed{1:yyyy_MM_dd_HH_mm_ss}.txt", directoryPath, DateTime.Now); File.Create(outputPath).Dispose(); using (var writer = new StreamWriter(outputPath)) { switch (dataType) { case "CPU": ProfilerWindow.SwitchWindow(ProfilerArea.CPU); ProfilerWindow.WriteCPU(writer, ProfilerWindow.GetCPUDetail(writer)); break; case "GPU": ProfilerWindow.SwitchWindow(ProfilerArea.GPU); ProfilerWindow.WriteGPU(writer, ProfilerWindow.GetGPUDetail(writer)); break; } writer.Flush(); writer.Close(); } Process.Start(outputPath); }
public InitializationArgs(string identifier, string name, string iconPath, ProfilerWindow profilerWindow) { Identifier = identifier; DisplayName = name; IconPath = iconPath; ProfilerWindow = profilerWindow; }
void SampleData(int begin, int end) { ClearAllData(); if (isSampleCPU) { CPUUsedTimePorprotion = ProfilerWindow.UsedTimeProportion(begin, end, timeThreshold, timeThreshold.Length); cpuData = ProfilerWindow.CPUOrGPUUsedTime(begin, end, ProfilerColumn.TotalTime); } if (isSampleGPU) { gpuData = ProfilerWindow.CPUOrGPUUsedTime(begin, end, ProfilerColumn.TotalGPUTime); } if (isSampleGC) { GCTotalTime = 0; GCFrame = ProfilerWindow.GCCollectCount(begin, end, "GC.Collect", ref GCTotalTime); } if (isSampleFuncDetail) { CPUFunctionDetail = ProfilerWindow.CPUFunctionDetail(begin, end, targetName); } if (isPrintHighUsedFunc) { highFuncList = ProfilerWindow.HighUsedFunc(begin, end, highFuncPorprotion); } SaveDataAndDraw(); }
/// <inheritdoc /> public override void OnInit() { Assert.IsNull(MainWindow); _windowsLayoutPath = StringUtils.CombinePaths(Globals.ProjectCacheFolder, "WindowsLayout.xml"); // Create main window var dpiScale = Platform.DpiScale; var settings = CreateWindowSettings.Default; settings.Title = "Flax Editor"; settings.Size = new Vector2(1300 * dpiScale, 900 * dpiScale); settings.StartPosition = WindowStartPosition.CenterScreen; if (!Editor.Instance.Options.Options.Interface.UseNativeWindowSystem) { settings.HasBorder = false; settings.HasSizingFrame = false; } MainWindow = Window.Create(settings); if (MainWindow == null) { // Error Editor.LogError("Failed to create editor main window!"); return; } UpdateWindowTitle(); // Link for main window events MainWindow.Closing += MainWindow_OnClosing; MainWindow.Closed += MainWindow_OnClosed; // Create default editor windows ContentWin = new ContentWindow(Editor); EditWin = new EditGameWindow(Editor); GameWin = new GameWindow(Editor); PropertiesWin = new PropertiesWindow(Editor); SceneWin = new SceneTreeWindow(Editor); DebugLogWin = new DebugLogWindow(Editor); OutputLogWin = new OutputLogWindow(Editor); ToolboxWin = new ToolboxWindow(Editor); GraphicsQualityWin = new GraphicsQualityWindow(Editor); GameCookerWin = new GameCookerWindow(Editor); ProfilerWin = new ProfilerWindow(Editor); EditorOptionsWin = new EditorOptionsWindow(Editor); PluginsWin = new PluginsWindow(Editor); // Bind events SceneManager.SceneSaveError += OnSceneSaveError; SceneManager.SceneLoaded += OnSceneLoaded; SceneManager.SceneLoadError += OnSceneLoadError; SceneManager.SceneLoading += OnSceneLoading; SceneManager.SceneSaved += OnSceneSaved; SceneManager.SceneSaving += OnSceneSaving; SceneManager.SceneUnloaded += OnSceneUnloaded; SceneManager.SceneUnloading += OnSceneUnloading; ScriptsBuilder.ScriptsReloadEnd += OnScriptsReloadEnd; }
internal static void SetProfilerDeepProfile(bool deepProfile) { #if UNITY_2019_3_OR_NEWER ProfilerWindow.SetEditorDeepProfiling(deepProfile); #else ProfilerDriver.deepProfiling = deepProfile; RequestScriptReload(); #endif }
public MemoryProfilerModuleViewController(ProfilerWindow profilerWindow, MemoryProfilerModule memoryModule) : base(profilerWindow) { profilerWindow.SelectedFrameIndexChanged += UpdateContent; m_MemoryModule = memoryModule; if (!m_MemoryModule.InitiateMemoryProfilerPackageAvailabilityCheck()) { m_InitiatedPackageSearchQuery = true; } }
public void OnDisable() { if (m_ProfilerWindow != null) { m_ProfilerWindow = null; } #if UNITY_2021_1_OR_NEWER if (m_CpuProfilerModule != null) { m_CpuProfilerModule.selectionChanged -= OnSelectionChangedInCpuProfilerModule; m_CpuProfilerModule = null; } #endif }
/// <inheritdoc /> public override void OnInit() { Assert.IsNull(MainWindow); _windowsLayoutPath = StringUtils.CombinePaths(Globals.ProjectCacheFolder, "WindowsLayout.xml"); // Create main window var settings = CreateWindowSettings.Default; settings.Title = "Flax Editor"; settings.Size = new Vector2(1300, 900); settings.StartPosition = WindowStartPosition.CenterScreen; MainWindow = Window.Create(settings); if (MainWindow == null) { // Error Debug.LogError("Failed to create editor main window!"); return; } UpdateWindowTitle(); // Link for main window events MainWindow.OnClosing += MainWindow_OnClosing; MainWindow.OnClosed += MainWindow_OnClosed; // Create default editor windows ContentWin = new ContentWindow(Editor); EditWin = new EditGameWindow(Editor); GameWin = new GameWindow(Editor); PropertiesWin = new PropertiesWindow(Editor); SceneWin = new SceneTreeWindow(Editor); DebugWin = new DebugLogWindow(Editor); ToolboxWin = new ToolboxWindow(Editor); GraphicsQualityWin = new GraphicsQualityWindow(Editor); GameCookerWin = new GameCookerWindow(Editor); ProfilerWin = new ProfilerWindow(Editor); EditorOptionsWin = new EditorOptionsWindow(Editor); // Bind events SceneManager.SceneSaveError += OnSceneSaveError; SceneManager.SceneLoaded += OnSceneLoaded; SceneManager.SceneLoadError += OnSceneLoadError; SceneManager.SceneLoading += OnSceneLoading; SceneManager.SceneSaved += OnSceneSaved; SceneManager.SceneSaving += OnSceneSaving; SceneManager.SceneUnloaded += OnSceneUnloaded; SceneManager.SceneUnloading += OnSceneUnloading; }
public override void CreateProfiler(ProfilerConfig config, int enabledTimeRulerLevels, int enabledPerformanceGraphLevels, int enabledProfilerSummaryLevels) { if (CreateUI == false) { return; } _profilerConfig = config; _profilerViewModel = new ProfilerViewModel(config.TimeRulerConfig.VisibleLevelsFlags, config.PerformanceGraphConfig.VisibleLevelsFlags, config.ProfilerSummaryConfig.VisibleLevelsFlags); _profilerViewModel.LevelItemChanged += (sender, args) => { OnLevelItemChanged(new LevelItemChangedEventArgs(args.Key, args.LevelId, args.Enabled)); }; _profilerWindow = new ProfilerWindow { Top = config.Top, Left = config.Left, Width = config.Width, Height = config.Height }; _profilerWindow.trLevelsListBox.DataContext = _profilerViewModel.TimeRulerLevels; _profilerWindow.PgLevelsListBox.DataContext = _profilerViewModel.PerformanceGraphLevels; _profilerWindow.PsLevelsListBox.DataContext = _profilerViewModel.ProfilerSummaryLevels; _profilerWindow.EnableAllTimeRulerLevels += (sender, args) => { _profilerViewModel.EnableAllTimeRulerLevels(); }; _profilerWindow.DisableAllTimeRulerLevels += (sender, args) => { _profilerViewModel.DisableAllTimeRulerLevels(); }; _profilerWindow.EnableAllPerformanceGraphLevels += (sender, args) => { _profilerViewModel.EnableAllPerformanceGraphLevels(); }; _profilerWindow.DisableAllPerformanceGraphLevels += (sender, args) => { _profilerViewModel.DisableAllPerformanceGraphLevels(); }; _profilerWindow.EnableAllProfilerSummaryLevels += (sender, args) => { _profilerViewModel.EnableAllProfilerSummaryLevels(); }; _profilerWindow.DisableAllProfilerSummaryLevels += (sender, args) => { _profilerViewModel.DisableAllProfilerSummaryLevels(); }; _profilerWindow.IsVisibleChanged += (sender, args) => _profilerConfig.Visible = _profilerWindow.IsVisible; _profilerWindow.LocationChanged += (sender, args) => _profilerLocationJustChanged = true; _profilerWindow.SizeChanged += (sender, args) => _profilerLocationJustChanged = true; if (_profilerConfig.Visible) { _profilerWindow.Show(); } _windows.Add(_profilerWindow); WindowHelper.EnsureOnScreen(_profilerWindow); }
Rect DrawAudioStatsPane(ref Vector2 scrollPos) { var totalRect = GUILayoutUtility.GetRect(20f, 20000f, 10, 10000f); var statsRect = new Rect(totalRect.x, totalRect.y, 230f, totalRect.height); var rightRect = new Rect(statsRect.xMax, totalRect.y, totalRect.width - statsRect.width, totalRect.height); // STATS var content = ProfilerDriver.GetOverviewText(area, ProfilerWindow.GetActiveVisibleFrameIndex()); var textSize = EditorStyles.wordWrappedLabel.CalcSize(GUIContent.Temp(content)); scrollPos = GUI.BeginScrollView(statsRect, scrollPos, new Rect(0, 0, textSize.x, textSize.y)); GUI.Label(new Rect(3, 3, textSize.x, textSize.y), content, EditorStyles.wordWrappedLabel); GUI.EndScrollView(); EditorGUI.DrawRect(new Rect(statsRect.xMax - 1, statsRect.y, 1, statsRect.height), Color.black); return(rightRect); }
public void OpenProfilerOrUseExisting() { // Note we use existing if possible to fix a bug after domain reload // Where calling EditorWindow.GetWindow directly causes a second window to open if (m_ProfilerWindow == null) { #if UNITY_2021_1_OR_NEWER m_ProfilerWindow = EditorWindow.GetWindow <ProfilerWindow>(); m_CpuProfilerModule = m_ProfilerWindow.GetFrameTimeViewSampleSelectionController(ProfilerWindow.cpuModuleName); m_CpuProfilerModule.selectionChanged -= OnSelectionChangedInCpuProfilerModule; m_CpuProfilerModule.selectionChanged += OnSelectionChangedInCpuProfilerModule; #else // Create new m_ProfilerWindow = EditorWindow.GetWindow(m_ProfilerWindowType); #endif } }
public override void DrawDetailsView(Rect position) { string activeText = string.Empty; using (var f = ProfilerDriver.GetRawFrameDataView(ProfilerWindow.GetActiveVisibleFrameIndex(), 0)) { if (f.valid) { if (m_ShowStatsView == PhysicsProfilerStatsView.Current) { var stringBuilder = new StringBuilder(1024); stringBuilder.Append("Physics Used Memory: " + GetCounterValueAsBytes(f, "Physics Used Memory")); stringBuilder.Append("\n\nDynamic Bodies: " + GetCounterValue(f, "Dynamic Bodies")); stringBuilder.Append("\nArticulation Bodies: " + GetCounterValue(f, "Articulation Bodies")); stringBuilder.Append("\n\nActive Dynamic Bodies: " + GetCounterValue(f, "Active Dynamic Bodies")); stringBuilder.Append("\nActive Kinematic Bodies: " + GetCounterValue(f, "Active Kinematic Bodies")); stringBuilder.Append("\n\nStatic Colliders: " + GetCounterValue(f, "Static Colliders")); stringBuilder.Append($"\nColliders Synced: {GetCounterValue(f, "Colliders Synced")}"); stringBuilder.Append($"\nRigidbodies Synced: {GetCounterValue(f, "Rigidbodies Synced")}"); stringBuilder.Append("\n\nPhysics Queries: " + GetCounterValue(f, "Physics Queries")); activeText = stringBuilder.ToString(); } else { // Old data compatibility. activeText = ProfilerDriver.GetOverviewText(ProfilerArea.Physics, ProfilerWindow.GetActiveVisibleFrameIndex()); } } } float height = EditorStyles.wordWrappedLabel.CalcHeight(GUIContent.Temp(activeText), position.width); m_PaneScroll = GUILayout.BeginScrollView(m_PaneScroll, ProfilerWindow.Styles.background); EditorGUILayout.SelectableLabel(activeText, EditorStyles.wordWrappedLabel, GUILayout.MinHeight(height)); if (m_ShowStatsView == PhysicsProfilerStatsView.Current && activeText != string.Empty) { DrawHorizontalDetails(); } GUILayout.EndScrollView(); }
public MainWindow() { InitializeComponent(); SetupLogging(); UpdateAppStates(AppState.APP_STATE_UNINITIALIZED); UpdateStatus(); SetTitle(); UpdateProfiling(); SetLoggingLevel(Settings.Level); profilerWindow = new ProfilerWindow(); profilerWindow.OnProfilerClosed += ProfilerWindow_OnClosed; monitorWindow = new MonitorWindow(); monitorWindow.OnMonitorClosed += PortMonitorWindow_OnClosed; PortMonitor.SetMonitor(monitorWindow); commTester = new CommTester(); }
private void OnLoadProfileData() { using (var frameData = ProfilerDriver.GetRawFrameDataView(ProfilerWindow.GetActiveVisibleFrameIndex(), 0)) { if (frameData.valid) { var physicsQueries = GetCounterValue(frameData, "Total Queries"); if (physicsQueries != -1) { m_ShowStatsView = PhysicsProfilerStatsView.Current; } else { m_ShowStatsView = PhysicsProfilerStatsView.Legacy; } } } }
public override void DrawDetailsView(Rect position) { string activeText = string.Empty; using (var f = ProfilerDriver.GetRawFrameDataView(ProfilerWindow.GetActiveVisibleFrameIndex(), 0)) { if (f.valid) { var batchesCount = GetCounterValue(f, "Batches Count"); if (batchesCount != -1) { var stringBuilder = new StringBuilder(1024); stringBuilder.Append($"SetPass Calls: {GetCounterValueAsNumber(f, "SetPass Calls Count")} \tDraw Calls: {GetCounterValueAsNumber(f, "Draw Calls Count")} \t\tBatches: {batchesCount} \tTriangles: {GetCounterValueAsNumber(f, "Triangles Count")} \tVertices: {GetCounterValueAsNumber(f, "Vertices Count")}"); stringBuilder.Append($"\n(Dynamic Batching)\tBatched Draw Calls: {GetCounterValueAsNumber(f, "Dynamic Batched Draw Calls Count")} \tBatches: {GetCounterValueAsNumber(f, "Dynamic Batches Count")} \tTriangles: {GetCounterValueAsNumber(f, "Dynamic Batched Triangles Count")} \tVertices: {GetCounterValueAsNumber(f, "Dynamic Batched Vertices Count")} \tTime: {GetCounterValue(f, "Dynamic Batching Time") * 1e-6:0.00}ms"); stringBuilder.Append($"\n(Static Batching)\t\tBatched Draw Calls: {GetCounterValueAsNumber(f, "Static Batched Draw Calls Count")} \tBatches: {GetCounterValueAsNumber(f, "Static Batches Count")} \tTriangles: {GetCounterValueAsNumber(f, "Static Batched Triangles Count")} \tVertices: {GetCounterValueAsNumber(f, "Static Batched Vertices Count")}"); stringBuilder.Append($"\n(Instancing)\t\tBatched Draw Calls: {GetCounterValueAsNumber(f, "Instanced Batched Draw Calls Count")} \tBatches: {GetCounterValueAsNumber(f, "Instanced Batches Count")} \tTriangles: {GetCounterValueAsNumber(f, "Instanced Batched Triangles Count")} \tVertices: {GetCounterValueAsNumber(f, "Instanced Batched Vertices Count")}"); stringBuilder.Append($"\nUsed Textures: {GetCounterValue(f, "Used Textures Count")} / {GetCounterValueAsBytes(f, "Used Textures Bytes")}"); stringBuilder.Append($"\nRender Textures: {GetCounterValue(f, "Render Textures Count")} / {GetCounterValueAsBytes(f, "Render Textures Bytes")}"); stringBuilder.Append($"\nRender Textures Changes: {GetCounterValue(f, "Render Textures Changes Count")}"); stringBuilder.Append($"\nUsed Buffers: {GetCounterValue(f, "Used Buffers Count")} / {GetCounterValueAsBytes(f, "Used Buffers Bytes")}"); stringBuilder.Append($"\nVertex Buffer Upload In Frame: {GetCounterValue(f, "Vertex Buffer Upload In Frame Count")} / {GetCounterValueAsBytes(f, "Vertex Buffer Upload In Frame Bytes")}"); stringBuilder.Append($"\nIndex Buffer Upload In Frame: {GetCounterValue(f, "Index Buffer Upload In Frame Count")} / {GetCounterValueAsBytes(f, "Index Buffer Upload In Frame Bytes")}"); stringBuilder.Append($"\nShadow Casters: {GetCounterValue(f, "Shadow Casters Count")}\n"); activeText = stringBuilder.ToString(); } else { // Old data compatibility. activeText = ProfilerDriver.GetOverviewText(ProfilerArea.Rendering, ProfilerWindow.GetActiveVisibleFrameIndex()); } } } float height = EditorStyles.wordWrappedLabel.CalcHeight(GUIContent.Temp(activeText), position.width); m_PaneScroll = GUILayout.BeginScrollView(m_PaneScroll, ProfilerWindow.Styles.background); EditorGUILayout.SelectableLabel(activeText, EditorStyles.wordWrappedLabel, GUILayout.MinHeight(height)); GUILayout.EndScrollView(); }
/// <summary> /// 打印内存数据 /// </summary> void PrintMemoryData() { var parent = Directory.GetParent(Application.dataPath); var directoryPath = parent.FullName + "/ProfilerData"; if (!Directory.Exists(directoryPath)) { Directory.CreateDirectory(directoryPath); } var outputPath = string.Format("{0}/ProfilerDetailed{1:yyyy_MM_dd_HH_mm_ss}.txt", directoryPath, DateTime.Now); File.Create(outputPath).Dispose(); if (null != memoryElement) { var writer = new StreamWriter(outputPath); ProfilerWindow.WriteMemoryDetail(writer, memoryElement); writer.Flush(); writer.Close(); } Process.Start(outputPath); }
private void ExtractMemory(float memSize, int memDepth) { var filterSize = memSize * 1024 * 1024; var parent = Directory.GetParent(Application.dataPath); var outputPath = string.Format("{0}/MemoryDetailed{1:yyyy_MM_dd_HH_mm_ss}.txt", parent.FullName, DateTime.Now); File.Create(outputPath).Dispose(); _memoryElementRoot = ProfilerWindow.GetMemoryDetailRoot(memDepth, filterSize); if (null != _memoryElementRoot) { var writer = new StreamWriter(outputPath); writer.WriteLine("Memory Size: >= {0}MB", _memorySize); writer.WriteLine("Memory Depth: {0}", _memoryDepth); writer.WriteLine("Current Target: {0}", ProfilerDriver.GetConnectionIdentifier(ProfilerDriver.connectedProfiler)); writer.WriteLine("**********************"); ProfilerWindow.WriteMemoryDetail(writer, _memoryElementRoot); writer.Flush(); writer.Close(); } Process.Start(outputPath); }
public void GetProfilerWindowHandle() { Profiler.BeginSample("GetProfilerWindowHandle"); #if UNITY_2021_1_OR_NEWER if (m_CpuProfilerModule != null) { m_CpuProfilerModule.selectionChanged -= OnSelectionChangedInCpuProfilerModule; m_CpuProfilerModule = null; } var windows = Resources.FindObjectsOfTypeAll <ProfilerWindow>(); if (windows != null && windows.Length > 0) { m_ProfilerWindow = windows[0]; } if (m_ProfilerWindow != null) { m_CpuProfilerModule = m_ProfilerWindow.GetFrameTimeViewSampleSelectionController(ProfilerWindow.cpuModuleName); m_CpuProfilerModule.selectionChanged -= OnSelectionChangedInCpuProfilerModule; m_CpuProfilerModule.selectionChanged += OnSelectionChangedInCpuProfilerModule; m_ProfilerWindow.Repaint(); m_ProfilerWindowInitialized = false; // wait a frame for the Profiler to get Repainted EditorApplication.delayCall += () => m_ProfilerWindowInitialized = true; } #else UnityEngine.Object[] windows = Resources.FindObjectsOfTypeAll(m_ProfilerWindowType); if (windows != null && windows.Length > 0) { m_ProfilerWindow = (EditorWindow)windows[0]; } m_ProfilerWindowInitialized = true; #endif Profiler.EndSample(); }
public override void CreateProfiler(ProfilerConfig config, int enabledTimeRulerLevels, int enabledPerformanceGraphLevels, int enabledProfilerSummaryLevels) { if (CreateUI == false) { return; } _profilerConfig = config; _profilerWindowViewModel = new ProfilerWindowViewModel(config.TimeRulerConfig.VisibleLevelsFlags, config.PerformanceGraphConfig.VisibleLevelsFlags, config.ProfilerSummaryConfig.VisibleLevelsFlags); _profilerWindowViewModel.ProfilerLevelChanged += (sender, args) => { OnLevelItemChanged(new LevelItemChangedEventArgs(args.Key, args.LevelId, args.Enabled)); }; _profilerWindow = new ProfilerWindow { DataContext = _profilerWindowViewModel, Padding = _windowPadding }; _profilerWindow.SizeChanged += (sender, args) => { _profilerConfig.Width = _profilerWindow.ActualWidth; _profilerConfig.Height = _profilerWindow.ActualHeight; }; var profilerTemplate = new DataTemplate(typeof(ProfilerWindowViewModel), parent => { _profilerWindow.Parent = parent; return(_profilerWindow); }); _gearsetUI.Resources.Add(profilerTemplate.DataTemplateKey, profilerTemplate); InitialiseWindow(_profilerWindowViewModel, config.Top, config.Left, config.Width, config.Height, config.Visible); _widgetWindowViewModel.ProfilerWindowVisible = config.Visible; }
private static void TakeSample() { ProfilerWindow.RefreshMemoryData(); }
public StandardDetailsViewController(ProfilerWindow profilerWindow, ProfilerCounterDescriptor[] counters) : base(profilerWindow) { m_Counters = counters; }
void OnGUI() { if (headStyle == null) { headStyle = new GUIStyle(); headStyle.fontSize = 15; headStyle.alignment = TextAnchor.MiddleCenter; headStyle.normal.textColor = new Color(0.8f, 0.8f, 0.8f); } EditorGUILayout.BeginHorizontal(); EditorGUILayout.BeginVertical(); EditorGUILayout.LabelField("注意取哪类数据时,请将Profiler切换到对应面板", EditorStyles.whiteLabel); // 采样一帧CPU 或 GPU 详细数据 sampleFrame = EditorGUILayout.IntSlider("Sample Current Frame", sampleFrame, ProfilerDriver.firstFrameIndex + 1, ProfilerDriver.lastFrameIndex - 2); EditorGUILayout.BeginHorizontal(); // 采样CPU if (GUILayout.Button("Sample CPU")) { ProfilerWindow.SetCurrentFrame(sampleFrame - 1); PrintDatas("CPU"); } // 采样GPU if (GUILayout.Button("Sample GPU")) { ProfilerWindow.SetCurrentFrame(sampleFrame - 1); PrintDatas("GPU"); } EditorGUILayout.EndHorizontal(); EditorGUILayout.Space(); EditorGUILayout.LabelField("Memory Filter(Save in the same directory as Assets)", EditorStyles.whiteLargeLabel); // 内存过滤条件 memorySize = EditorGUILayout.FloatField("Memory Size(MB) >= ", memorySize); memoryDepth = EditorGUILayout.IntField("Memory Depth(>=1)", memoryDepth); // 采集内存快照 if (GUILayout.Button("Get Memory Data(One Frame)")) { if (memoryDepth <= 0) { memoryDepth = 1; } ProfilerWindow.RefreshMemoryData(); ExtractMemory(memoryDepth, memorySize); } EditorGUILayout.Space(); EditorGUILayout.LabelField("所选区间内CPU耗时超过以下ms,绘制图像显示占用比例(每次改数值后要重新绘制)", EditorStyles.whiteLabel); EditorGUILayout.BeginHorizontal(); timeThreshold[0] = EditorGUILayout.FloatField("CPU耗时 >", timeThreshold[0]); timeThreshold[1] = EditorGUILayout.FloatField("CPU耗时 >", timeThreshold[1]); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); timeThreshold[2] = EditorGUILayout.FloatField("CPU耗时 >", timeThreshold[2]); timeThreshold[3] = EditorGUILayout.FloatField("CPU耗时 >", timeThreshold[3]); EditorGUILayout.EndHorizontal(); if (GUILayout.Button("Test")) { var list = ProfilerWindow.HighUsedFunc(beginFrame, endFrame, 100); Debug.Log(list.Count); Debug.Log(list[0].Count); } EditorGUILayout.EndVertical(); EditorGUILayout.BeginVertical(); // 采样一段时间内的CPU 和 GPU数据 EditorGUILayout.LabelField("Sample a piece of data", EditorStyles.whiteLargeLabel); beginFrame = EditorGUILayout.IntSlider("Begin Frame", beginFrame, ProfilerDriver.firstFrameIndex + 1, ProfilerDriver.lastFrameIndex - 2); endFrame = EditorGUILayout.IntSlider("End Frame", endFrame, ProfilerDriver.firstFrameIndex + 1, ProfilerDriver.lastFrameIndex - 2); EditorGUILayout.Space(); targetName = EditorGUILayout.TextField("目标区域/函数名: ", targetName); // 选择采集的数据 EditorGUILayout.LabelField("选择采集的数据", EditorStyles.whiteLabel); isSampleCPU = EditorGUILayout.Toggle("CPU", isSampleCPU); isSampleGPU = EditorGUILayout.Toggle("GPU", isSampleGPU); isSampleGC = EditorGUILayout.Toggle("GC", isSampleGC); isSampleFuncDetail = EditorGUILayout.Toggle("FunctionDetail", isSampleFuncDetail); EditorGUILayout.BeginHorizontal(); isPrintHighUsedFunc = EditorGUILayout.Toggle("PrintHighUsedFunc", isPrintHighUsedFunc); highFuncPorprotion = EditorGUILayout.FloatField("打印高耗时函数 >(%) ", highFuncPorprotion); EditorGUILayout.EndHorizontal(); if (GUILayout.Button("Save Data And Draw(begin - end)")) { SampleData(beginFrame, endFrame); } if (GUILayout.Button("Save Data And Draw(min - max)")) { SampleData(ProfilerDriver.firstFrameIndex + 1, ProfilerDriver.lastFrameIndex - 2); } if (GUILayout.Button("Clear Data")) { ClearAllData(); } EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); if (dataList.Count > 0) { DrawGraph(); } HandleEvent(); }
void DrawNetworkOperationsPane(Rect position) { SplitterGUILayout.BeginHorizontalSplit(m_NetworkSplit); var overviewLabel = GUIContent.Temp(ProfilerDriver.GetOverviewText(area, ProfilerWindow.GetActiveVisibleFrameIndex())); var labelRect = GUILayoutUtility.GetRect(overviewLabel, EditorStyles.wordWrappedLabel); GUI.Label(labelRect, overviewLabel, EditorStyles.wordWrappedLabel); m_PaneScroll = GUILayout.BeginScrollView(m_PaneScroll, ProfilerWindow.Styles.background); EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); EditorGUILayout.LabelField("Operation Detail"); EditorGUILayout.LabelField("Over 5 Ticks"); EditorGUILayout.LabelField("Over 10 Ticks"); EditorGUILayout.LabelField("Total"); EditorGUILayout.EndHorizontal(); EditorGUI.indentLevel += 1; for (short msgId = 0; msgId < msgNames.Length; msgId++) { #pragma warning disable CS0618 if (!NetworkDetailStats.m_NetworkOperations.ContainsKey(msgId)) #pragma warning restore { continue; } msgFoldouts[msgId] = EditorGUILayout.Foldout(msgFoldouts[msgId], msgNames[msgId] + ":"); if (msgFoldouts[msgId]) { EditorGUILayout.BeginVertical(); #pragma warning disable CS0618 var detail = NetworkDetailStats.m_NetworkOperations[msgId]; #pragma warning restore EditorGUI.indentLevel += 1; foreach (var entryName in detail.m_Entries.Keys) { int tick = (int)Time.time; var entry = detail.m_Entries[entryName]; if (entry.m_IncomingTotal > 0) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("IN:" + entryName); EditorGUILayout.LabelField(entry.m_IncomingSequence.GetFiveTick(tick).ToString()); EditorGUILayout.LabelField(entry.m_IncomingSequence.GetTenTick(tick).ToString()); EditorGUILayout.LabelField(entry.m_IncomingTotal.ToString()); EditorGUILayout.EndHorizontal(); } if (entry.m_OutgoingTotal > 0) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("OUT:" + entryName); EditorGUILayout.LabelField(entry.m_OutgoingSequence.GetFiveTick(tick).ToString()); EditorGUILayout.LabelField(entry.m_OutgoingSequence.GetTenTick(tick).ToString()); EditorGUILayout.LabelField(entry.m_OutgoingTotal.ToString()); EditorGUILayout.EndHorizontal(); } } EditorGUI.indentLevel -= 1; EditorGUILayout.EndVertical(); } } EditorGUI.indentLevel -= 1; GUILayout.EndScrollView(); SplitterGUILayout.EndHorizontalSplit(); // Draw separator var lineRect = new Rect(m_NetworkSplit.realSizes[0] + labelRect.xMin, position.y - EditorGUI.kWindowToolbarHeight - 1, 1, position.height + EditorGUI.kWindowToolbarHeight); EditorGUI.DrawRect(lineRect, s_SeparatorColor); }
public override void DrawDetailsView(Rect position) { m_PaneScroll = GUILayout.BeginScrollView(m_PaneScroll, ProfilerWindow.Styles.background); using (var frameData = ProfilerDriver.GetRawFrameDataView(ProfilerWindow.GetActiveVisibleFrameIndex(), 0)) { if (frameData.valid) { // Initialize the profiler markers. InitializeMarkers(frameData); bool newCountersAvailable = GetPhysicsCounterValue(frameData, "Total Queries") != -1; if (m_ShowStatsView == PhysicsProfilerStatsView.Current) { // Determine if the new counters are available by looking for a counter only available there. if (newCountersAvailable) { // Draw an alternate lined background to make following metrics on the same line easier. DrawAlternateBackground(position, m_PaneScroll, 10); long physicsMemoryUsed = GetCounterValue(frameData, "Physics Used Memory (2D)"); long totalUsedMemory = GetCounterValue(frameData, "Total Used Memory"); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Physics Used Memory", GUILayout.Width(k_labelWidthTitle)); EditorGUILayout.LabelField("| Total: " + GetCounterValueAsBytes(frameData, "Physics Used Memory (2D)"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField(string.Format("| Relative: {0:p2}", (float)physicsMemoryUsed / (float)totalUsedMemory), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Bodies", GUILayout.Width(k_labelWidthTitle)); EditorGUILayout.LabelField("| Total: " + GetPhysicsCounterValue(frameData, "Total Bodies"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Awake: " + GetPhysicsCounterValue(frameData, "Awake Bodies"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Asleep: " + GetPhysicsCounterValue(frameData, "Asleep Bodies"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Dynamic: " + GetPhysicsCounterValue(frameData, "Dynamic Bodies"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Kinematic: " + GetPhysicsCounterValue(frameData, "Kinematic Bodies"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Static: " + GetPhysicsCounterValue(frameData, "Static Bodies"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Discrete: " + GetPhysicsCounterValue(frameData, "Discrete Bodies"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Continuous: " + GetPhysicsCounterValue(frameData, "Continuous Bodies"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Shapes", GUILayout.Width(k_labelWidthTitle)); EditorGUILayout.LabelField("| Total: " + GetPhysicsCounterValue(frameData, "Total Shapes"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Awake: " + GetPhysicsCounterValue(frameData, "Awake Shapes"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Asleep: " + GetPhysicsCounterValue(frameData, "Asleep Shapes"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Dynamic: " + GetPhysicsCounterValue(frameData, "Dynamic Shapes"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Kinematic: " + GetPhysicsCounterValue(frameData, "Kinematic Shapes"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Static: " + GetPhysicsCounterValue(frameData, "Static Shapes"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Queries", GUILayout.Width(k_labelWidthTitle)); EditorGUILayout.LabelField("| Total: " + GetPhysicsCounterValue(frameData, "Total Queries"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Raycast: " + GetPhysicsCounterValue(frameData, "Raycast Queries"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Shapecast: " + GetPhysicsCounterValue(frameData, "Shapecast Queries"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Overlap: " + GetPhysicsCounterValue(frameData, "Overlap Queries"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| IsTouching: " + GetPhysicsCounterValue(frameData, "IsTouching Queries"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| GetContacts: " + GetPhysicsCounterValue(frameData, "GetContacts Queries"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Particle: " + GetPhysicsCounterValue(frameData, "Particle Queries"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Contacts", GUILayout.Width(k_labelWidthTitle)); EditorGUILayout.LabelField("| Total: " + GetPhysicsCounterValue(frameData, "Total Contacts"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Added: " + GetPhysicsCounterValue(frameData, "Added Contacts"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Removed: " + GetPhysicsCounterValue(frameData, "Removed Contacts"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Broadphase Updates: " + GetPhysicsCounterValue(frameData, "Broadphase Updates"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Broadphase Pairs: " + GetPhysicsCounterValue(frameData, "Broadphase Pairs"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Callbacks", GUILayout.Width(k_labelWidthTitle)); EditorGUILayout.LabelField("| Total: " + GetPhysicsCounterValue(frameData, "Total Callbacks"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Collision Enter: " + GetPhysicsCounterValue(frameData, "Collision Enter"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Collision Stay: " + GetPhysicsCounterValue(frameData, "Collision Stay"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Collision Exit: " + GetPhysicsCounterValue(frameData, "Collision Exit"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Trigger Enter: " + GetPhysicsCounterValue(frameData, "Trigger Enter"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Trigger Stay: " + GetPhysicsCounterValue(frameData, "Trigger Stay"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Trigger Exit: " + GetPhysicsCounterValue(frameData, "Trigger Exit"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Solver", GUILayout.Width(k_labelWidthTitle)); EditorGUILayout.LabelField("| World Count: " + GetPhysicsCounterValue(frameData, "Solver World Count"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Simulation Count: " + GetPhysicsCounterValue(frameData, "Solver Simulation Count"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Discrete Islands: " + GetPhysicsCounterValue(frameData, "Solver Discrete Islands"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Continuous Islands: " + GetPhysicsCounterValue(frameData, "Solver Continuous Islands"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Transform Sync", GUILayout.Width(k_labelWidthTitle)); EditorGUILayout.LabelField("| Sync Calls: " + GetPhysicsCounterValue(frameData, "Total Transform Sync Calls"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Sync Bodies: " + GetPhysicsCounterValue(frameData, "Transform Sync Bodies"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Sync Colliders: " + GetPhysicsCounterValue(frameData, "Transform Sync Colliders"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Parent Sync Bodies: " + GetPhysicsCounterValue(frameData, "Transform Parent Sync Bodies"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Parent Sync Colliders: " + GetPhysicsCounterValue(frameData, "Transform Parent Sync Colliders"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Joints", GUILayout.Width(k_labelWidthTitle)); EditorGUILayout.LabelField("| Total: " + GetPhysicsCounterValue(frameData, "Total Joints"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Timings", GUILayout.Width(k_labelWidthTitle)); EditorGUILayout.LabelField("| Sim: " + GetPhysicsSampleData(frameData, "Physics2D.Simulate"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Sync: " + GetPhysicsSampleData(frameData, "Physics2D.SyncTransformChanges"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Step: " + GetPhysicsSampleData(frameData, "Physics2D.Step"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Write: " + GetPhysicsSampleData(frameData, "Physics2D.UpdateTransforms"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.LabelField("| Callbacks: " + GetPhysicsSampleData(frameData, "Physics2D.CompileContactCallbacks"), GUILayout.Width(k_labelWidthDetail)); EditorGUILayout.EndHorizontal(); } else { EditorGUILayout.LabelField("Current Data not Available."); } } else { // Determine if the old counters are available by looking for a counter only available there. if (!newCountersAvailable) { // Old data compatibility. var activeText = ProfilerDriver.GetOverviewText(ProfilerArea.Physics2D, ProfilerWindow.GetActiveVisibleFrameIndex()); var height = EditorStyles.wordWrappedLabel.CalcHeight(GUIContent.Temp(activeText), position.width); EditorGUILayout.SelectableLabel(activeText, EditorStyles.wordWrappedLabel, GUILayout.MinHeight(height)); } else { EditorGUILayout.LabelField("Legacy Data not Available."); } } } } GUILayout.EndScrollView(); }
/// <summary> /// 应用程序当前状态的快照 /// </summary> void ExtractMemory(int depth, float size) { memoryElement = ProfilerWindow.GetMemoryDetail(depth, size * 1024 * 1024); PrintMemoryData(); }
public override void DrawDetailsView(Rect position) { if (NetworkingMessagesProfilerOverrides.drawDetailsViewOverride != null) { NetworkingMessagesProfilerOverrides.drawDetailsViewOverride.Invoke(position, ProfilerWindow.GetActiveVisibleFrameIndex()); } else { DrawDetailsViewText(position); } }
public AdaptivePerformanceDetailsViewController(ProfilerWindow profilerWindow) : base(profilerWindow) { }
/// <inheritdoc /> public override void OnInit() { Assert.IsNull(MainWindow); _windowsLayoutPath = StringUtils.CombinePaths(Globals.ProjectCacheFolder, "WindowsLayout.xml"); // Create main window var dpiScale = Platform.DpiScale; var settings = CreateWindowSettings.Default; settings.Title = "Flax Editor"; settings.Size = Platform.DesktopSize; settings.StartPosition = WindowStartPosition.CenterScreen; settings.ShowAfterFirstPaint = true; #if PLATFORM_WINDOWS if (!Editor.Instance.Options.Options.Interface.UseNativeWindowSystem) #endif { settings.HasBorder = false; #if PLATFORM_WINDOWS // Skip OS sizing frame and implement it using LeftButtonHit settings.HasSizingFrame = false; #endif } MainWindow = Platform.CreateWindow(ref settings); if (MainWindow == null) { // Error Editor.LogError("Failed to create editor main window!"); return; } UpdateWindowTitle(); // Link for main window events MainWindow.Closing += MainWindow_OnClosing; MainWindow.Closed += MainWindow_OnClosed; // Create default editor windows ContentWin = new ContentWindow(Editor); EditWin = new EditGameWindow(Editor); GameWin = new GameWindow(Editor); PropertiesWin = new PropertiesWindow(Editor); SceneWin = new SceneTreeWindow(Editor); DebugLogWin = new DebugLogWindow(Editor); OutputLogWin = new OutputLogWindow(Editor); ToolboxWin = new ToolboxWindow(Editor); GraphicsQualityWin = new GraphicsQualityWindow(Editor); GameCookerWin = new GameCookerWindow(Editor); ProfilerWin = new ProfilerWindow(Editor); EditorOptionsWin = new EditorOptionsWindow(Editor); PluginsWin = new PluginsWindow(Editor); VisualScriptDebuggerWin = new VisualScriptDebuggerWindow(Editor); // Bind events Level.SceneSaveError += OnSceneSaveError; Level.SceneLoaded += OnSceneLoaded; Level.SceneLoadError += OnSceneLoadError; Level.SceneLoading += OnSceneLoading; Level.SceneSaved += OnSceneSaved; Level.SceneSaving += OnSceneSaving; Level.SceneUnloaded += OnSceneUnloaded; Level.SceneUnloading += OnSceneUnloading; ScriptsBuilder.ScriptsReloadEnd += OnScriptsReloadEnd; Editor.StateMachine.StateChanged += OnEditorStateChanged; }
public LegacyDetailsViewController(ProfilerWindow profilerWindow, ProfilerModuleBase module) : base(profilerWindow) { m_Module = module; }