| using System; |
| using System.Collections.Generic; |
| using UnityEditor.Analytics; |
| using UnityEngine; |
| using UnityEngine.Analytics; |
|
|
| namespace UnityEditor.Performance.ProfileAnalyzer |
| { |
| class ProfileAnalyzerAnalytics |
| { |
| const int k_MaxEventsPerHour = 100; |
| const int k_MaxEventItems = 1000; |
| const string k_VendorKey = "unity.profileanalyzer"; |
| const string k_EventTopicName = "usability"; |
|
|
| static bool s_EnableAnalytics = false; |
|
|
| public static void EnableAnalytics() |
| { |
| AnalyticsResult result = EditorAnalytics.RegisterEventWithLimit(k_EventTopicName, k_MaxEventsPerHour, k_MaxEventItems, k_VendorKey); |
| if (result == AnalyticsResult.Ok) |
| s_EnableAnalytics = true; |
| } |
|
|
| public enum UIButton |
| { |
| Pull, |
| OpenProfiler, |
| CloseProfiler, |
| JumpToFrame, |
| ExportSingleFrames, |
| ExportComparisonFrames, |
| }; |
|
|
| public enum UIUsageMode |
| { |
| Single, |
| Comparison, |
| }; |
|
|
| public enum UIVisibility |
| { |
| FrameTimeContextMenu, |
| Filters, |
| TopTen, |
| Frames, |
| Threads, |
| Markers, |
| }; |
|
|
| public enum UIResizeView |
| { |
| Single, |
| Comparison, |
| }; |
|
|
|
|
| [Serializable] |
| struct ProfileAnalyzerUIButtonEventParameters |
| { |
| public string name; |
|
|
| public ProfileAnalyzerUIButtonEventParameters(string name) |
| { |
| this.name = name; |
| } |
| } |
|
|
| |
| [Serializable] |
| struct ProfileAnalyzerUIButtonEvent |
| { |
| public ProfileAnalyzerUIButtonEvent(string name, float durationInTicks) |
| { |
| subtype = "profileAnalyzerUIButton"; |
|
|
| |
| |
| this.duration = durationInTicks; |
|
|
| parameters = new ProfileAnalyzerUIButtonEventParameters(name); |
| } |
|
|
| public string subtype; |
| |
| public float duration; |
| public ProfileAnalyzerUIButtonEventParameters parameters; |
| } |
|
|
| [Serializable] |
| struct ProfileAnalyzerUIUsageEventParameters |
| { |
| public string name; |
|
|
| public ProfileAnalyzerUIUsageEventParameters(string name) |
| { |
| this.name = name; |
| } |
| } |
|
|
| [Serializable] |
| struct ProfileAnalyzerUIUsageEvent |
| { |
| public ProfileAnalyzerUIUsageEvent(string name, float durationInTicks) |
| { |
| subtype = "profileAnalyzerModeUsage"; |
|
|
| this.duration = durationInTicks; |
|
|
| parameters = new ProfileAnalyzerUIUsageEventParameters(name); |
| } |
|
|
| public string subtype; |
| public float duration; |
| public ProfileAnalyzerUIUsageEventParameters parameters; |
| } |
|
|
| [Serializable] |
| struct ProfileAnalyzerUIVisibilityEventParameters |
| { |
| public string name; |
| public bool show; |
|
|
| public ProfileAnalyzerUIVisibilityEventParameters(string name, bool show) |
| { |
| this.name = name; |
| this.show = show; |
| } |
| } |
|
|
| [Serializable] |
| struct ProfileAnalyzerUIVisibilityEvent |
| { |
| public ProfileAnalyzerUIVisibilityEvent(string name, float durationInTicks, bool show) |
| { |
| subtype = "profileAnalyzerUIVisibility"; |
|
|
| this.duration = durationInTicks; |
|
|
| parameters = new ProfileAnalyzerUIVisibilityEventParameters(name, show); |
| } |
|
|
| public string subtype; |
| public float duration; |
| public ProfileAnalyzerUIVisibilityEventParameters parameters; |
| } |
|
|
| [Serializable] |
| struct ProfileAnalyzerUIResizeEventParameters |
| { |
| public string name; |
| public float width; |
| public float height; |
| public float screenWidth; |
| public float screenHeight; |
| public bool docked; |
|
|
| public ProfileAnalyzerUIResizeEventParameters(string name, float width, float height, float screenWidth, float screenHeight, bool isDocked) |
| { |
| this.name = name; |
| this.width = width; |
| this.height = height; |
| this.screenWidth = screenWidth; |
| this.screenHeight = screenHeight; |
| docked = isDocked; |
| } |
| } |
|
|
| [Serializable] |
| struct ProfileAnalyzerUIResizeEvent |
| { |
| public ProfileAnalyzerUIResizeEvent(string name, float durationInTicks, float width, float height, float screenWidth, float screenHeight, bool isDocked) |
| { |
| subtype = "profileAnalyzerUIResize"; |
|
|
| this.duration = durationInTicks; |
|
|
| parameters = new ProfileAnalyzerUIResizeEventParameters(name, width, height, screenWidth, screenHeight, isDocked); |
| } |
|
|
| public string subtype; |
| public float duration; |
| public ProfileAnalyzerUIResizeEventParameters parameters; |
| } |
|
|
| static float SecondsToTicks(float durationInSeconds) |
| { |
| return durationInSeconds * 10000; |
| } |
|
|
| public static bool SendUIButtonEvent(UIButton uiButton, float durationInSeconds) |
| { |
| if (!s_EnableAnalytics) |
| return false; |
|
|
| |
| float durationInTicks = SecondsToTicks(durationInSeconds); |
|
|
| ProfileAnalyzerUIButtonEvent uiButtonEvent; |
| switch (uiButton) |
| { |
| case UIButton.Pull: |
| uiButtonEvent = new ProfileAnalyzerUIButtonEvent("profilerAnalyzerGrab", durationInTicks); |
| break; |
| case UIButton.OpenProfiler: |
| uiButtonEvent = new ProfileAnalyzerUIButtonEvent("profilerAnalyzerOpenProfiler", durationInTicks); |
| break; |
| case UIButton.CloseProfiler: |
| uiButtonEvent = new ProfileAnalyzerUIButtonEvent("profilerAnalyzerCloseProfiler", durationInTicks); |
| break; |
| case UIButton.JumpToFrame: |
| uiButtonEvent = new ProfileAnalyzerUIButtonEvent("profilerAnalyzerJumpToFrame", durationInTicks); |
| break; |
| case UIButton.ExportSingleFrames: |
| uiButtonEvent = new ProfileAnalyzerUIButtonEvent("profilerAnalyzerExportSingleFrames", durationInTicks); |
| break; |
| case UIButton.ExportComparisonFrames: |
| uiButtonEvent = new ProfileAnalyzerUIButtonEvent("profilerAnalyzerExportComparisonFrames", durationInTicks); |
| break; |
| default: |
| Debug.LogFormat("SendUIButtonEvent: Unsupported button type : {0}", uiButton); |
| return false; |
| } |
|
|
|
|
| AnalyticsResult result = EditorAnalytics.SendEventWithLimit(k_EventTopicName, uiButtonEvent); |
| if (result != AnalyticsResult.Ok) |
| return false; |
|
|
| return true; |
| } |
|
|
| public static bool SendUIUsageModeEvent(UIUsageMode uiUsageMode, float durationInSeconds) |
| { |
| if (!s_EnableAnalytics) |
| return false; |
|
|
| |
| float durationInTicks = SecondsToTicks(durationInSeconds); |
|
|
| ProfileAnalyzerUIUsageEvent uiUsageEvent; |
| switch (uiUsageMode) |
| { |
| case UIUsageMode.Single: |
| uiUsageEvent = new ProfileAnalyzerUIUsageEvent("profileAnalyzerSingle", durationInTicks); |
| break; |
| case UIUsageMode.Comparison: |
| uiUsageEvent = new ProfileAnalyzerUIUsageEvent("profileAnalyzerCompare", durationInTicks); |
| break; |
| default: |
| Debug.LogFormat("SendUsageEvent: Unsupported usage mode : {0}", uiUsageMode); |
| return false; |
| } |
|
|
|
|
| AnalyticsResult result = EditorAnalytics.SendEventWithLimit(k_EventTopicName, uiUsageEvent); |
| if (result != AnalyticsResult.Ok) |
| return false; |
|
|
| return true; |
| } |
|
|
| public static bool SendUIVisibilityEvent(UIVisibility uiVisibility, float durationInSeconds, bool show) |
| { |
| if (!s_EnableAnalytics) |
| return false; |
|
|
| |
| float durationInTicks = SecondsToTicks(durationInSeconds); |
|
|
| ProfileAnalyzerUIVisibilityEvent uiUsageEvent; |
| switch (uiVisibility) |
| { |
| case UIVisibility.FrameTimeContextMenu: |
| uiUsageEvent = new ProfileAnalyzerUIVisibilityEvent("profilerAnalyzerFrameTimeContextMenu", durationInTicks, show); |
| break; |
| case UIVisibility.Filters: |
| uiUsageEvent = new ProfileAnalyzerUIVisibilityEvent("profilerAnalyzerFilters", durationInTicks, show); |
| break; |
| case UIVisibility.TopTen: |
| uiUsageEvent = new ProfileAnalyzerUIVisibilityEvent("profilerAnalyzerTopTen", durationInTicks, show); |
| break; |
| case UIVisibility.Frames: |
| uiUsageEvent = new ProfileAnalyzerUIVisibilityEvent("profilerAnalyzerFrames", durationInTicks, show); |
| break; |
| case UIVisibility.Threads: |
| uiUsageEvent = new ProfileAnalyzerUIVisibilityEvent("profilerAnalyzerThreads", durationInTicks, show); |
| break; |
| case UIVisibility.Markers: |
| uiUsageEvent = new ProfileAnalyzerUIVisibilityEvent("profilerAnalyzerMarkers", durationInTicks, show); |
| break; |
| default: |
| Debug.LogFormat("SendUIVisibilityEvent: Unsupported visibililty item : {0}", uiVisibility); |
| return false; |
| } |
|
|
| AnalyticsResult result = EditorAnalytics.SendEventWithLimit(k_EventTopicName, uiUsageEvent); |
| if (result != AnalyticsResult.Ok) |
| return false; |
|
|
| return true; |
| } |
|
|
| public static bool SendUIResizeEvent(UIResizeView uiResizeView, float durationInSeconds, float width, float height, bool isDocked) |
| { |
| if (!s_EnableAnalytics) |
| return false; |
|
|
| |
| float durationInTicks = SecondsToTicks(durationInSeconds); |
|
|
| ProfileAnalyzerUIResizeEvent uiResizeEvent; |
| switch (uiResizeView) |
| { |
| case UIResizeView.Single: |
| |
| uiResizeEvent = new ProfileAnalyzerUIResizeEvent("profileAnalyzerSingle", durationInTicks, width, height, Screen.currentResolution.width, Screen.currentResolution.height, isDocked); |
| break; |
| case UIResizeView.Comparison: |
| uiResizeEvent = new ProfileAnalyzerUIResizeEvent("profileAnalyzerCompare", durationInTicks, width, height, Screen.currentResolution.width, Screen.currentResolution.height, isDocked); |
| break; |
| default: |
| Debug.LogFormat("SendUIResizeEvent: Unsupported view : {0}", uiResizeView); |
| return false; |
| } |
|
|
| AnalyticsResult result = EditorAnalytics.SendEventWithLimit(k_EventTopicName, uiResizeEvent); |
| if (result != AnalyticsResult.Ok) |
| return false; |
|
|
| return true; |
| } |
|
|
| internal class Analytic |
| { |
| double m_StartTime; |
| float m_DurationInSeconds; |
|
|
| public Analytic() |
| { |
| m_StartTime = EditorApplication.timeSinceStartup; |
| m_DurationInSeconds = 0; |
| } |
|
|
| public void End() |
| { |
| m_DurationInSeconds = (float)(EditorApplication.timeSinceStartup - m_StartTime); |
| } |
|
|
| public float GetDurationInSeconds() |
| { |
| return m_DurationInSeconds; |
| } |
| } |
|
|
| static public Analytic BeginAnalytic() |
| { |
| return new Analytic(); |
| } |
|
|
| static public void SendUIButtonEvent(UIButton uiButton, Analytic instance) |
| { |
| instance.End(); |
| SendUIButtonEvent(uiButton, instance.GetDurationInSeconds()); |
| } |
|
|
| static public void SendUIUsageModeEvent(UIUsageMode uiUsageMode, Analytic instance) |
| { |
| instance.End(); |
| SendUIUsageModeEvent(uiUsageMode, instance.GetDurationInSeconds()); |
| } |
| } |
| } |
|
|