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;
        }
    }