Skip to content

Commit

Permalink
#5584: CamWnd keeps the CamRenderer instance around. The LitRenderabl…
Browse files Browse the repository at this point in the history
…es map is now emptied, but the memory is not freed to avoid re-allocating a million entries every frame.
  • Loading branch information
codereader committed Nov 1, 2021
1 parent 1d05453 commit 8dc3125
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 6 deletions.
19 changes: 19 additions & 0 deletions libs/render/CamRenderer.h
Expand Up @@ -93,6 +93,25 @@ class CamRenderer :
_shaders(shaders)
{}

void prepare()
{
_totalLights = 0;
_visibleLights = 0;
_editMode = GlobalMapModule().getEditMode();
}

void cleanup()
{
// Keep the shader map intact, but clear the renderables vectors,
// so that we don't have to re-allocate the whole memory every frame
for (auto& pair : _litRenderables)
{
pair.second.clear();
}

_sceneLights.clear();
}

/**
* \brief
* Instruct the CamRenderer to push its sorted renderables to their
Expand Down
17 changes: 11 additions & 6 deletions radiant/camera/CamWnd.cpp
Expand Up @@ -127,6 +127,8 @@ CamWnd::CamWnd(wxWindow* parent) :
radiant::IMessage::Type::TextureChanged,
radiant::TypeListener<radiant::TextureChangedMessage>(
sigc::mem_fun(this, &CamWnd::handleTextureChanged)));

_renderer.reset(new render::CamRenderer(_view, _shaders));
}

wxWindow* CamWnd::getMainWidget() const
Expand Down Expand Up @@ -784,27 +786,30 @@ void CamWnd::Cam_Draw()

// Main scene render
{
_renderer->prepare();

// Front end (renderable collection from scene)
render::CamRenderer renderer(_view, _shaders);
render::RenderableCollectionWalker::CollectRenderablesInScene(renderer, _view);
render::RenderableCollectionWalker::CollectRenderablesInScene(*_renderer, _view);

// Accumulate render statistics
_renderStats.setLightCount(renderer.getVisibleLights(),
renderer.getTotalLights());
_renderStats.setLightCount(_renderer->getVisibleLights(),
_renderer->getTotalLights());
_renderStats.frontEndComplete();

// Render any active mousetools
for (const ActiveMouseTools::value_type& i : _activeMouseTools)
{
i.second->render(GlobalRenderSystem(), renderer, _view);
i.second->render(GlobalRenderSystem(), *_renderer, _view);
}

// Back end (submit to shaders and do the actual render)
renderer.submitToShaders(
_renderer->submitToShaders(
getCameraSettings()->getRenderMode() == RENDER_MODE_LIGHTING
);
GlobalRenderSystem().render(allowedRenderFlags, _camera->getModelView(),
_camera->getProjection(), _view.getViewer());

_renderer->cleanup();
}

// greebo: Draw the clipper's points (skipping the depth-test)
Expand Down
3 changes: 3 additions & 0 deletions radiant/camera/CamWnd.h
Expand Up @@ -37,6 +37,8 @@ const int CAMWND_MINSIZE_Y = 200;

class SelectionTest;

namespace render { class CamRenderer; };

namespace ui
{

Expand All @@ -63,6 +65,7 @@ class CamWnd :
// The contained camera
camera::ICameraView::Ptr _camera;

std::unique_ptr<render::CamRenderer> _renderer;
static render::CamRenderer::HighlightShaders _shaders;

wxutil::FreezePointer _freezePointer;
Expand Down

0 comments on commit 8dc3125

Please sign in to comment.