2011-10-22 4 views
0

私は2Dテクスチャを矩形領域に配置しました。これは動的テクスチャ画像(640x480)です。OpenSceneGraph Texture2D画像 "dirty" vs "setImage"パフォーマンス

私の画像データは、多くの場合、他のスレッド(各Nミリ秒)で更新される
tex = new osg::Texture2D; 
tex->setDataVariance(osg::Object::DYNAMIC); 
tex->setResizeNonPowerOfTwoHint(false); 
tex->setFilter(osg::Texture2D::MIN_FILTER, osg::Texture2D::NEAREST); 
tex->setFilter(osg::Texture2D::MAG_FILTER, osg::Texture2D::NEAREST); 
tex->setImage(myImage); 

myImage->setImage(
    width, 
    height, 
    1, 
    3, 
    GL_BGR, 
    gl_data_size, 
    (BYTE *)newImageData, 
    osg::Image::AllocationMode::USE_MALLOC_FREE 
); 

そして、私はこれが最善の方法だと思った(ダーティ使用している場合は、その後、私は、レンダリングされた画像を更新したいですテクスチャに設定された画像上で、例えば、更新用に)

// Update callback 
... 
myImage->dirty(); 
... 

私のパフォーマンスは、私が同じポインタを持つだけで画像の交換を使用する場合に比べて約7~8倍遅くなります。

OSGのドキュメンテーションとガードを読むと、正しい方法が「汚い」と思うようになります。しかしそれは極端に遅いです。私は何か勘違いするのか、自分のコードに間違いがあるのか​​分からないのですか?

答えて

0

Imageクラスの「ダーティ」メソッドがないため、最新の(3.0.1)バージョンのOSGを使用していないと仮定しています。以前のバージョン(2.xの)で :ターンで

inline void Image::dirty() 
{ 
    ++_modifiedCount; 
    if (_bufferObject.valid()) 
     _bufferObject->dirty(); 
} 

汚い()_bufferObjectためのすべてのコンパイル済みのリストをリセットします。 一方setImageは次のように始まる:

void Texture2D::setImage(Image* image) 
{ 
    if (_image == image) return; 
    ... 
} 

あなたはイメージのために同じポインタを使用している場合ので、あなたの場合には、それは、何もしません。 これは高速ですが、何も変更されていない場合、OSGが実際のテクスチャをどのように更新するのか分かりません。

0

正しい方法は、画像上でdirty()を呼び出すことです。

イメージにosg :: PixelBufferObjectを追加して、グラフィックスカードへの転送を高速化してください。

myImage->setPixelBufferObject(new osg::PixelBufferObject(myImage)); 
関連する問題