- 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)
69 lines
2.7 KiB
C++
69 lines
2.7 KiB
C++
//
|
||
// 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
|