当前位置: 首页 > news >正文

cherno引擎课 -

感谢b站星云图形的翻译:【双语】【最佳游戏引擎教程实战】【入门】(1):Introducing the GAME ENGINE series!_哔哩哔哩_bilibili

Introducing the GAMEENGINE series 

希望:它是一个制作(互动)3D实时渲染应用程序的引擎。

本质是一个数据转换机器,基本上就是读取数据,然后引擎对数据进行某些处理。

什么是游戏引擎

我们要构建的是一种,读取文件、转换、然后展现到屏幕上的东西,且有交互能力。程序的具体行为是面向数据的,而非硬编码的。

游戏引擎通常包含一个平台、一套工具,可以创建那些资产。它为我们提供创建资源的方式。

比如用 PS 做纹理、用 3D Studio Max 或者 Maya 或者 Blender 等制作3D模型,但是工作的最后仍然需要将那个3D模型转换为游戏引擎真正接受的格式。因为对于大多数正经的大型游戏引擎,几乎从来不会直接读取 png、jpeg 或者 obj 模型之类的。它们通常会读取游戏引擎特定的内建的自定义的格式。可能是纹理、模型、关卡等等

内容创作者有职责把模型从第三方格式转换为游戏引擎格式,比如要定义所有引擎需要的东西,要对那个模型做一些事情。因为通常来说,引擎可能需要更多从 Maya 导出的模型本身包含的数据。

为了让我们的数据转换更方便,我们需要大量的各种各样的系统,包括平台抽象层,能让我们的代码运行在不同的平台上。

DESIGNING our GAME ENGINE

先聚焦于构建需要的最小的基础框架,能够运行,然后我们不停迭代、增强、增加更多特性、提高稳定性、更好的性能和优化,和其他之类的事情。

一个游戏引擎需要些什么(只是看看要包括些什么,并不是实现的顺序)。

第一点要做的是需要一个入口点:Entry Point

一个入口点本质上就是当我们希望我们的应用程序或者游戏使用这个引擎启动的时候会发生什么。比如是什么控制了 main 函数?什么控制了main函数的代码执行?

之后要有一个 Application Layout (应用层):处理程序的生命周期和事件之类的东西的那部分代码。比如说我们的主循环,也就是保持我们的程序运行和渲染的那个循环,也就是保持时间流动的那个循环。也就是执行(驱动)我们的游戏希望执行的全部代码的那个循环。关于事件比如改变窗口大小或者关闭窗口,或者输入事件,比如鼠标或者键盘,所有这些东西都要在应用层处理。

我们需要一种方式来让我们的游戏或者引擎作为一个实际的应用程序运行在任何可能要运行的平台上,这就是应用层要解决的。

接下来需要一个 Window Layout (窗口层)。然后在这一层里面我们要处理 input (输入)和 event (事件)。由于输入可以放到事件里面(输入事件),所以我们的事件管理系统会处理输入事件,从我们的窗口和应用程序捕获输入事件。事件管理系统也会是非常重要的东西,我们需要构建一个非常基础的消息和广播系统。基础的意思是说只要,我们应用程序内的某些层可以订阅事件。并且当事件发生的时候,可以从应用层的堆栈获得通知。当事件传播到那些层的时候,那些层可以选择是否要把事件传播到哪些东西,就像一个所有者系统。某种程度上它就是一个基础的消息系统。当事件发生的时候,我们可以中断,或者不是真的中断。总之事件发生的时候,然后我们会得到通知,本质上就是因为我们的 onEvent() 函数会被调用。

然后是渲染器 Render ,可能会是我们需要处理的最大的系统之一。渲染器就是实际渲染图形到屏幕上的那个东西。

接下来是 Render API abstraction 。最开始我们只会用 OpenGL ,之后还需要各种 API 。我们要把所有的东西设置成API无关的,这样新增一种 API 就不是完全重写。显然有的东西不得不是API独特的,比如我们可以就写一个叫 “上载纹理” 的函数,然后为四种API各做一个实现不同,因为我们创建渲染器的方式会因为API而不同。因为如果你用Vulkan的方式,相比于使用OpenGL的方式做特定的事情的时候vulkan可能会更高效。因此我们仍然需要写两份代码,而不是把每个 OpenGL 的函数拷贝一份

