void ThreadBoost()
 {
     threadData = new List <ThreadDataSet>();
     for (int i = 0; i < _THREAD_COUNT; ++i)
     {
         ThreadDataSet data = new ThreadDataSet();
         Thread        t    = new Thread(new ParameterizedThreadStart(ThreadFunc));
         data.instance = t;
         data.threadId = i;
         threadData.Add(data);
         t.Start(i);
     }
 }
        void ThreadFunc(object threadId)
        {
            int           id   = (int)threadId;
            ThreadDataSet data = threadData[id];

            while (true)
            {
                if (data.isComplete)
                {
                    Thread.Sleep(3);
                }
                else
                {
                    bufferLock.EnterReadLock();
                    try
                    {
                        BufferType calDes      = BufferType.Buffer1;
                        List <int> _waitForDel = new List <int>();
                        if (!buffer1Complete && !buffer2Complete)
                        {
                            calDes = BufferType.Buffer1;
                        }
                        else if (buffer1Complete && !buffer2Complete)
                        {
                            calDes = BufferType.Buffer2;
                        }
                        else if (!buffer1Complete && buffer2Complete)
                        {
                            calDes = BufferType.Buffer1;
                        }
                        FduTransformObserver_Ex ob; int obId;
                        for (int i = 0; i < data.processIdList.Count; ++i)
                        {
                            obId = data.processIdList[i];
                            ob   = dataMap[obId].observer;
                            if (ob != null)
                            {
                                //watch out  这里代码写的不好 如果数值修改 这边判断条件也需要改变
                                if (ob.getObservedState(1)) //pos
                                {
                                    setPosBufferData(calDes, obId, FduInterpolationInterface_EX.getNextPosValue_Ex(getPosBufferData(getAnotherBuffer(calDes), obId), ob));
                                }
                                if (ob.getObservedState(2)) //rot
                                {
                                    setRotationBufferData(calDes, obId, FduInterpolationInterface_EX.getNextQuaternionValue_Ex(getRotateBufferData(getAnotherBuffer(calDes), obId), ob));
                                }
                                if (ob.getObservedState(3)) //scale
                                {
                                    setScaleBufferData(calDes, obId, FduInterpolationInterface_EX.getNextScaleValue_Ex(getScaleBufferData(getAnotherBuffer(calDes), obId), ob));
                                }
                            }
                            else
                            {
                                _waitForDel.Add(data.processIdList[i]);
                            }
                        }
                        foreach (int delId in _waitForDel)
                        {
                            data.processIdList.Remove(delId);
                        }
                        requestDeleteTransformObserver(_waitForDel.ToArray());
                        //Debug.Log("Cal Des:" + calDes.ToString() + " buffer1 : " + buffer1Complete + " buffer2: " +buffer2Complete + " task amount:" + data.processIdList.Count + " threadId " +id);
                    }
                    finally
                    {
                        data.isComplete = true;
                        bufferLock.ExitReadLock();
                        testProceeTime++;
                    }
                }
            }
        }