Hazel Engine深度剖析:从入门到精通的2D/3D渲染引擎架构详解
引言:为什么选择Hazel Engine?
你是否还在为选择合适的游戏引擎而烦恼?是否想要深入了解游戏引擎的内部工作原理?Hazel Engine将为你提供一个理想的学习和开发平台。作为一款由知名开发者TheCherno打造的开源游戏引擎,Hazel Engine不仅具备强大的2D/3D渲染能力,还致力于成为游戏引擎设计与架构的教育工具。通过本文,你将全面了解Hazel Engine的架构设计、核心模块、使用方法以及未来发展方向,让你从入门到精通,轻松掌握这款强大引擎的方方面面。
Hazel Engine概述
Hazel Engine是一个主要针对Windows平台的早期交互式应用和渲染引擎。虽然目前实现的功能还不算丰富,但几乎所有代码都伴随着YouTube视频教程,你可以在thecherno.com/engine找到相关内容。Hazel Engine的开发理念是双重的:一方面打造强大的3D引擎,另一方面作为游戏引擎设计和架构的教学工具。因此,该仓库的开发速度相对较慢,因为所有内容都需要在镜头前进行教学和实现。
Hazel Engine的源代码托管在https://gitcode.com/gh_mirrors/ha/Hazel,遵循MIT许可证开源。引擎的主要特点包括:
- 快速2D渲染(UI、粒子、精灵等)
- 高保真基于物理的3D渲染(将在2D之后扩展)
- 跨平台支持(Windows、Mac、Linux、Android和iOS)
- 原生渲染API支持(DirectX、Vulkan、Metal)
- 功能齐全的查看器和编辑器应用程序
- 完全脚本化的交互和行为
- 集成第三方2D和3D物理引擎
- 程序化地形和世界生成
- 人工智能系统
- 音频系统
快速开始:Hazel Engine环境搭建
要开始使用Hazel Engine,你需要按照以下步骤进行环境配置:
1. 下载仓库
首先,使用以下命令克隆仓库:
git clone --recursive https://gitcode.com/gh_mirrors/ha/Hazel
如果你之前非递归克隆了仓库,可以使用以下命令克隆必要的子模块:
git submodule update --init
2. 配置依赖项
- 运行位于
scripts文件夹中的Setup.bat文件。这将下载项目所需的先决条件(如果尚未存在)。 - 其中一个先决条件是Vulkan SDK。如果尚未安装,脚本将执行
VulkanSDK.exe文件,并提示用户安装SDK。 - 安装完成后,再次运行Setup.bat文件。如果Vulkan SDK安装正确,它将下载Vulkan SDK调试库(这可能需要较长时间)。
- 下载并解压缩文件后,Win-GenProjects.bat脚本文件将自动执行,为用户生成Visual Studio解决方案文件。
如果进行了更改,或者想要重新生成项目文件,请重新运行scripts文件夹中的Win-GenProjects.bat脚本文件。
核心架构:Hazel Engine的分层设计
Hazel Engine采用了清晰的分层架构,使得代码组织有序且易于维护。下面我们将深入探讨引擎的核心模块。
应用程序核心(Application Core)
应用程序核心是Hazel Engine的基础,负责管理应用程序的生命周期、窗口创建和事件处理。核心类Application定义在Hazel/src/Hazel/Core/Application.h中,它包含了应用程序的主要逻辑。
Application类的主要功能包括:
- 应用程序初始化和关闭
- 事件处理
- 图层管理
- 主循环运行
以下是Application类的关键代码片段:
class Application
{
public:
Application(const ApplicationSpecification& specification);
virtual ~Application();
void OnEvent(Event& e);
void PushLayer(Layer* layer);
void PushOverlay(Layer* layer);
Window& GetWindow() { return *m_Window; }
void Close();
static Application& Get() { return *s_Instance; }
const ApplicationSpecification& GetSpecification() const { return m_Specification; }
void SubmitToMainThread(const std::function<void()>& function);
private:
void Run();
bool OnWindowClose(WindowCloseEvent& e);
bool OnWindowResize(WindowResizeEvent& e);
void ExecuteMainThreadQueue();
private:
ApplicationSpecification m_Specification;
Scope<Window> m_Window;
ImGuiLayer* m_ImGuiLayer;
bool m_Running = true;
bool m_Minimized = false;
LayerStack m_LayerStack;
float m_LastFrameTime = 0.0f;
std::vector<std::function<void()>> m_MainThreadQueue;
std::mutex m_MainThreadQueueMutex;
private:
static Application* s_Instance;
friend int ::main(int argc, char** argv);
};
渲染系统(Renderer)
渲染系统是Hazel Engine的核心模块之一,负责处理2D和3D图形的渲染。渲染系统的主要类Renderer定义在Hazel/src/Hazel/Renderer/Renderer.h中。
Renderer类提供了以下核心功能:
- 初始化和关闭渲染系统
- 窗口大小调整处理
- 场景渲染开始和结束
- 提交渲染命令
以下是Renderer类的关键代码片段:
class Renderer
{
public:
static void Init();
static void Shutdown();
static void OnWindowResize(uint32_t width, uint32_t height);
static void BeginScene(OrthographicCamera& camera);
static void EndScene();
static void Submit(const Ref<Shader>& shader, const Ref<VertexArray>& vertexArray, const glm::mat4& transform = glm::mat4(1.0f));
static RendererAPI::API GetAPI() { return RendererAPI::GetAPI(); }
private:
struct SceneData
{
glm::mat4 ViewProjectionMatrix;
};
static Scope<SceneData> s_SceneData;
};
Hazel Engine的渲染系统支持多种渲染API,包括DirectX、Vulkan和Metal,这使得引擎能够在不同平台上发挥最佳性能。
场景系统(Scene)
场景系统负责管理游戏世界中的实体和组件。Scene类定义在Hazel/src/Hazel/Scene/Scene.h中,它使用ECS(实体组件系统)架构来组织游戏对象。
Scene类的主要功能包括:
- 创建和销毁实体
- 实体组件管理
- 场景更新和渲染
- 物理世界管理
以下是Scene类的关键代码片段:
class Scene
{
public:
Scene();
~Scene();
static Ref<Scene> Copy(Ref<Scene> other);
Entity CreateEntity(const std::string& name = std::string());
Entity CreateEntityWithUUID(UUID uuid, const std::string& name = std::string());
void DestroyEntity(Entity entity);
void OnRuntimeStart();
void OnRuntimeStop();
void OnSimulationStart();
void OnSimulationStop();
void OnUpdateRuntime(Timestep ts);
void OnUpdateSimulation(Timestep ts, EditorCamera& camera);
void OnUpdateEditor(Timestep ts, EditorCamera& camera);
void OnViewportResize(uint32_t width, uint32_t height);
Entity DuplicateEntity(Entity entity);
Entity FindEntityByName(std::string_view name);
Entity GetEntityByUUID(UUID uuid);
Entity GetPrimaryCameraEntity();
bool IsRunning() const { return m_IsRunning; }
bool IsPaused() const { return m_IsPaused; }
void SetPaused(bool paused) { m_IsPaused = paused; }
void Step(int frames = 1);
template<typename... Components>
auto GetAllEntitiesWith()
{
return m_Registry.view<Components...>();
}
private:
template<typename T>
void OnComponentAdded(Entity entity, T& component);
void OnPhysics2DStart();
void OnPhysics2DStop();
void RenderScene(EditorCamera& camera);
private:
entt::registry m_Registry;
uint32_t m_ViewportWidth = 0, m_ViewportHeight = 0;
bool m_IsRunning = false;
bool m_IsPaused = false;
int m_StepFrames = 0;
b2World* m_PhysicsWorld = nullptr;
std::unordered_map<UUID, entt::entity> m_EntityMap;
friend class Entity;
friend class SceneSerializer;
friend class SceneHierarchyPanel;
};
编辑器使用:Hazelnut编辑器详解
Hazel Engine附带了一个名为Hazelnut的编辑器应用程序,它允许开发者创建和编辑游戏场景、管理资源等。Hazelnut编辑器的源代码位于Hazelnut/src/目录下。
编辑器界面
Hazelnut编辑器的主要界面由多个面板组成,包括:
-
场景层级面板(Scene Hierarchy Panel):显示场景中的实体层级结构,允许选择和编辑实体。相关代码位于Hazelnut/src/Panels/SceneHierarchyPanel.cpp和Hazelnut/src/Panels/SceneHierarchyPanel.h。
-
内容浏览器面板(Content Browser Panel):允许浏览和管理项目资源,如纹理、模型、脚本等。相关代码位于Hazelnut/src/Panels/ContentBrowserPanel.cpp和Hazelnut/src/Panels/ContentBrowserPanel.h。
-
属性面板(Properties Panel):显示和编辑选中实体的组件属性。
-
视口面板(Viewport Panel):实时预览场景渲染结果,支持交互操作。
场景编辑工作流程
使用Hazelnut编辑器创建游戏场景的基本流程如下:
-
创建实体:点击场景层级面板中的"创建实体"按钮,选择实体类型(如空实体、2D精灵、3D模型等)。
-
添加组件:选中实体后,在属性面板中点击"添加组件"按钮,选择要添加的组件(如变换、渲染器、碰撞体等)。
-
编辑属性:在属性面板中调整实体和组件的属性,如位置、旋转、缩放、材质等。
-
保存场景:使用菜单栏中的"保存"选项保存场景,场景文件将以.hazel扩展名保存在项目的Assets/Scenes目录下。例如,Hazelnut/SandboxProject/Assets/Scenes/Example.hazel是一个示例场景文件。
-
运行游戏:点击编辑器工具栏中的"播放"按钮,在编辑器中预览游戏运行效果。
实践案例:使用Hazel Engine创建简单游戏
为了帮助你更好地理解Hazel Engine的使用方法,我们将通过一个简单的案例来演示如何使用引擎创建一个基本的2D游戏。
1. 创建Sandbox项目
Hazel Engine提供了一个Sandbox项目作为起点,你可以在Sandbox/目录下找到它。Sandbox项目包含了一些示例代码和资源,如Sandbox/src/Sandbox2D.cpp展示了如何创建一个简单的2D场景。
2. 添加精灵和物理
在Sandbox2D类中,你可以看到如何创建精灵实体并添加物理组件:
void Sandbox2D::OnCreate()
{
HZ_PROFILE_FUNCTION();
m_CheckerboardTexture = Hazel::Texture2D::Create("assets/textures/Checkerboard.png");
m_Scene = Hazel::CreateRef<Hazel::Scene>();
auto square = m_Scene->CreateEntity("Square");
square.AddComponent<Hazel::SpriteRendererComponent>(glm::vec4{ 0.8f, 0.2f, 0.3f, 1.0f });
auto cameraEntity = m_Scene->CreateEntity("Camera");
cameraEntity.AddComponent<Hazel::CameraComponent>();
}
3. 处理输入和更新游戏逻辑
在Sandbox2D类的OnUpdate方法中,你可以处理输入并更新游戏逻辑:
void Sandbox2D::OnUpdate(Hazel::Timestep ts)
{
HZ_PROFILE_FUNCTION();
// 更新相机位置
if (Hazel::Input::IsKeyPressed(HZ_KEY_A))
m_CameraPosition.x -= m_CameraMoveSpeed * ts;
else if (Hazel::Input::IsKeyPressed(HZ_KEY_D))
m_CameraPosition.x += m_CameraMoveSpeed * ts;
if (Hazel::Input::IsKeyPressed(HZ_KEY_W))
m_CameraPosition.y += m_CameraMoveSpeed * ts;
else if (Hazel::Input::IsKeyPressed(HZ_KEY_S))
m_CameraPosition.y -= m_CameraMoveSpeed * ts;
// 更新场景
m_Scene->OnUpdateEditor(ts, m_Camera);
// 渲染
Hazel::Renderer2D::BeginScene(m_Camera);
// 绘制精灵和其他2D元素
Hazel::Renderer2D::DrawQuad(glm::vec2(0.0f, 0.0f), glm::vec2(1.0f, 1.0f), m_CheckerboardTexture, 10.0f);
Hazel::Renderer2D::EndScene();
}
4. 运行和测试游戏
完成代码编写后,你可以使用Hazelnut编辑器打开Sandbox项目,并运行游戏进行测试。Sandbox项目的配置文件位于Hazelnut/SandboxProject/Sandbox.hproj。
未来展望:Hazel Engine的发展路线图
Hazel Engine的开发团队制定了清晰的发展路线图,计划在未来实现更多强大功能。以下是一些主要的短期和长期目标:
短期目标(2020年底前)
- 使用Hazel游戏引擎制作一款游戏
- 实现完整的2D工作流程:
- 使用Hazelnut(Hazel编辑器)设计游戏场景
- 在Hazelnut中测试游戏,包括保存/加载创建的游戏
- 在Sandbox中加载和玩游戏
- 支持在所有桌面平台(Windows、Mac和Linux)上运行游戏
长期目标
- 完善3D渲染系统,实现基于物理的渲染(PBR)
- 增强AI系统,支持复杂的游戏逻辑和行为
- 开发更强大的音频系统,支持3D空间音频
- 优化移动端性能,提供更好的触摸控制支持
- 扩展编辑器功能,支持更多高级特性如动画编辑、粒子系统设计等
总结
Hazel Engine是一款功能强大且易于学习的开源游戏引擎,它不仅提供了高效的2D/3D渲染能力,还致力于成为游戏引擎设计与架构的教育工具。通过本文的介绍,你已经了解了Hazel Engine的基本架构、环境搭建、核心模块和使用方法。
无论你是游戏开发新手还是有经验的开发者,Hazel Engine都能为你提供一个理想的平台来实现你的创意。如果你想深入学习游戏引擎开发,Hazel Engine的源代码和配套视频教程将是你宝贵的学习资源。
现在,是时候动手尝试使用Hazel Engine创建你自己的游戏了!祝你在游戏开发的道路上取得成功!
如果你对Hazel Engine有任何疑问或建议,欢迎参与社区讨论,与其他开发者分享你的经验和见解。让我们一起为Hazel Engine的发展贡献力量!
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00
