OpenSceneGraph Texture2D image "грязный" против производительности "setImage" - PullRequest
0 голосов
/ 22 октября 2011

У меня есть 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 ()». Но это очень медленно. Я что-то неправильно понимаю или в моем коде есть ошибка?

Ответы [ 2 ]

0 голосов
/ 15 июня 2012

Правильный способ вызывать dirty () для вашего изображения.

Попробуйте добавить к вашему изображению osg :: PixelBufferObject, чтобы ускорить перенос на графическую карту.

myImage->setPixelBufferObject(new osg::PixelBufferObject(myImage));
0 голосов
/ 13 июня 2012

Я предполагаю, что вы используете не последнюю (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 обновляет фактическую текстуру, если ничего не изменилось.

...