Jump to content

2.19 Render::restoreState takes way too much time


photo

Recommended Posts

Posted

Hello,

I use Render::saveState() and Render::restoreState() to have per-viewport specific render settings. But Render::restoreState() takes around 11ms !!! This effectively makes it impossible to use for any real-time task.

The objective is to have for each viewtype some specific adjustments for each type of sensor, which are not solved by a post-process material, and still keep these adjustments out of hard-coded Render::set* functions in the source.

Here is how I use it:

BlobPtr render_states[8]; // each view type gets its own render settings

int SystemLogic::init() {
  ...
  	render_states[0] = Blob::create(); // state 0 is the default and shall always exists
	Render::saveState(render_states[0]);
	for (int i = 0; i <= 7; ++i) { // one for each CIGI view type
		String render_settings = String::format("viewtype_%d.render", i);
		Log::message("Loading Render settings %s\n", render_settings.get());
		if (Render::loadSettings(render_settings)) {
			render_states[i] = Blob::create();
			Render::saveState(render_states[i]);
		}
	}
  ...
}

 

// For each viewport window						
window->getEventFuncBeginRender().connectUnsafe([this, viewportId]() { beginRender(viewportId); });
window->getEventFuncEndRender().connectUnsafe([this, viewportId]() { endRender(viewportId); });

 

void SystemLogic::beginRender(int viewportId)
{
    // retrieve the viewtype ID from the viewport ID (can be changed dynamically)
	int viewId = viewport_view.value(viewportId, ig->getCurrentView());
	if (auto view = ig->getView(viewId)) {
		int viewtype = view->getViewType();
		applyRenderState(viewtype);
    }
 }

 

void SystemLogic::applyRenderState(int viewtype)
{
	if (0 <= viewtype && viewtype < 8 && render_states[viewtype]) {
		render_states[viewtype]->seekSet(0);
		UNIGINE_PROFILER_SCOPED("restoreState");
		Render::restoreState(render_states[viewtype]); // TAKES MORE THAN 11ms!
	}
}
×
×
  • Create New...