feat(engine): 重构游戏引擎核心逻辑
- 重新设计了引擎的初始化和运行流程 - 引入了实体组件系统(ECS)和物理系统 - 优化了渲染系统和输入系统 - 移除了不必要的资源管理系统 - 调整了日志系统的实现
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user