MiMoEngine ASM: x86-64 MASM汇编+C混合架构游戏引擎
核心热路径(数学/内存/字符串/性能分析)用MASM汇编(SSE/AVX2) 外围系统(窗口/渲染/ECS/音频/UI/脚本)用C语言 含自研编辑器、VisualScript积木编程、中文渲染(glyph_atlas)
This commit is contained in:
commit
2d56cb3bc9
91 files changed
+9988
No files matched your search
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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__)
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
Reference in new issue
Block a user