在服务器运行过程中,发现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();
3.使用性能监测工具对线程CPU使用进行监测。发现主线程的CPU使用率和进程CPU使用率完全相同,其他的4个线程CPU使用率为0,context switch次数几乎为0.01-0.03次/s
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:
int m_iSimulatorWork;
int m_iBackWork;
bool m_bExcuting;
std::vector<NxTask*> m_arTask;
};
3.使用性能监测工具对线程CPU使用进行监测。发现主线程的CPU使用率和进程CPU使用率完全相同,其他的4个线程CPU使用率为0,context switch次数几乎为0.01-0.03次/s