osg 3.6.2中ViewerBase类suggestBestThreadingModel()函数如下:
ViewerBase::ThreadingModel ViewerBase::suggestBestThreadingModel()
{
std::string str;
if (osg::getEnvVar("OSG_THREADING", str))
{
if (str=="SingleThreaded") return SingleThreaded;
else if (str=="CullDrawThreadPerContext") return CullDrawThreadPerContext;
else if (str=="DrawThreadPerContext") return DrawThreadPerContext;
else if (str=="CullThreadPerCameraDrawThreadPerContext") return CullThreadPerCameraDrawThreadPerContext;
}
Contexts contexts;
getContexts(contexts);
if (contexts.empty()) return SingleThreaded;
#if 0
// temporary hack to disable multi-threading under Windows till we find good solutions for
// crashes that users are seeing.
return SingleThreaded;
#endif
Cameras cameras;
getCameras(cameras);
if (cameras.empty()) return SingleThreaded;
int numProcessors = OpenThreads::GetNumberOfProcessors();
if (contexts.size()==1)
{
if (numProcessors==1) return SingleThreaded;
else return DrawThreadPerContext;
}
#if 1
if (numProcessors >= static_cast<int>(cameras.size()+contexts.size()))
{
return CullThreadPerCameraDrawThreadPerContext;
}
#endif
return DrawThreadPerContext;
}
在理解本函数之前,需先学习OSG多线程模型博文,以知道各个线程模型的含义及区别。
suggestBestThreadingModel 函数可以帮助用户决定采用什么样的线程模型,基本的判断原则如下:
- 如果定义了环境变量 OSG_THREADING,且其中内容为“SingleThreaded”、“CullDrawThreadPerContext”、“CullThreadPerCameraDrawThreadPerContext”、 “DrawThreadPerContext”四个字符串中的一个,则采用对应的模型。
- 如果当前不存在图形设备或者摄像机,则采用SingleThreaded模型。
- 如果当前只存在一个图形窗口(这是最常见的情况),则采用SingleThreaded模型(单 核)或DrawThreadPerContext 模型(多核)。
- 如果系统CPU数超过当前图形设备和摄像机数总合,为了充分发挥每个CPU的能力,将采用CullThreadPerCameraDrawThreadPerContext 模型。
- 以上情形均不符合时,采用DrawThreadPerContext模型。
可见,对于目前流行的多核系统而言,CullThreadPerCameraDrawThreadPerContext 和 DrawThreadPerContext 是最好的选择,而SingleThreaded 则适用于配置较低的系统,剩下的 CullDrawThreadPerContext 模型目前并不建议用户使用。