update: 添加 Loom 确保主线程运行数据计算

deeplink
胡宇飞 2024-04-09 17:25:22 +08:00
parent bc703d1e12
commit eb7b743146
5 changed files with 173 additions and 8 deletions

View File

@ -151,16 +151,20 @@ namespace Guru
{
if (adInfo == null) return;
// #1. ad_impression
OnAdImpression(adInfo);
// 在主线程中计算相关的收益值
Loom.QueueOnMainThread(() =>
{
// #1. ad_impression
OnAdImpression(adInfo);
// #2. tch_ad_rev_roas calculation
double revenue = adInfo.Revenue;
CalcTaichi001Value(revenue);
CalcTaichi02Value(revenue);
// #2. tch_ad_rev_roas calculation
double revenue = adInfo.Revenue;
CalcTaichi001Value(revenue);
CalcTaichi02Value(revenue);
// #3. Adjust ad_revenue
AdjustService.TrackADRevenue(adInfo);
// #3. Adjust ad_revenue
AdjustService.TrackADRevenue(adInfo);
});
}
/// <summary>

View File

@ -28,6 +28,8 @@ namespace Guru
_isDebug = isDebug;
Analytics.InitAnalytics(); // 打点提前初始化
Loom.StartUp(); // 确保主线程开启
// 初始化 Fireabse 依赖
FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task => {
DependencyStatus = task.Result;

3
Runtime/Loom.meta Normal file
View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 165040f3e03c40af8056aa631888b730
timeCreated: 1712654380

153
Runtime/Loom/Loom.cs Normal file
View File

@ -0,0 +1,153 @@
namespace Guru
{
using UnityEngine;
using System.Collections.Generic;
using System;
using System.Threading;
using System.Linq;
public class Loom : MonoBehaviour
{
public static int maxThreads = 8;
static int numThreads;
private static Loom _current;
private int _count;
public static Loom Current
{
get
{
Initialize();
return _current;
}
}
void Awake()
{
_current = this;
initialized = true;
}
static bool initialized;
static void Initialize()
{
if (!initialized)
{
if (!Application.isPlaying)
return;
initialized = true;
var g = new GameObject("Loom");
_current = g.AddComponent<Loom>();
DontDestroyOnLoad(g); // 增加GO持久化
}
}
private List<Action> _actions = new List<Action>();
public struct DelayedQueueItem
{
public float time;
public Action action;
}
private List<DelayedQueueItem> _delayed = new List<DelayedQueueItem>();
List<DelayedQueueItem> _currentDelayed = new List<DelayedQueueItem>();
public static void QueueOnMainThread(Action action)
{
QueueOnMainThread(action, 0f);
}
public static void QueueOnMainThread(Action action, float time)
{
if (time != 0)
{
lock (Current._delayed)
{
Current._delayed.Add(new DelayedQueueItem { time = Time.time + time, action = action });
}
}
else
{
lock (Current._actions)
{
Current._actions.Add(action);
}
}
}
public static Thread RunAsync(Action a)
{
Initialize();
while (numThreads >= maxThreads)
{
Thread.Sleep(1);
}
Interlocked.Increment(ref numThreads);
ThreadPool.QueueUserWorkItem(RunAction, a);
return null;
}
private static void RunAction(object action)
{
try
{
((Action)action)();
}
catch
{
}
finally
{
Interlocked.Decrement(ref numThreads);
}
}
void OnDisable()
{
if (_current == this)
{
_current = null;
}
}
List<Action> _currentActions = new List<Action>();
// Update is called once per frame
void Update()
{
lock (_actions)
{
_currentActions.Clear();
_currentActions.AddRange(_actions);
_actions.Clear();
}
foreach (var a in _currentActions)
{
a();
}
lock (_delayed)
{
_currentDelayed.Clear();
_currentDelayed.AddRange(_delayed.Where(d => d.time <= Time.time));
foreach (var item in _currentDelayed)
_delayed.Remove(item);
}
foreach (var delayed in _currentDelayed)
{
delayed.action();
}
}
/// <summary>
/// 请在主线程内调用启动逻辑
/// </summary>
public static void StartUp()
{
if (initialized || null != _current) return;
Initialize();
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: e34dba6b5d6c4191a581f9ba57588e37
timeCreated: 1704679694