2011-10-22 27 views
0

我有一个放置在矩形区域的2D纹理 - 它是一个动态纹理图像(640x480)。OpenSceneGraph Texture2D图像“脏”vs“setImage”性能

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); 

我的图像数据在另一个线程的频率(每n毫秒)更新:

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倍。

// Update callback 
... 
tex->setImage(myImage); 
... 

阅读OSG文档和gidelines让我觉得正确的方法是 - 'dirty()'。但速度非常缓慢。我是否错误理解某些内容或在我的代码中存在错误?

回答

0

我假设你使用的不是OSG的最新版本(3.0.1),因为它缺少Image类的“脏”方法。 在以前的版本(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));