ViewerBase类suggestBestThreadingModel()函数分析

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 函数可以帮助用户决定采用什么样的线程模型,基本的判断原则如下:

  1. 如果定义了环境变量 OSG_THREADING,且其中内容为“SingleThreaded”、“CullDrawThreadPerContext”、“CullThreadPerCameraDrawThreadPerContext”、 “DrawThreadPerContext”四个字符串中的一个,则采用对应的模型。
  2. 如果当前不存在图形设备或者摄像机,则采用SingleThreaded模型。
  3. 如果当前只存在一个图形窗口(这是最常见的情况),则采用SingleThreaded模型(单 核)或DrawThreadPerContext 模型(多核)。
  4. 如果系统CPU数超过当前图形设备和摄像机数总合,为了充分发挥每个CPU的能力,将采用CullThreadPerCameraDrawThreadPerContext 模型。
  5. 以上情形均不符合时,采用DrawThreadPerContext模型。

       可见,对于目前流行的多核系统而言,CullThreadPerCameraDrawThreadPerContext 和 DrawThreadPerContext 是最好的选择,而SingleThreaded 则适用于配置较低的系统,剩下的 CullDrawThreadPerContext 模型目前并不建议用户使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值