From d5fbd2001b0ad3591a7f969dfd75c809ab55b40e Mon Sep 17 00:00:00 2001 From: Kae <80987908+Novaenia@users.noreply.github.com> Date: Fri, 30 Jun 2023 04:34:10 +1000 Subject: RenderPrimitive micro-optimizations --- source/application/StarRenderer_opengl20.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'source/application/StarRenderer_opengl20.cpp') diff --git a/source/application/StarRenderer_opengl20.cpp b/source/application/StarRenderer_opengl20.cpp index 82d4845..375149e 100644 --- a/source/application/StarRenderer_opengl20.cpp +++ b/source/application/StarRenderer_opengl20.cpp @@ -366,6 +366,10 @@ RenderBufferPtr OpenGl20Renderer::createRenderBuffer() { return createGlRenderBuffer(); } +List& OpenGl20Renderer::immediatePrimitives() { + return m_immediatePrimitives; +} + void OpenGl20Renderer::render(RenderPrimitive primitive) { m_immediatePrimitives.append(move(primitive)); } @@ -399,7 +403,8 @@ void OpenGl20Renderer::finishFrame() { flushImmediatePrimitives(); // Make sure that the immediate render buffer doesn't needlessly lock texutres // from being compressed. - m_immediateRenderBuffer->set({}); + List empty; + m_immediateRenderBuffer->set(empty); filter(m_liveTextureGroups, [](auto const& p) { unsigned const CompressionsPerFrame = 1; @@ -569,7 +574,7 @@ OpenGl20Renderer::GlRenderBuffer::~GlRenderBuffer() { glDeleteBuffers(1, &vb.vertexBuffer); } -void OpenGl20Renderer::GlRenderBuffer::set(List primitives) { +void OpenGl20Renderer::GlRenderBuffer::set(List& primitives) { for (auto const& texture : usedTextures) { if (auto gt = as(texture.get())) gt->decrementBufferUseCount(); @@ -637,7 +642,7 @@ void OpenGl20Renderer::GlRenderBuffer::set(List primitives) { return {float(textureIndex), Vec2F(glTexture->glTextureCoordinateOffset())}; }; - auto appendBufferVertex = [&](RenderVertex v, float textureIndex, Vec2F textureCoordinateOffset) { + auto appendBufferVertex = [&](RenderVertex const& v, float textureIndex, Vec2F textureCoordinateOffset) { GlRenderVertex glv { v.screenCoordinate, v.textureCoordinate + textureCoordinateOffset, @@ -682,6 +687,7 @@ void OpenGl20Renderer::GlRenderBuffer::set(List primitives) { } } + vertexBuffers.reserve(primitives.size() * 6); finishCurrentBuffer(); for (auto const& vb : oldVertexBuffers) @@ -733,7 +739,8 @@ void OpenGl20Renderer::flushImmediatePrimitives() { if (m_immediatePrimitives.empty()) return; - m_immediateRenderBuffer->set(take(m_immediatePrimitives)); + m_immediateRenderBuffer->set(m_immediatePrimitives); + m_immediatePrimitives.resize(0); renderGlBuffer(*m_immediateRenderBuffer, Mat3F::identity()); } -- cgit v1.2.3