Skip to content

Update to HDRP Asset analytics #6060

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Oct 19, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 102 additions & 10 deletions com.unity.render-pipelines.high-definition/Editor/HDAnalytics.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using UnityEngine.Rendering.HighDefinition;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEngine.Rendering;

namespace UnityEditor.Rendering.HighDefinition
{
Expand All @@ -14,17 +15,23 @@ class HDAnalytics : IPostprocessBuildWithReport
const int k_MaxEventsPerHour = 10;
const int k_MaxNumberOfElements = 1000;
const string k_VendorKey = "unity.hdrp";
const string k_EventName = "uHDRPUsage";
const int k_UsageCurrentVersion = 2;
const string k_UsageEventName = "uHDRPUsage";
const string k_DefaultsEventName = "uHDRPDefaults";

public int callbackOrder { get; }

struct EventData
struct UsageEventData
{
// Naming convention for analytics data
public string build_target;
public string asset_guid;
public string[] changed_settings;

public EventData(Dictionary<string, string> diff)
public UsageEventData(BuildTarget buildTarget, string assetGUID, Dictionary<string, string> diff)
{
build_target = $@"{buildTarget}";
asset_guid = assetGUID;
changed_settings = new string[diff.Count];

int i = 0;
Expand All @@ -33,6 +40,21 @@ public EventData(Dictionary<string, string> diff)
}
}

struct DefaultsEventData
{
// Naming convention for analytics data
public string[] default_settings;

public DefaultsEventData(Dictionary<string, string> defaults)
{
default_settings = new string[defaults.Count];

int i = 0;
foreach (var d in defaults)
default_settings[i++] = $@"{{""{d.Key}"":""{d.Value}""}}";
}
}

public void OnPostprocessBuild(BuildReport report)
{
SendEvent();
Expand All @@ -43,19 +65,40 @@ public static void SendEvent()
if (!EditorAnalytics.enabled)
return;

var hdrpAsset = HDRenderPipeline.currentAsset;
if (hdrpAsset == null)
var activeBuildTarget = EditorUserBuildSettings.activeBuildTarget;

var qualityLevelCount = QualitySettings.names.Length;
for (int i = 0; i < QualitySettings.names.Length; ++i)
{
var hdrpAsset = QualitySettings.GetRenderPipelineAssetAt(i) as HDRenderPipelineAsset;
if (hdrpAsset != null)
{
if (EditorAnalytics.RegisterEventWithLimit(k_UsageEventName, k_MaxEventsPerHour, k_MaxNumberOfElements, k_VendorKey, k_UsageCurrentVersion) != AnalyticsResult.Ok)
continue;

RenderPipelineSettings settings = hdrpAsset.currentPlatformRenderPipelineSettings;
RenderPipelineSettings defaults = RenderPipelineSettings.NewDefault();

var guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(hdrpAsset.GetInstanceID()));
var data = new UsageEventData(activeBuildTarget, guid, DiffSettings(settings, defaults));

EditorAnalytics.SendEventWithLimit(k_UsageEventName, data, k_UsageCurrentVersion);
}
}
}

public static void SendDefaultValuesEvent()
{
if (!EditorAnalytics.enabled)
return;

if (EditorAnalytics.RegisterEventWithLimit(k_EventName, k_MaxEventsPerHour, k_MaxNumberOfElements, k_VendorKey) != AnalyticsResult.Ok)
if (EditorAnalytics.RegisterEventWithLimit(k_DefaultsEventName, k_MaxEventsPerHour, k_MaxNumberOfElements, k_VendorKey) != AnalyticsResult.Ok)
return;

RenderPipelineSettings settings = hdrpAsset.currentPlatformRenderPipelineSettings;
RenderPipelineSettings defaults = RenderPipelineSettings.NewDefault();

var data = new EventData(DiffSettings(settings, defaults));

EditorAnalytics.SendEventWithLimit(k_EventName, data);
var data = new DefaultsEventData(AllSettings(defaults));
EditorAnalytics.SendEventWithLimit(k_DefaultsEventName, data);
}

// Helpers to get changed settings as JSON
Expand Down Expand Up @@ -105,6 +148,47 @@ static Dictionary<string, string> DiffSettings(object a, object b)
return diff;
}

static Dictionary<string, string> AllSettings(object a)
{
var allValues = new Dictionary<string, string>();
var fields = a.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public);
foreach (var field in fields)
{
var va = field.GetValue(a);

var t = field.FieldType;
if (t == typeof(string))
continue;
if (t.IsPrimitive || t.IsEnum)
{
allValues[field.Name] = va.ToString();
}
else if (t.IsArray)
{
allValues[field.Name] = ArrayToJson(va);
}
else
{
if (t == typeof(IntScalableSetting) || t == typeof(FloatScalableSetting))
{
var values = t.BaseType.GetField("m_Values", BindingFlags.NonPublic | BindingFlags.Instance);
va = values.GetValue(va);
allValues[field.Name] = ArrayToJson(va);
}
else if (t.IsClass || t.IsValueType)
{
var subdiff = AllSettings(va);
foreach (var d in subdiff)
{
allValues[field.Name + "." + d.Key] = d.Value;
}
}
}
}

return allValues;
}

static bool DiffArray(object a, object b)
{
var va = (System.Collections.IList)a;
Expand All @@ -131,5 +215,13 @@ static string ArrayToJson(object array)
}
return sb.ToString();
}

// Commented out on purpose.
// We only need to send this event manually when we add new members or change values of the HDRP asset.
//[MenuItem("Edit/Rendering/Generate HDRP default values analytics", priority = CoreUtils.Sections.section4)]
//static void GenerateDefaultValues()
//{
// SendDefaultValuesEvent();
//}
}
}