0

我正在使用 OpenSceneGraph 开发应用程序,并且在 if 语句中遇到了一些奇怪的行为。我不确定它是否特定于 API,因为它对我来说在任何层面上都毫无意义。

编码:

if ( !fileAddList_.empty() )
{
    sg::FileStampThread::instance()->addFiles( fileAddList_ );
    fileAddList_.clear();
}

在哪里:

  • fileAddList_:用于维护文件名的自定义对象的静态向量

  • FileStampThread:OpenThreads 对象的一个​​实例

  • addFiles():线程中的一个方法,它保存传递给它的文件对象列表

上面的代码在我的应用程序中实现了热加载。FileStampThread 实例连续运行,检查传递给它的文件名的时间戳。一旦戳记更改,文件名将保存到另一个列表并传回以重新加载。

奇怪的是,当我启用这部分代码时,场景图的更新遍历(执行此代码时)会大大减慢,即使没有要添加的文件(帽子是,即使 fileAddList_ 为空)。结果,更新遍历时间增加了一个数量级。

但是,如果我注释掉对 sg::FileStampThread::addFiles 的调用,减速就会消失。然而,我已经将调用困在调试模式中并且它永远不会被执行。

所以,我很困惑:为什么条件测试中的一行代码会在条件测试失败时影响我的程序执行速度,而且从表面上看,它从未执行过?

作为旁注,我怀疑它可能与将变量声明为静态变量有关,因此我尝试将其声明为全局变量(使用 extern),以达到相同的效果。


编辑以解决以下一些评论:

  • 线程是 OpenThreads 对象的一个​​实例。这里没有特定于 MS 的东西。该实例是静态的。

  • addFiles() 未模板化

  • 我用其中的代码测试了循环。我交替注释掉这些行。我绝对肯定包含 addFiles() 调用是罪魁祸首。

  • 调试与发布没有什么不同,不幸的是,将代码推到一个单独的函数中没有任何改变。

  • OSG 是高性能的,关于错误预测的评论可能是正确的。研究即将...

FileStampThread 类的代码:

void sg::FileStampThread::addFiles( sg::AssetFileList& files )
{
    OpenThreads::ScopedLock<OpenThreads::Mutex> lock( contentMutex_ );

    for ( sg::AssetFileList::iterator it = files.begin(); it != files.end(); ++it )
    {
        if ( boost::filesystem::exists( (*it).getPath() ))
            fileList_.push_back( (*it) );
    }
};
4

1 回答 1

1

尝试移动代码:

sg::FileStampThread::instance()->addFiles( fileAddList_ );
fileAddList_.clear();

在单独的函数中查看问题是否仍然存在。很难坐下来发生了什么,发布和调试版本的行为相同?

于 2012-03-21T12:17:22.557 回答