我在矩形区域上放置了一个 2D 纹理 - 它是一个动态纹理图像 (640x480)。
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 的文档和指南让我认为正确的方法是 - 'dirty()'。但它非常慢。我是否误解了什么或我的代码中有错误?
最佳答案
我假设您使用的不是最新 (3.0.1) 版本的 OSG,因为它缺少 Image 类的“脏”方法。 在以前的版本 (2.x) 中:
inline void Image::dirty()
{
++_modifiedCount;
if (_bufferObject.valid())
_bufferObject->dirty();
}
dirty() 依次重置 _bufferObject 的所有已编译列表。 另一方面,setImage 是这样开始的:
void Texture2D::setImage(Image* image)
{
if (_image == image) return;
...
}
所以在你的情况下,如果你对图像使用相同的指针,它什么都不做。 这就是它更快的原因,但我不知道如果没有任何变化,OSG 如何更新实际纹理。
关于c++ - OpenSceneGraph Texture2D 图像 "dirty"与 "setImage"性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7857724/