public void Render(IGameViewport viewport) { using var perfGroup = _renderingDevice.CreatePerfGroup("Particles"); _totalLastFrame = 0; _renderedLastFrame = 0; var sw = Stopwatch.StartNew(); foreach (var partSys in _particleSysSystem.ActiveSystems) { _totalLastFrame++; if (!partSys.IsOnScreen(viewport)) { continue; } _renderedLastFrame++; using var sysPerfGroup = _renderingDevice.CreatePerfGroup("PartSys '{0}'", partSys.GetSpec().GetName()); // each emitter is rendered individually foreach (var emitter in partSys.GetEmitters()) { if (emitter.GetActiveCount() == 0) { continue; // Skip emitters with no particles } using var emitterPerfGroup = _renderingDevice.CreatePerfGroup("Emitter '{0}'", emitter.GetSpec().GetName()); var type = emitter.GetSpec().GetParticleType(); var renderer = _rendererManager.GetRenderer(type); renderer.Render(viewport, emitter); } if (Globals.Config.DebugPartSys) { RenderDebugInfo(viewport, partSys); } } _renderTimes[_renderTimesPos++] = (int)sw.ElapsedMilliseconds; if (_renderTimesPos >= _renderTimes.Length) { _renderTimesPos = 0; } }