#if UNITY_EDITOR && ENABLE_CLOUD_SERVICES_ANALYTICS #define ENABLE_UNITY_COLLECTIONS_ANALYTICS #endif using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using Unity.Burst; namespace Unity.Collections { internal struct Telemetry { public enum Action { CreateAllocator, DestroyAllocator } [Serializable] internal struct Event { public Action action; public string typeName; } const string k_VendorKey = "unity.collections"; const string k_EventTopicName = "collectionsAllocators"; const int k_MaxEventsPerHour = 1000; const int k_MaxNumberOfElements = 1000; const int k_Version = 1; #if ENABLE_UNITY_COLLECTIONS_ANALYTICS static bool s_EventsRegistered = false; #endif #if ENABLE_UNITY_COLLECTIONS_ANALYTICS /// /// Track only allocator type names for allocators that have been registered here. /// internal static readonly HashSet AllocatorTypesToTrack = new HashSet { typeof(RewindableAllocator), typeof(AutoFreeAllocator) }; #endif [BurstDiscard] internal static void SendEvent(Action action) where T : unmanaged { #if ENABLE_UNITY_COLLECTIONS_ANALYTICS if(!UnityEngine.Analytics.Analytics.enabled) return; if (!s_EventsRegistered) RegisterTelemetryEvents(); var typeName = AllocatorTypesToTrack.Contains(typeof(T)) ? typeof(T).Name : "unregistered"; var parameters = new Event{action=action,typeName=typeName}; UnityEngine.Analytics.Analytics.SendEvent(k_EventTopicName, parameters, k_Version); #endif } static void RegisterTelemetryEvents() { #if ENABLE_UNITY_COLLECTIONS_ANALYTICS UnityEngine.Analytics.Analytics.RegisterEvent(k_EventTopicName, k_MaxEventsPerHour, k_MaxNumberOfElements, k_VendorKey, k_Version); UnityEditor.EditorAnalytics.RegisterEventWithLimit(k_Event_MenuPreferences, k_MaxEventsPerHour, k_MaxNumberOfElements, k_VendorKey); s_EventsRegistered = true; #endif } #if UNITY_EDITOR internal struct MenuPreferencesEvent { public bool enableJobsDebugger; public bool useJobsThreads; public NativeLeakDetectionMode nativeLeakDetectionMode; } const string k_Event_MenuPreferences = "collectionsMenuPreferences"; internal static void LogMenuPreferences(MenuPreferencesEvent value) { SendEditorEvent(k_Event_MenuPreferences, value); } private static void SendEditorEvent(string eventName, T eventData) where T : unmanaged { #if ENABLE_UNITY_COLLECTIONS_ANALYTICS if (!s_EventsRegistered) RegisterTelemetryEvents(); UnityEditor.EditorAnalytics.SendEventWithLimit(eventName, eventData, k_Version); #endif } #endif } }