簡體   English   中英

使用if語句的奇怪行為

[英]Strange behavior using if statement

我正在使用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) );
    }
};

嘗試移動代碼:

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

在單獨的功能中,查看問題是否仍然存在。 難以置信發生了什么,發布和調試版本上的行為相同?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM