0

OpenSceneGraph를 사용하여 응용 프로그램을 개발 중이며 if 문에서 이상한 동작이 발생합니다. 그것이 어떤 수준에서도 나에게 의미가 없기 때문에 API에 특정한 것인지 확실하지 않습니다.if 문을 사용하는 이상한 동작

코드 :

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

장소 :

  • fileAddList_ :

  • FileStampThread 파일 이름

    을 유지하는 데 사용되는 사용자 정의 객체의 정적 벡터 : OpenThreads의 인스턴스 객체

  • addFiles() : 객체가

위의 코드 내 응용 프로그램에서 hotloading를 구현에 전달 된 파일의 목록을 저장하는 스레드 방법에 관한 것이다. FileStampThread 인스턴스는 전달 된 파일 이름의 타임 스탬프를 확인하면서 지속적으로 실행됩니다. 스탬프가 변경되면 파일 이름이 다른 목록에 저장되고 다시로드 할 수있게됩니다.

이상한 점은 추가 할 파일이 없더라도 (이 코드가 실행될 때) 장면 그래프의 업데이트 탐색이 상당히 느려진다는 것입니다 (모자는 fileAddList_가 비어 있더라도 모자이크입니다).). 결과적으로 업데이트 순회 시간이 몇 배 증가합니다.

그러나 sg :: FileStampThread :: addFiles에 대한 호출을 주석 처리하면 속도가 느려집니다. 그러나 디버그 모드에서 호출을 트랩하고 결코 실행되지 않습니다.

그래서 나는 조건문 내부의 코드 라인이 조건 테스트가 실패 할 때 내 프로그램 실행 속도에 영향을 미치고 모든 상황에서 결코 실행되지 않을 것이라고 생각합니다.

부수적으로 변수를 정적으로 선언하는 것과 관련이있는 것 같아서 같은 효과를 내기 위해 전역 변수 (extern 사용)로 선언했습니다.


편집 아래의 댓글 중 일부를 해결하기 :

  • 스레드는 객체 OpenThreads의 인스턴스입니다. MS 관련 항목이 없습니다. 인스턴스가 정적입니다.

  • addFiles()가

  • 을 템플릿되지 나는 거기에 코드를 루프를 시험했다. 나는 라인 를 번갈아 주석 처리했다. 나는 절대적으로 addFiles()의 포함이 긍정적이다. 콜이 그 원인이다.

  • 디버그 대 릴리스도 다르지 않으므로 코드를 별도의 기능으로 변경하면 아무 것도 변경되지 않았습니다.

  • OSG는 고성능이며 잘못된 예측에 대한 의견은 바로 일 수 있습니다. 연구 할 예정 ...FileStampThread 클래스

코드 : 문제가 지속되는 경우를 참조 별도의 기능에

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

:

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)); 
    } 
}; 
+0

COM 부서의 FileStampThread입니까? 그리고 어떤 종류의 스레드 안전성이 그 클래스에서 사용 되는가? (안전 싱글 톤으로 만들기 위해)? –

+1

문제와 코드에 실제로 액세스하지 않고는보기가 어렵습니다. 왜 * 속도에 영향을 미칠지에 대한 간단한 대답은 분기 예측 오류 일 수 있지만, 이것이 단단한 루프에서 실행되는 경우에만 눈치 채게됩니다. 이것이 고성능 코드 경로 안에 있다면 컴파일러에 대한 힌트를 추가하는 것을 고려하십시오. –

+0

글쎄, 이론적으로, addFiles가 템플릿 메소드 인 경우, 어딘가에 호출하면 그 인스턴스가 인스턴스화됩니다. 전역 부작용이있는 addFiles에서 다른 템플릿 인스턴스화를 수행 할 수 있습니다. 그것은 긴 샷이다. – enobayram

답변

1

시도 코드를 이동합니다. 릴리스 및 디버그 빌드에서 동일한 현상이 일어나기가 쉽지 않습니까?

+0

+1 유용한 디버깅 방법을 설명합니다. –