update: 添加Loom工具, 保证逻辑都可以落在主线程
							parent
							
								
									d43689680f
								
							
						
					
					
						commit
						95f32b1c33
					
				|  | @ -1,3 +1,5 @@ | ||||||
|  | using System.Threading; | ||||||
|  | 
 | ||||||
| namespace Guru | namespace Guru | ||||||
| { | { | ||||||
| 	using UnityEngine; | 	using UnityEngine; | ||||||
|  | @ -55,11 +57,22 @@ namespace Guru | ||||||
| 			 | 			 | ||||||
| 			// 缓存标准属性 | 			// 缓存标准属性 | ||||||
| 			StandardProperties.AdjustId = Adjust.getAdid(); // 获取AdjustID | 			StandardProperties.AdjustId = Adjust.getAdid(); // 获取AdjustID | ||||||
| 			Adjust.getGoogleAdId(gid => | 
 | ||||||
|  | 			Loom.RunAsync(() => | ||||||
| 			{ | 			{ | ||||||
| 				if (!string.IsNullOrEmpty(gid)) StandardProperties.GoogleAdId = gid; // 获取Google AD ID  | 				Adjust.getGoogleAdId(gid => | ||||||
|  | 				{ | ||||||
|  | 					if (!string.IsNullOrEmpty(gid)) | ||||||
|  | 					{ | ||||||
|  | 						Loom.QueueOnMainThread(() => | ||||||
|  | 						{ | ||||||
|  | 							StandardProperties.GoogleAdId = gid; // 获取Google AD ID  | ||||||
|  | 						}); | ||||||
|  | 					} | ||||||
|  | 				}); | ||||||
| 			}); | 			}); | ||||||
| 		} | 		} | ||||||
|  | 		 | ||||||
| 
 | 
 | ||||||
| 		/// <summary> | 		/// <summary> | ||||||
| 		/// 确保 Adjust 实例在场景中 | 		/// 确保 Adjust 实例在场景中 | ||||||
|  |  | ||||||
|  | @ -10,6 +10,8 @@ namespace Guru | ||||||
|     using Firebase.RemoteConfig; |     using Firebase.RemoteConfig; | ||||||
|     using Firebase.Extensions; |     using Firebase.Extensions; | ||||||
|      |      | ||||||
|  |      | ||||||
|  |      | ||||||
|     /// <summary> |     /// <summary> | ||||||
|     /// 运控配置管理器 |     /// 运控配置管理器 | ||||||
|     /// </summary> |     /// </summary> | ||||||
|  |  | ||||||
|  | @ -0,0 +1,3 @@ | ||||||
|  | fileFormatVersion: 2 | ||||||
|  | guid: 27b0011206f347d6869a8ff7e7a4d380 | ||||||
|  | timeCreated: 1704679689 | ||||||
|  | @ -0,0 +1,143 @@ | ||||||
|  | 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>(); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		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(); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,3 @@ | ||||||
|  | fileFormatVersion: 2 | ||||||
|  | guid: e34dba6b5d6c4191a581f9ba57588e37 | ||||||
|  | timeCreated: 1704679694 | ||||||
		Loading…
	
		Reference in New Issue