Files
ZZY 89bede93a9 feat(engine): 重构游戏引擎核心逻辑
- 重新设计了引擎的初始化和运行流程
- 引入了实体组件系统(ECS)和物理系统
- 优化了渲染系统和输入系统
- 移除了不必要的资源管理系统
- 调整了日志系统的实现
2025-06-29 18:46:36 +08:00

66 lines
2.4 KiB
C
Raw Permalink 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.
// ge_fps.c
#include "ge_fps.h"
// 初始化FPS控制器
void ge_fps_init(ge_fps_controller_t* fps_ctrl, ge_u32_t target_fps,
ge_fps_get_us_func_t get_us, ge_fps_sleep_us_func_t sleep_us) {
fps_ctrl->target_fps = target_fps;
fps_ctrl->frame_duration = 1000 / target_fps;
fps_ctrl->last_frame_time = get_us();
fps_ctrl->frame_time = 0;
fps_ctrl->sleep_time = 0;
fps_ctrl->frame_count = 0;
fps_ctrl->fps = 0;
fps_ctrl->last_fps_time = fps_ctrl->last_frame_time;
fps_ctrl->call_get_us = get_us;
fps_ctrl->call_sleep_us = sleep_us;
}
// 帧开始
void ge_fps_begin_frame(ge_fps_controller_t* fps_ctrl) {
fps_ctrl->last_frame_time = fps_ctrl->call_get_us();
}
// 帧结束
void ge_fps_end_frame(ge_fps_controller_t* fps_ctrl) {
ge_u32_t current_time = fps_ctrl->call_get_us();
fps_ctrl->frame_time = current_time - fps_ctrl->last_frame_time;
// 帧率自适应算法
if (fps_ctrl->frame_time < fps_ctrl->frame_duration) {
ge_u32_t sleep_time = fps_ctrl->frame_duration - fps_ctrl->frame_time;
// 动态调整休眠精度
if (sleep_time > 2000) { // >2ms使用Sleep
fps_ctrl->call_sleep_us(sleep_time - 1000); // 提前1ms唤醒
current_time = fps_ctrl->call_get_us();
// 剩余时间忙等待
while ((current_time - fps_ctrl->last_frame_time) < fps_ctrl->frame_duration) {
current_time = fps_ctrl->call_get_us();
}
} else {
// 短时间直接忙等待
while ((fps_ctrl->call_get_us() - fps_ctrl->last_frame_time) < fps_ctrl->frame_duration);
}
}
// 更新FPS计数同原逻辑
fps_ctrl->frame_count++;
if (current_time - fps_ctrl->last_fps_time >= 1000000) {
fps_ctrl->fps = fps_ctrl->frame_count;
fps_ctrl->frame_count = 0;
fps_ctrl->last_fps_time = current_time;
// 动态调整目标帧时间±5%容差)
// ge_u32_t avg_frame_time = 1000000 / fps_ctrl->fps;
// if (avg_frame_time > fps_ctrl->frame_duration * 1.05f) {
// fps_ctrl->frame_duration = avg_frame_time;
// } else if (avg_frame_time < fps_ctrl->frame_duration * 0.95f) {
// fps_ctrl->frame_duration = GE_MAX(
// fps_ctrl->target_fps * 1000,
// avg_frame_time
// );
// }
}
}