[英]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()調用是罪魁禍首。
調試與發布沒有什么不同,不幸的是,將代碼推送到一個單獨的函數中並沒有改變。
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.