Files
HelloVulkan/Engine/include/Engine/Core/Time.h
T
atdunbg 1c4b6f37ff feat: Jolt 物理系统——刚体/碰撞体/物理调试图元 + 引擎时间单源
- PhysicsWorld:Jolt 集成,Dynamic/Kinematic/Static 刚体,姿态写回
  Transform(Unity FixedUpdate 语义,吃 scaled dt,暂停自动冻结)
- 碰撞体:Box(默认/手动 halfExtents)+ Mesh 碰撞体(Static→精确
  MeshShape / Dynamic·Kinematic→ConvexHull,数据源 = Mesh ctor 缓存
  的 CPU 位置副本,退化三角剔除,失败回退 Box 并告警)
- PhysicsDebugPass:物理调试图元每帧上传绘制(debug_line shader)
- Time:引擎时间单源(BeginFrame 落定 FrameTime,scaled/unscaled 分离)
- JoltPhysics 以 submodule 接入(官方 url)
2026-10-02 20:08:54 +08:00

69 lines
2.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//
// Time:帧时间系统(单源采集 → 帧契约 → 静态门面)。
//
// 数据流(镜像 FrameSceneData 的落帧模式):
// Application::Run 帧首采集真实 dt(steady_clock 单源,钳制卡顿)→
// Time::BeginFrame 落定当帧 FrameTime(业务当帧只读)→ 三轨消费:
// 游戏轨 Dt() = unscaledDt × timeScale(OnUpdate/动画/粒子)
// 真实轨 UnscaledDt() (编辑器相机/UI/FPS,暂停不受影响)
// 物理轨 accumulator (吃 Dt(),scale=0 天然冻结,编辑器对账仍跑)
//
// 对齐 UE/Unity:
// Time::Delta/UnscaledDelta ≈ Unity Time.deltaTime / unscaledDeltaTime
// Time::SetTimeScale(0) ≈ Unity timeScale=0 / UE GlobalTimeDilation=0
// FrameTime.elapsed ≈ Unity Time.time(scaled 累计)
// Time::Realtime() ≈ Unity realtimeSinceStartup
// TimerManager(UE SetTimer 语义)留二期,有真实消费场景再上。
//
#ifndef HELLOVULKAN_TIME_H
#define HELLOVULKAN_TIME_H
#include <Engine/Core/Types.h>
#include <chrono>
namespace Engine {
// 帧时间契约:Run 帧首落定,当帧只读
struct FrameTime {
f64 unscaledDt = 0.0; // 真实帧时长(秒,f64 防 long-run 误差)
f32 timeScale = 1.0f; // 全局缩放(0 = 暂停)
u64 frameCount = 0;
f64 elapsed = 0.0; // 游戏累计(scaled)
f64 unscaledElapsed = 0.0; // 真实累计
f32 Dt() const { return static_cast<f32>(unscaledDt) * timeScale; }
f32 UnscaledDt() const { return static_cast<f32>(unscaledDt); }
f32 Milliseconds() const { return Dt() * 1000.0f; }
f32 UnscaledMilliseconds() const { return UnscaledDt() * 1000.0f; }
};
// 静态门面:任意深度代码免穿引用拿 Application(Unity Time 风格)
class Time {
public:
// ---- 消费端 ----
static const FrameTime& Current();
static f32 Delta(); // scaled dt(当帧)
static f32 UnscaledDelta();
static f64 Elapsed(); // scaled 累计(秒)
static f64 Realtime(); // 进程启动至今(真实秒,性能测量统一入口)
static f32 TimeScale();
static u64 FrameCount();
// ---- 控制意图(下一帧生效)----
static void SetTimeScale(f32 scale); // 0 = 暂停;负值钳为 0
// ---- 框架内部:Application::Run 帧首调用 ----
static void BeginFrame(f64 unscaledDt, u64 frameCount);
private:
static FrameTime s_Current;
static f32 s_PendingScale;
static const std::chrono::steady_clock::time_point s_Startup;
};
} // namespace Engine
#endif //HELLOVULKAN_TIME_H