forked from teamnwah/openmw-tes3coop
Improve MyGUI widget creation performance
This commit is contained in:
parent
508c57d6e2
commit
ab626ca7b9
1 changed files with 27 additions and 10 deletions
|
@ -209,10 +209,17 @@ class OSGVertexBuffer : public MyGUI::IVertexBuffer
|
|||
|
||||
size_t mNeedVertexCount;
|
||||
|
||||
bool mQueuedForDrawing;
|
||||
|
||||
void destroy();
|
||||
void create();
|
||||
|
||||
public:
|
||||
OSGVertexBuffer();
|
||||
virtual ~OSGVertexBuffer();
|
||||
|
||||
void markAsQueuedForDrawing();
|
||||
|
||||
virtual void setVertexCount(size_t count);
|
||||
virtual size_t getVertexCount();
|
||||
|
||||
|
@ -220,8 +227,6 @@ public:
|
|||
virtual void unlock();
|
||||
|
||||
/*internal:*/
|
||||
void destroy();
|
||||
void create();
|
||||
|
||||
osg::VertexBufferObject *getBuffer() const { return mBuffer.get(); }
|
||||
osg::UByteArray *getArray() const { return mVertexArray.get(); }
|
||||
|
@ -229,6 +234,7 @@ public:
|
|||
|
||||
OSGVertexBuffer::OSGVertexBuffer()
|
||||
: mNeedVertexCount(0)
|
||||
, mQueuedForDrawing(false)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -237,14 +243,17 @@ OSGVertexBuffer::~OSGVertexBuffer()
|
|||
destroy();
|
||||
}
|
||||
|
||||
void OSGVertexBuffer::markAsQueuedForDrawing()
|
||||
{
|
||||
mQueuedForDrawing = true;
|
||||
}
|
||||
|
||||
void OSGVertexBuffer::setVertexCount(size_t count)
|
||||
{
|
||||
if(count == mNeedVertexCount)
|
||||
return;
|
||||
|
||||
mNeedVertexCount = count;
|
||||
destroy();
|
||||
create();
|
||||
}
|
||||
|
||||
size_t OSGVertexBuffer::getVertexCount()
|
||||
|
@ -254,15 +263,22 @@ size_t OSGVertexBuffer::getVertexCount()
|
|||
|
||||
MyGUI::Vertex *OSGVertexBuffer::lock()
|
||||
{
|
||||
// Force recreating the buffer, to make sure we are not modifying a buffer currently
|
||||
// queued for rendering in the last frame's draw thread.
|
||||
// a more efficient solution might be double buffering
|
||||
destroy();
|
||||
create();
|
||||
if (mQueuedForDrawing || !mVertexArray)
|
||||
{
|
||||
// Force recreating the buffer, to make sure we are not modifying a buffer currently
|
||||
// queued for rendering in the last frame's draw thread.
|
||||
// a more efficient solution might be double buffering
|
||||
destroy();
|
||||
create();
|
||||
mQueuedForDrawing = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
mVertexArray->resize(mNeedVertexCount * sizeof(MyGUI::Vertex));
|
||||
}
|
||||
|
||||
MYGUI_PLATFORM_ASSERT(mBuffer.valid(), "Vertex buffer is not created");
|
||||
|
||||
mVertexArray->resize(mNeedVertexCount * sizeof(MyGUI::Vertex));
|
||||
return (MyGUI::Vertex*)&(*mVertexArray)[0];
|
||||
}
|
||||
|
||||
|
@ -389,6 +405,7 @@ void RenderManager::doRender(MyGUI::IVertexBuffer *buffer, MyGUI::ITexture *text
|
|||
Drawable::Batch batch;
|
||||
batch.mVertexCount = count;
|
||||
batch.mVertexBuffer = static_cast<OSGVertexBuffer*>(buffer)->getBuffer();
|
||||
static_cast<OSGVertexBuffer*>(buffer)->markAsQueuedForDrawing();
|
||||
batch.mArray = static_cast<OSGVertexBuffer*>(buffer)->getArray();
|
||||
if (texture)
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue