feat(engine): 重构游戏引擎核心逻辑

- 重新设计了引擎的初始化和运行流程
- 引入了实体组件系统(ECS)和物理系统
- 优化了渲染系统和输入系统
- 移除了不必要的资源管理系统
- 调整了日志系统的实现
This commit is contained in:
ZZY
2025-06-29 18:46:36 +08:00
parent 5ce660e3a6
commit 89bede93a9
37 changed files with 1294 additions and 350 deletions

View File

@@ -7,48 +7,48 @@ void ge_engine_init(ge_core_t *core) {
for (int i = 0; i < (int)sizeof(ge_core_t); i++) {
*(ptr + i) = 0;
}
core->configs.fps = 60;
core->configs.fps = 120;
}
static inline void ge_init(ge_core_t* core) {
/**
* check render
*/
ge_render_t* render_ctx = &core->render;
if (render_ctx->content) {
Assert(render_ctx->clear && render_ctx->draw
&& render_ctx->getsize);
GE_SAFE_CALL(render_ctx->init, render_ctx);
render_ctx->getsize(render_ctx, &render_ctx->screen_size);
ge_render_t* render_ctx = &core->_render;
if (render_ctx->context) {
GE_SAFE_CALL(render_ctx->init_func, render_ctx, NULL);
}
Assert(core->timer.sleep_ms != NULL);
Assert(core->configs.fps != 0);
Assert(core->_timer.func_sleepms != NULL);
core->timer.fps_ctl.target_fps = 0;
if (core->timer.get_ms != NULL) {
ge_fps_init(&core->timer.fps_ctl, core->configs.fps,
core->timer.get_ms, core->timer.sleep_ms);
/**
* init ecs
*/
for (int i = 0; i < GE_ECS_MAX; ++i) {
core->ecs.storage.entities[i].component_mask = 0;
}
}
ge_render_system_init(&core->_systems.render, &core->_render);
// TODO using other storage system
core->_systems.render.ecs = &core->ecs.storage;
core->ecs.storage.count = 0;
static inline void ge_render(ge_render_t* ctx) {
// ctx->clear(ctx);
core->_systems.physics.ecs = &core->ecs.storage;
}
void ge_engine_run(ge_core_t *core) {
GE_SAFE_CALL(core->callbacks.init, core);
ge_init(core);
GE_SAFE_CALL(core->callbacks.init, core);
core->state = GE_ENGINE_STATE_RUNNING;
while (core->state == GE_ENGINE_STATE_RUNNING) {
if (core->timer.fps_ctl.target_fps) ge_fps_begin_frame(&core->timer.fps_ctl);
GE_SAFE_CALL(core->_inner_run, core);
GE_SAFE_CALL(core->callbacks.run, core);
if (core->render.content) ge_render(&core->render);
ge_physics_system_run_all(&core->_systems.physics);
GE_SAFE_CALL(core->callbacks.process, core);
ge_render_system_draw_all(&core->_systems.render);
if (core->timer.fps_ctl.target_fps) ge_fps_end_frame(&core->timer.fps_ctl);
else core->timer.sleep_ms(1000 / core->configs.fps);
GE_SAFE_CALL(core->_render.func_flush, &core->_render);
core->_timer.func_sleepms(&core->_timer, 1000 / core->configs.fps);
}
GE_SAFE_CALL(core->callbacks.exit, core);
}