internal void EnqueueAsyncUpdate(AmplifyMotion.MotionState state) { #if NETFX_CORE Task.Run(() => AsyncUpdateCallback(state)); #elif UNITY_WEBGL AsyncUpdateCallback(state); #else if (!m_threadPoolFallback) { lock (m_threadStateQueueLocks[m_threadPoolIndex]) { m_threadStateQueues[m_threadPoolIndex].Enqueue(state); } m_threadPoolContinueSignals[m_threadPoolIndex].Set(); m_threadPoolIndex++; if (m_threadPoolIndex >= m_threadPoolSize) { m_threadPoolIndex = 0; } } else { ThreadPool.QueueUserWorkItem(new WaitCallback(AsyncUpdateCallback), state); } #endif }
private static void AsyncUpdateThread(object obj) { #if !NETFX_CORE && !UNITY_WEBGL KeyValuePair <object, int> pair = (KeyValuePair <object, int>)obj; WorkerThreadPool pool = ( WorkerThreadPool )pair.Key; int id = ( int )pair.Value; while (true) { try { pool.m_threadPoolContinueSignals[id].WaitOne(); if (pool.m_threadPoolTerminateSignal.WaitOne(0)) { break; } while (true) { AmplifyMotion.MotionState state = null; lock (pool.m_threadStateQueueLocks[id]) { if (pool.m_threadStateQueues[id].Count > 0) { state = pool.m_threadStateQueues[id].Dequeue(); } } if (state != null) { state.AsyncUpdate(); } else { break; } } } catch (System.Exception e) { if (e.GetType() != typeof(ThreadAbortException)) { Debug.LogWarning(e); } } } #endif }
private static void AsyncUpdateCallback( object obj ) { AmplifyMotion.MotionState state = ( AmplifyMotion.MotionState ) obj; state.AsyncUpdate(); }