Physx线程调研

来源:互联网 发布:剑侠情缘3捏脸数据成男 编辑:程序博客网 时间:2024/05/15 02:24
在服务器运行过程中,发现Physx线程竟然增加到了8个。非常奇怪。然后我对Physx的线程进行了一次调研,以了解这些线程的功能和这些线程是否可控。


1.Physx文档中涉及的线程有3种
a.Simulator线程。如果设置了NX_SF_SIMULATE_SEPARATE_THREAD会使得每个sence在simulator和fetchresult之间开启一个线程进行物理模拟。我们称之为模拟线程。如果不设置该标志则使用主线程进行模拟。
b.Work线程。如果设置了NX_SF_SIMULATE_SEPARATE_THREAD标志,可以通过设置internalThreadCount属性开启多个任务线程对Simulator的内容进行并行模拟。我们称之为工作线程
c.background线程。可以通过设置backgroundThreadCount设置该线程个数。该线程可以处理查询内容,已经GPU数据的预处理。我们称之为后台线程。

我们已经如下场景设置
sceneDesc.flags &= ~NX_SF_SIMULATE_SEPARATE_THREAD;
sceneDesc.internalThreadCount = 0;
sceneDesc.backgroundThreadCount = 0;
但是运行过程中,一开始就是2个线程,中间最高线程数5线程,过了1分钟左右又会降到2线程,并稳定在2线程。

2.在设置的基础上,设置Scheduler如下。但是Scheduler没有被调用。线程数照旧。
sceneDesc.backgroundThreadCount = 0;
sceneDesc.customScheduler = new Scheduler();

class Scheduler : public NxUserScheduler{public:Scheduler(){m_iSimulatorWork = 0;m_iBackWork = 0;}virtual void addTask(NxTask *task)           {           m_arTask.push_back(task);  m_iSimulatorWork++;}       virtual void addBackgroundTask(NxTask *task)            {            //Add task to background work queue.  m_arTask.push_back(task);m_iBackWork++;}        virtual void waitTasksComplete()            {           //Wait for all tasks in the work queue to complete.  while(m_bExcuting){;}return;}virtual void Tick(){m_bExcuting = true;for (std::vector<NxTask*>::iterator vIt = m_arTask.begin(); vIt != m_arTask.end(); vIt++){(*vIt)->execute();}m_bExcuting = false;}private:intm_iSimulatorWork;intm_iBackWork;boolm_bExcuting;std::vector<NxTask*> m_arTask;};


3.使用性能监测工具对线程CPU使用进行监测。发现主线程的CPU使用率和进程CPU使用率完全相同,其他的4个线程CPU使用率为0,context switch次数几乎为0.01-0.03次/s