c++ - OpenSceneGraph Texture2D 图像 "dirty"与 "setImage"性能

标签 c++ windows performance openscenegraph

我在矩形区域上放置了一个 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/

相关文章:

c++ - 在我的代码中,scoped_ptr 指向一个堆栈变量——这会延长堆栈变量的生命周期吗?

php - 在 WAMP 64 位架构上加载 Mongo Driver 1.6.x 驱动程序

Windows API 函数

c - 为什么要对 ShowWindow() 进行初始调用?

ruby - 检测字符串中的字符

mysql - 我的 SQL 查询这么慢是否正常?

c++ - 无法设置 CWinApp 上的 SetTimer 函数

c++ - xvalues : differences between non class types and class types

c++ - boost asio 行为 - 从多个线程调用 ios_service::run

PHP - 如何测试/检查目录/文件夹是否包含旧文件/文件早于?