lib/ecspanse/system/track_fps.ex

defmodule Ecspanse.System.TrackFPS do
  @moduledoc """
  A special system provided by the framework to track the FPS.

  The value is stored in the `Ecspanse.Resource.FPS` resource.
  """
  use Ecspanse.System

  @impl true
  def run(frame) do
    {:ok, fps_resource} = Ecspanse.Query.fetch_resource(Ecspanse.Resource.FPS)
    new_time = fps_resource.millisecond + frame.delta

    updated_resource =
      if new_time >= 1000 do
        [value: fps_resource.current + 1, current: 0, millisecond: new_time - 1000]
      else
        [current: fps_resource.current + 1, millisecond: new_time]
      end

    Ecspanse.Command.update_resource!(fps_resource, updated_resource)
  end
end