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 に答える