我正在使用openscenegraph来渲染具有~9000个顶点的场景。每个可绘制对象都是一条线(我必须保留它,因为它代表一个"条形")。所以我在每个Geometry
节点上使用具有相同顶点数组的函数setVertexArray()
,但使用不同的DrawElementsUInt
。
总共有 12000 个可绘制对象,我应该有 9000 个顶点,但我有大约 200 000 000 个顶点和两倍的可绘制对象。(我看到在查看器中使用"S"键)。
我可以做些什么来强制可绘制对象使用相同的数组而不是复制它?
我在Qt中使用OSG。
m_vertices是一个osg::vec3Array*,其中包含9000个值
addBar被调用12000次。
void addBar(osg::Node *geode)
{
osg::ref_ptr<osg::Geometry> bar = new osg::Geometry;
bar.get()->setVertexArray(m_vertices);
bar->setUseDisplayList(false);
osg::DrawElementsUInt *ids = new osg::DrawElementsUInt(osg::PrimitiveSet::LINES);
ids->push_back(/* first Id*/);
ids->push_back(/* second id */);
bar.get()->addPrimitiveSet(ids);
geode->asGeode()->addDrawable(bar.get());
}
您似乎没有使用 VBO,因此 OSG 正在制作m_vertices
数组的每个节点副本并将其上传到 GPU 上。
因此,请删除该行:
bar->setUseDisplayList(false);
并将其替换为:
bar->setUseVertexBufferObjects(true);
更新:
经过进一步思考,这还不够。 在引擎盖下,OSG 只是为每个 Geode 创建一个单独的 VBO——而不是我们想要的。 因此,解决方案(根据OSG论坛上的这篇文章)是创建一个osg::VertexBufferObject
并用顶点填充它,然后使用setVertexBufferObject(..)
将其添加到osg::Vec3Array
(您的m_vertices
)。