Пример #1
0
        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
        }
Пример #2
0
        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
        }
Пример #3
0
	private static void AsyncUpdateCallback( object obj )
	{
		AmplifyMotion.MotionState state = ( AmplifyMotion.MotionState ) obj;
		state.AsyncUpdate();
	}