feat(app): add tick info/result and system diagnosis
This commit is contained in:
		
							parent
							
								
									d924d14ab0
								
							
						
					
					
						commit
						53dd008df5
					
				
					 2 changed files with 95 additions and 5 deletions
				
			
		| 
						 | 
					@ -9,10 +9,16 @@ void Application::game_loop()
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		for (auto &system : m_systems)
 | 
							for (auto &system : m_systems)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			if (system->tick())
 | 
								const auto &last_tick = system->get_last_tick_result();
 | 
				
			||||||
			{
 | 
								const auto now = std::chrono::steady_clock::now();
 | 
				
			||||||
				return;
 | 
					
 | 
				
			||||||
			}
 | 
								system->tick(
 | 
				
			||||||
 | 
								    TickInfo {
 | 
				
			||||||
 | 
								        .delta_time = now - last_tick.end_time,
 | 
				
			||||||
 | 
								        .budget = std::chrono::milliseconds { 10 },
 | 
				
			||||||
 | 
								        .start_time = now,
 | 
				
			||||||
 | 
								    }
 | 
				
			||||||
 | 
								);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (auto &system : m_systems_to_be_registered)
 | 
							for (auto &system : m_systems_to_be_registered)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,89 @@
 | 
				
			||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <chrono>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace lt::app {
 | 
					namespace lt::app {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Information required to tick a system.
 | 
				
			||||||
 | 
					 * @note May be used across an entire application-frame (consisting of multiple systems ticking)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					struct TickInfo
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						using Timepoint_T = std::chrono::time_point<std::chrono::steady_clock>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						using Duration_T = std::chrono::duration<double>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/** Duration since previous tick's end_time to current tick's start_time. */
 | 
				
			||||||
 | 
						Duration_T delta_time {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/** Maximum duration the system is expected to finish ticking in.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * if end_time - start_time > budget -> the system exceeded its ticking budget.
 | 
				
			||||||
 | 
						 * else end_time - start_time < budget -> the system ticked properly.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * In other words, end_time is expected to be less than start_time + budget.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						Duration_T budget {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/** Exact time which ticking started. */
 | 
				
			||||||
 | 
						Timepoint_T start_time;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Information about how a system's tick performed */
 | 
				
			||||||
 | 
					struct TickResult
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						using Timepoint_T = std::chrono::time_point<std::chrono::steady_clock>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						using Duration_T = std::chrono::duration<double>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/** The info supplied to the system for ticking. */
 | 
				
			||||||
 | 
						TickInfo info;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/** Equivalent to end_time - info.start_time. */
 | 
				
			||||||
 | 
						Duration_T duration {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/** Exact time which ticking ended. */
 | 
				
			||||||
 | 
						Timepoint_T end_time;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct SystemDiagnosis
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						enum class Severity : uint8_t
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							verbose,
 | 
				
			||||||
 | 
							info,
 | 
				
			||||||
 | 
							warning,
 | 
				
			||||||
 | 
							error,
 | 
				
			||||||
 | 
							fatal,
 | 
				
			||||||
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::string message;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						std::string code;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						Severity severity;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SystemStats
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
						void push_diagnosis(SystemDiagnosis &&diagnosis)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							auto diag = m_diagnosis.emplace_back(std::move(diagnosis));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							log_dbg("message: {}", diag.message);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[[nodiscard]] auto empty_diagnosis() const -> bool
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							return m_diagnosis.empty();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
						std::vector<SystemDiagnosis> m_diagnosis;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ISystem
 | 
					class ISystem
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
| 
						 | 
					@ -21,7 +103,9 @@ public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	virtual void on_unregister() = 0;
 | 
						virtual void on_unregister() = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	virtual auto tick() -> bool = 0;
 | 
						virtual void tick(TickInfo tick) = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[[nodiscard]] virtual auto get_last_tick_result() const -> const TickResult & = 0;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace lt::app
 | 
					} // namespace lt::app
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue