diff --git a/Runtime/GuruCore/Runtime/Ads/ADServiceBase.cs b/Runtime/GuruCore/Runtime/Ads/ADServiceBase.cs index c2d1f29..36f3efe 100644 --- a/Runtime/GuruCore/Runtime/Ads/ADServiceBase.cs +++ b/Runtime/GuruCore/Runtime/Ads/ADServiceBase.cs @@ -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); + }); } /// diff --git a/Runtime/GuruCore/Runtime/Firebase/FirebaseUtil.cs b/Runtime/GuruCore/Runtime/Firebase/FirebaseUtil.cs index 694b85d..587a985 100644 --- a/Runtime/GuruCore/Runtime/Firebase/FirebaseUtil.cs +++ b/Runtime/GuruCore/Runtime/Firebase/FirebaseUtil.cs @@ -28,6 +28,8 @@ namespace Guru _isDebug = isDebug; Analytics.InitAnalytics(); // 打点提前初始化 + Loom.StartUp(); // 确保主线程开启 + // 初始化 Fireabse 依赖 FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task => { DependencyStatus = task.Result; diff --git a/Runtime/Loom.meta b/Runtime/Loom.meta new file mode 100644 index 0000000..9b2557d --- /dev/null +++ b/Runtime/Loom.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 165040f3e03c40af8056aa631888b730 +timeCreated: 1712654380 \ No newline at end of file diff --git a/Runtime/Loom/Loom.cs b/Runtime/Loom/Loom.cs new file mode 100644 index 0000000..6a26ba7 --- /dev/null +++ b/Runtime/Loom/Loom.cs @@ -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(); + DontDestroyOnLoad(g); // 增加GO持久化 + } + + } + + private List _actions = new List(); + public struct DelayedQueueItem + { + public float time; + public Action action; + } + private List _delayed = new List(); + + List _currentDelayed = new List(); + + 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 _currentActions = new List(); + + // 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(); + } + } + + /// + /// 请在主线程内调用启动逻辑 + /// + public static void StartUp() + { + if (initialized || null != _current) return; + Initialize(); + } + } +} \ No newline at end of file diff --git a/Runtime/Loom/Loom.cs.meta b/Runtime/Loom/Loom.cs.meta new file mode 100644 index 0000000..1340bc0 --- /dev/null +++ b/Runtime/Loom/Loom.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e34dba6b5d6c4191a581f9ba57588e37 +timeCreated: 1704679694 \ No newline at end of file