MiMoEngine ASM: x86-64 MASM汇编+C混合架构游戏引擎

核心热路径(数学/内存/字符串/性能分析)用MASM汇编(SSE/AVX2)
外围系统(窗口/渲染/ECS/音频/UI/脚本)用C语言
含自研编辑器、VisualScript积木编程、中文渲染(glyph_atlas)
This commit is contained in:
shuiyu1123 committed 2026-07-10 19:20:40 +08:00
commit 2d56cb3bc9
91 files changed
+9988

No files matched your search

+157
View File
@@ -0,0 +1,157 @@
// ============================================================================
// engine.c - 引擎核心实现
// ============================================================================
#include "engine.h"
#include "logger.h"
#include "timer.h"
#include "../Window/window.h"
#include "../include/engine_api.h"
#include <stdlib.h>
#include <Windows.h>
// 引擎实例 (单例)
static Engine g_engine = {0};
// 回调
static EngineUpdateCallback g_update_callback = NULL;
static EngineRenderCallback g_render_callback = NULL;
static EngineKeyCallback g_key_callback = NULL;
static EngineResizeCallback g_resize_callback = NULL;
// 内部函数
static void on_key(int key) {
if (g_key_callback) {
g_key_callback(&g_engine, key);
}
if (key == VK_ESCAPE) {
engine_request_quit(&g_engine);
}
}
static void on_resize(int width, int height) {
if (g_resize_callback) {
g_resize_callback(&g_engine, width, height);
}
}
Engine* engine_create(void) {
return &g_engine;
}
void engine_destroy(Engine* engine) {
if (engine) {
engine_shutdown(engine);
}
}
int engine_init(Engine* engine, const EngineConfig* config) {
if (engine->initialized) return 1;
engine->config = *config;
// 初始化日志
logger_init("engine.log");
LOG_INFO("Initializing MiMo Engine ASM...");
// 初始化计时器
timer_init();
// 创建窗口
engine->window = window_create(
config->app_name,
config->window_width,
config->window_height,
config->fullscreen
);
if (!engine->window) {
LOG_ERROR("Failed to create window!");
return 0;
}
// 设置回调
window_set_key_callback(engine->window, on_key);
window_set_resize_callback(engine->window, on_resize);
LOG_INFO("Window created: %dx%d", config->window_width, config->window_height);
engine->initialized = 1;
engine->running = 1;
engine->frame_count = 0;
LOG_INFO("MiMo Engine ASM initialized successfully.");
return 1;
}
void engine_run(Engine* engine) {
if (!engine->initialized) {
LOG_ERROR("Engine not initialized!");
return;
}
while (engine->running) {
// 处理窗口消息
if (!window_process_messages(engine->window)) {
engine->running = 0;
break;
}
// 更新计时
timer_tick();
engine->delta_time = timer_get_delta();
engine->total_time = timer_get_total();
engine->frame_count++;
// 用户更新
if (g_update_callback) {
g_update_callback(engine, engine->delta_time);
}
// 用户渲染
if (g_render_callback) {
g_render_callback(engine);
}
}
}
void engine_shutdown(Engine* engine) {
if (!engine->initialized) return;
LOG_INFO("Shutting down MiMo Engine ASM...");
if (engine->renderer) {
// renderer_destroy(engine->renderer);
engine->renderer = NULL;
}
if (engine->window) {
window_destroy(engine->window);
engine->window = NULL;
}
logger_shutdown();
engine->initialized = 0;
engine->running = 0;
}
void engine_request_quit(Engine* engine) {
engine->running = 0;
}
// 回调设置
void engine_set_update_callback(Engine* engine, EngineUpdateCallback callback) {
g_update_callback = callback;
}
void engine_set_render_callback(Engine* engine, EngineRenderCallback callback) {
g_render_callback = callback;
}
void engine_set_key_callback(Engine* engine, EngineKeyCallback callback) {
g_key_callback = callback;
}
void engine_set_resize_callback(Engine* engine, EngineResizeCallback callback) {
g_resize_callback = callback;
}
+61
View File
@@ -0,0 +1,61 @@
#pragma once
// ============================================================================
// engine.h - 引擎核心
// ============================================================================
#include <stdint.h>
// 前向声明
typedef struct Window Window;
// 引擎配置
typedef struct {
const char* app_name;
int window_width;
int window_height;
int fullscreen;
int vsync;
} EngineConfig;
// 引擎状态
typedef struct {
int running;
int initialized;
EngineConfig config;
Window* window;
void* renderer;
double delta_time;
double total_time;
uint64_t frame_count;
} Engine;
// 初始化默认配置
static inline EngineConfig engine_default_config(void) {
EngineConfig config;
config.app_name = "MiMo Engine ASM";
config.window_width = 1280;
config.window_height = 720;
config.fullscreen = 0;
config.vsync = 1;
return config;
}
// 引擎函数
Engine* engine_create(void);
void engine_destroy(Engine* engine);
int engine_init(Engine* engine, const EngineConfig* config);
void engine_run(Engine* engine);
void engine_shutdown(Engine* engine);
void engine_request_quit(Engine* engine);
// 回调
typedef void (*EngineUpdateCallback)(Engine* engine, double delta_time);
typedef void (*EngineRenderCallback)(Engine* engine);
typedef void (*EngineKeyCallback)(Engine* engine, int key);
typedef void (*EngineResizeCallback)(Engine* engine, int width, int height);
void engine_set_update_callback(Engine* engine, EngineUpdateCallback callback);
void engine_set_render_callback(Engine* engine, EngineRenderCallback callback);
void engine_set_key_callback(Engine* engine, EngineKeyCallback callback);
void engine_set_resize_callback(Engine* engine, EngineResizeCallback callback);
+73
View File
@@ -0,0 +1,73 @@
// ============================================================================
// logger.c - 日志系统实现
// ============================================================================
#include "logger.h"
#include <stdio.h>
#include <stdarg.h>
#include <time.h>
#include <string.h>
static FILE* g_log_file = NULL;
static LogLevel g_log_level = LOG_TRACE;
static const char* level_strings[] = {
"TRACE", "DEBUG", "INFO ", "WARN ", "ERROR", "FATAL"
};
void logger_init(const char* log_file) {
if (log_file) {
g_log_file = fopen(log_file, "w");
if (g_log_file) {
fprintf(g_log_file, "=== MiMo Engine ASM Log ===\n");
fflush(g_log_file);
}
}
printf("=== MiMo Engine ASM Log ===\n");
}
void logger_shutdown(void) {
if (g_log_file) {
fclose(g_log_file);
g_log_file = NULL;
}
}
void logger_set_level(LogLevel level) {
g_log_level = level;
}
void logger_log(LogLevel level, const char* file, int line, const char* fmt, ...) {
if (level < g_log_level) return;
// 时间戳
time_t now = time(NULL);
struct tm* tm_info = localtime(&now);
char time_str[20];
strftime(time_str, sizeof(time_str), "%H:%M:%S", tm_info);
// 文件名 (去掉路径)
const char* filename = strrchr(file, '\\');
if (!filename) filename = strrchr(file, '/');
if (filename) filename++; else filename = file;
// 格式化消息
char msg[2048];
va_list args;
va_start(args, fmt);
vsnprintf(msg, sizeof(msg), fmt, args);
va_end(args);
// 输出到控制台
if (level >= LOG_WARN) {
fprintf(stderr, "[%s] [%s] %s:%d - %s\n", time_str, level_strings[level], filename, line, msg);
} else {
printf("[%s] [%s] %s:%d - %s\n", time_str, level_strings[level], filename, line, msg);
}
// 输出到文件
if (g_log_file) {
fprintf(g_log_file, "[%s] [%s] %s:%d - %s\n", time_str, level_strings[level], filename, line, msg);
fflush(g_log_file);
}
}
+35
View File
@@ -0,0 +1,35 @@
#pragma once
// ============================================================================
// logger.h - 日志系统
// ============================================================================
#include <stdio.h>
// 日志级别
typedef enum {
LOG_TRACE = 0,
LOG_DEBUG,
LOG_INFO,
LOG_WARN,
LOG_ERROR,
LOG_FATAL
} LogLevel;
// 初始化/关闭
void logger_init(const char* log_file);
void logger_shutdown(void);
// 设置日志级别
void logger_set_level(LogLevel level);
// 日志函数
void logger_log(LogLevel level, const char* file, int line, const char* fmt, ...);
// 便捷宏
#define LOG_TRACE(...) logger_log(LOG_TRACE, __FILE__, __LINE__, __VA_ARGS__)
#define LOG_DEBUG(...) logger_log(LOG_DEBUG, __FILE__, __LINE__, __VA_ARGS__)
#define LOG_INFO(...) logger_log(LOG_INFO, __FILE__, __LINE__, __VA_ARGS__)
#define LOG_WARN(...) logger_log(LOG_WARN, __FILE__, __LINE__, __VA_ARGS__)
#define LOG_ERROR(...) logger_log(LOG_ERROR, __FILE__, __LINE__, __VA_ARGS__)
#define LOG_FATAL(...) logger_log(LOG_FATAL, __FILE__, __LINE__, __VA_ARGS__)
+78
View File
@@ -0,0 +1,78 @@
// ============================================================================
// timer.c - 高精度计时器实现 (使用 rdtsc.asm)
// ============================================================================
#include "timer.h"
#include "../include/engine_api.h"
#include <Windows.h>
static double g_seconds_per_count = 0.0;
static int64_t g_prev_time = 0;
static int64_t g_curr_time = 0;
static int64_t g_start_time = 0;
static double g_delta_time = 0.0;
static double g_total_time = 0.0;
static double g_fps = 0.0;
static uint64_t g_frame_count = 0;
static double g_fps_accumulator = 0.0;
static uint64_t g_fps_frame_count = 0;
void timer_init(void) {
// 使用 QueryPerformanceCounter 获取高精度时间
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
g_seconds_per_count = 1.0 / (double)freq.QuadPart;
LARGE_INTEGER now;
QueryPerformanceCounter(&now);
g_start_time = now.QuadPart;
g_prev_time = now.QuadPart;
g_curr_time = now.QuadPart;
g_delta_time = 0.0;
g_total_time = 0.0;
g_fps = 0.0;
g_frame_count = 0;
g_fps_accumulator = 0.0;
g_fps_frame_count = 0;
}
void timer_reset(void) {
timer_init();
}
void timer_tick(void) {
LARGE_INTEGER now;
QueryPerformanceCounter(&now);
g_curr_time = now.QuadPart;
g_delta_time = (g_curr_time - g_prev_time) * g_seconds_per_count;
g_total_time = (g_curr_time - g_start_time) * g_seconds_per_count;
g_prev_time = g_curr_time;
g_frame_count++;
g_fps_frame_count++;
g_fps_accumulator += g_delta_time;
if (g_fps_accumulator >= 1.0) {
g_fps = (double)g_fps_frame_count / g_fps_accumulator;
g_fps_frame_count = 0;
g_fps_accumulator = 0.0;
}
}
double timer_get_delta(void) {
return g_delta_time;
}
double timer_get_total(void) {
return g_total_time;
}
double timer_get_fps(void) {
return g_fps;
}
uint64_t timer_get_frame_count(void) {
return g_frame_count;
}
+28
View File
@@ -0,0 +1,28 @@
#pragma once
// ============================================================================
// timer.h - 高精度计时器
// ============================================================================
#include <stdint.h>
// 初始化计时器
void timer_init(void);
// 重置计时器
void timer_reset(void);
// 更新一帧
void timer_tick(void);
// 获取帧间隔 (秒)
double timer_get_delta(void);
// 获取总时间 (秒)
double timer_get_total(void);
// 获取 FPS
double timer_get_fps(void);
// 获取帧数
uint64_t timer_get_frame_count(void);