update: 添加 Loom 确保主线程运行数据计算
							parent
							
								
									bc703d1e12
								
							
						
					
					
						commit
						eb7b743146
					
				|  | @ -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> | ||||
|  |  | |||
|  | @ -28,6 +28,8 @@ namespace Guru | |||
| 			_isDebug = isDebug; | ||||
| 			Analytics.InitAnalytics(); // 打点提前初始化 | ||||
| 			 | ||||
| 			Loom.StartUp(); // 确保主线程开启 | ||||
| 			 | ||||
| 			// 初始化 Fireabse 依赖 | ||||
| 			FirebaseApp.CheckAndFixDependenciesAsync().ContinueWithOnMainThread(task => { | ||||
| 				DependencyStatus = task.Result; | ||||
|  |  | |||
|  | @ -0,0 +1,3 @@ | |||
| fileFormatVersion: 2 | ||||
| guid: 165040f3e03c40af8056aa631888b730 | ||||
| timeCreated: 1712654380 | ||||
|  | @ -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(); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | @ -0,0 +1,3 @@ | |||
| fileFormatVersion: 2 | ||||
| guid: e34dba6b5d6c4191a581f9ba57588e37 | ||||
| timeCreated: 1704679694 | ||||
		Loading…
	
		Reference in New Issue