Я разрабатываю приложение, используя 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) );
}
};