接着是 Debugging Support 调试支持。就比如日志系统,比如性能,为此我们需要一种分析系统,我们希望应用程序能有一种特殊的运行方式,在 VisualStudio 设置之外的特殊的模式。我们希望应用程序能够自己运行调试,因此可以运行在任何平台上。而不用担心,运行特定平台可用的特定工具。我们希望把工具代码插入到自己的代码中,但是(工具代码)只在调试模式下运行。可以为每个函数计时并且汇总成好看的视图,任何也许用某种工具查看之类的。

然后还希望有一些 Scripting 脚本,比如 Lua 或者 C# 或者 Python 之类的。需要脚本语言,避免完全使用 C++。我们可以像艺术家和内容创造者那样轻松地写高级脚本语言而不用担心内存的问题。

还有 Memory System 内存系统。需要管理好资源。以及调试内存之类的。

还需要实体组件系统(ECS,Entity Component System)。这是一种让我们能在世界创建游戏对象的模块化的方式。比如让世界里的每个独立实体或游戏对象能包含特定的组件或系统,因此我们能定义行为以及动作的具体细节。它就是一种让我们能定义引擎要对实体做的事情的方式。

还需要 Physics Solution 物理解算。

还有 File I/O ,VFS(虚拟文件系统)

还有Build System 构建系统,把3D模型或材质需要能转换为自定义格式,那是为我们的引擎优化的格式。所以不用在运行时浪费时间转换格式,因为我们可以离线处理。热交换资产,希望比如开着 PS 在纹理上画了一些东西,按下 Ctrl + S,我们希望在运行时构建系统捕获然后实时地重新构建导入游戏,所以我们能更新东西,甚至比如3D模型,调整一些顶点或者进行某种修改,然后就热交换到引擎里。所以我们能在游戏运行时修改,这不是一个非常重要的系统,现在可能不值得讨论。

不过暂时我们只支持Windows只支持OpenGL。我们的C++代码文件里不会包含任何Windows代码,比如 Win32 API 代码。因为显然引擎要在未来支持其他的平台。所以会抽象那些东西,保证平台或渲染API独特的代码分散在它自己的文件里。在其他平台或者渲染API的时候它们不会被编译

Project Setup

这一节我们要设置好所有东西:Github仓库、Visual Studio 解决方案和项目、依赖配置,然后我们要链接项目到一起,做一个屏幕上打印 Hello World 的简单程序。但是会为我们的游戏引擎组织好结构和配置。

GitHub上建立好工程,选择 Apache-2.0 License ,具体选什么 License 可以看下面这个图:

然后在 VS 中创建好工程,并且 git clone 一下:(这里因为文件夹非空会有冲突,所以我们先创建到 Git 文件夹中,但是关心的是里头的内容,然后选择复制粘贴出来)

博文参考:Cherno_游戏引擎系列教程(1):1~16_game engine series-CSDN博客

Cherno游戏引擎笔记记录(1~14)_c++cherno游戏引擎-CSDN博客


http://www.mrgr.cn/news/69780.html

相关文章:

  • 制作图片木马
  • 【前端】深入浅出 - TypeScript 的详细讲解
  • 【Elasticsearch】Elasticsearch集成Spring Boot
  • [CKS] 使用ingress公开https服务
  • Vue3 : Tailwindcss之margin样式类
  • Sql server查询数据库表的数量
  • 计算机网络-1.2分层结构
  • PostgreSQL 开启密码验证插件
  • 医学图像算法之基于Unet的视网膜血管分割
  • 【Lucene】从文本到索引:Lucene如何构建索引
  • 伊洛瓦底江
  • 存贷款调整 20241110
  • Linux进程信号
  • “穿梭于容器之间:C++ STL迭代器的艺术之旅”
  • 【CLIP系列】开篇
  • GIN:逼近WL-test的GNN架构
  • 信息泄露漏洞一文速通
  • 【Hadoop实训】Hive 数据操作①
  • 全面解析 Python typing模块与静态类型注解:从基础到高级
  • 寻找伤感短视频素材 这些网站帮你轻松下载无水印资源
  • 图片搜索引擎,来快速实现一个高性能的本地图片搜索引擎
  • 《浔川 AI 翻译 v3.0 或面临取消发布困境》
  • 【VScode】Html+Css+JavaScript学习计划表
  • 《TCP/IP网络编程》学习笔记 | Chapter 7:优雅地断开套接字连接
  • 医院一体化监控运维:保障医疗信息化稳定运行的智慧之选
  • 【优选算法 — 滑动窗口】最大连续1的个数 将 x 减到0的最小操作数