游戏引擎MiniEngine开发记录(一)
最近看了Youtube大神The Cherno的Game Engine系列,学习到了很多知识,但是作者前期做的很多工作后期都推翻重构了,很多地方写的也很乱,因此想从自己的角度重新实现一个类似的游戏引擎。
引擎使用C++开发,集成glad,glfw,imgui,spdlog,entt,glm,stb,assimp这些库,不得不感叹C++的库真的强大,把这些库集成起来其实就能做出一个不错的渲染引擎了。
基本环境搭建
我选择使用CLion作为IDE进行开发,一方面CLion跨平台,并且和Rider都是Jetbrains公司的产品,界面差不多,用起来很舒服。
可以下载一个Jetbrains ToolBox,这样就可以很轻松的管理自己的IDE了。
在CLion中,新建一个项目,取名MiniEngine,语言标准选择C++17
之后下载需要的包:
有release版本的都下载release版本
比较特殊,下载docking分支的文件
然后需要这些文件,包括核心文件和glfw实现需要的文件
下载完成之后,可以在项目下新建一个ThirdParty文件夹,把这些库放进去
然后编辑CmakeLists.txt
cmake_minimum_required(VERSION 3.23)
project(MiniEngine)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
add_subdirectory(Engine/ThirdParty/glfw)
add_subdirectory(Engine/ThirdParty/spdlog)
add_subdirectory(Engine/ThirdParty/entt)
add_subdirectory(Engine/ThirdParty/assimp/assimp-5.2.5)
add_subdirectory(Engine/ThirdParty/glm)
include_directories(Engine/ThirdParty/imgui)
include_directories(Engine/ThirdParty/glad/include)
include_directories(Engine/Core)
aux_source_directory(Engine/ThirdParty/imgui imgui)
aux_source_directory(Engine/ThirdParty/stb_image stb_image)
aux_source_directory(Engine/Core core)
add_executable(main main.cpp gl.c ${imgui} ${core} ${stb_image})
target_link_libraries(main PUBLIC glfw spdlog)
项目目录
Core为核心层,包括引擎核心代码,各种系统如日志等
Editor为以后要实现的编辑器层,方便使用
Function为各种函数,如各种运算等
Platform为平台无关层
Resource为资源层
集成日志系统
今天先集成日志系统
为了方便使用Log.h为一个静态类,声明了两个静态变量,都是spdlog中的一个logger,用于打印日志信息,使用静态类我们可以不实例化类对象就直接在各处打印日志,很方便。
//Log.h
#ifndef MINIENGINE_LOG_H
#define MINIENGINE_LOG_H
#include "spdlog/spdlog.h"
namespace mini {
//静态类
class Log {
public:
//静态成员函数
static void Init();
static std::shared_ptr<spdlog::logger> &GetCoreLogger() { return s_core_logger_; }
static std::shared_ptr<spdlog::logger> &GetClientLogger() { return s_client_logger_; }
private:
//静态变量
static std::shared_ptr<spdlog::logger> s_core_logger_;
static std::shared_ptr<spdlog::logger> s_client_logger_;
};
}
//各种宏定义,方便使用
#define MINI_CORE_TRACE(...) ::mini::Log::GetCoreLogger()->trace(__VA_ARGS__)
#define MINI_CORE_INFO(...) ::mini::Log::GetCoreLogger()->info(__VA_ARGS__)
#define MINI_CORE_WARN(...) ::mini::Log::GetCoreLogger()->warn(__VA_ARGS__)
#define MINI_CORE_ERROR(...) ::mini::Log::GetCoreLogger()->error(__VA_ARGS__)
#define MINI_CORE_CRITICAL(...) ::mini::Log::GetCoreLogger()->critical(__VA_ARGS__)
#define MINI_CORE_ASSERT(x, ...) { if(!(x)) { MINI_CORE_ERROR("Assertion Failed: {0}", __VA_ARGS__); __debugbreak(); } }
#define MINI_TRACE(...) ::mini::Log::GetCoreLogger()->trace(__VA_ARGS__)
#define MINI_INFO(...) ::mini::Log::GetCoreLogger()->info(__VA_ARGS__)
#define MINI_WARN(...) ::mini::Log::GetCoreLogger()->warn(__VA_ARGS__)
#define MINI_ERROR(...) ::mini::Log::GetCoreLogger()->error(__VA_ARGS__)
#define MINI_CRITICAL(...) ::mini::Log::GetCoreLogger()->critical(__VA_ARGS__)
#define MINI_ASSERT(x, ...) { if(!(x)) { MINI_ERROR("Assertion Failed: {0}", __VA_ARGS__); __debugbreak(); } }
#endif //MINIENGINE_LOG_H
//Log.cpp
#include "Log.h"
#include "spdlog/sinks/stdout_color_sinks.h"
namespace mini {
std::shared_ptr<spdlog::logger> Log::s_core_logger_;
std::shared_ptr<spdlog::logger> Log::s_client_logger_;
void Log::Init() {
spdlog::set_pattern("%^[%T] %n: %v%$");
s_core_logger_ = spdlog::stdout_color_mt("MINI");
s_core_logger_->set_level(spdlog::level::trace);
s_client_logger_ = spdlog::stdout_color_mt("APP");
s_client_logger_->set_level(spdlog::level::trace);
}
}
Engine为引擎类,是最核心的一个类,目前只有初始化,启动,关闭和构造,析构函数,后面会不断拓展
//Engine类
#ifndef MINIENGINE_ENGINE_H
#define MINIENGINE_ENGINE_H
#include "string"
#include "Log.h"
#include "memory"
namespace mini {
class Engine {
public:
explicit Engine(const std::string &name = "");
~Engine();
void Initialize();
void Run();
void Close();
private:
};
}
#endif //MINIENGINE_ENGINE_H
在构造函数中,我们初始化Log系统,然后在开始启动的时候,测试打印一下日志,然后进入一个死循环
#include "Engine.h"
namespace mini{
Engine::Engine(const std::string &name) {
Log::Init();
}
Engine::~Engine() = default;
void Engine::Close() {
}
void Engine::Run() {
MINI_CORE_INFO("Engine Start!");
while (true){
}
}
void Engine::Initialize() {
}
}
main函数目前很简单,实例化一个引擎对象,然后启动即可
#include "memory"
#include "Engine.h"
int main()
{
const auto engine=std::make_unique<mini::Engine>();
engine->Run();
return 0;
}
运行
运行之后,看到打印出的日志,说明集成日志系统成功
GitHub
https://github.com/luoxiaozhu1998/MiniEngine
Gitee
https://gitee.com/lz19980618/MiniEngine
标签:Engine,__,游戏,MINI,mini,MiniEngine,引擎,define,Log From: https://www.cnblogs.com/luoxiaozhu1998/p/16964808.html