From eb7b743146aafc321063f051c1f1bba9df40e0d5 Mon Sep 17 00:00:00 2001 From: huyufei Date: Tue, 9 Apr 2024 17:25:22 +0800 Subject: [PATCH] =?UTF-8?q?update:=20=E6=B7=BB=E5=8A=A0=20Loom=20=E7=A1=AE?= =?UTF-8?q?=E4=BF=9D=E4=B8=BB=E7=BA=BF=E7=A8=8B=E8=BF=90=E8=A1=8C=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/GuruCore/Runtime/Ads/ADServiceBase.cs | 20 ++- .../GuruCore/Runtime/Firebase/FirebaseUtil.cs | 2 + Runtime/Loom.meta | 3 + Runtime/Loom/Loom.cs | 153 ++++++++++++++++++ Runtime/Loom/Loom.cs.meta | 3 + 5 files changed, 173 insertions(+), 8 deletions(-) create mode 100644 Runtime/Loom.meta create mode 100644 Runtime/Loom/Loom.cs create mode 100644 Runtime/Loom/Loom.cs.meta 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