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 可以看下面这个图:

这里我们把引擎选择编译成一个 DLL ,然后外部链接上最终的 exe ,选择 DLL 的原因是我们可以自己选择加载或者卸载 DLL ,主要的原因是我们会有很多依赖,我们会需要链接很多库到引擎里。如果用静态库的话,我们的所有的静态库都会被链接到游戏里面,我们的引擎依赖那些库,如果使用静态库的话,那些需要链接到引擎的库文件实际上全部会链接到游戏。用DLL的话基本上就像一个exe文件,所以我们可以把所有东西都链接到那个DLL,然后我们的游戏只会依赖那一个单独的包含了全部需要的内容的DLL文件,而不是无数的其他的库文件。

所以本质上我们要做的,就是把所有的依赖都链接到那个引擎的DLL文件,这意味着它们都需要是静态库。我们需要做的就是,把所有静态库链接到引擎DLL然后把引擎DLL链接到游戏。

(👆这一段没读懂,原视频是这么个意思,但是听不懂)

设置引擎为一个库文件(dll),在外部将库文件链接到外部的应用项目(exe)
      (静态库的形式类似于将一大堆库链接到游戏中)
      (动态库的形式类似于将一大堆外部库先链接到dll文件中,再将这个dll文件链接到游戏中,这样我们的游戏只会依赖于这一个dll文件)

Cherno游戏引擎笔记记录(1~14)_c++cherno游戏引擎-CSDN博客 的解释,这个听懂了

一些vs设置可以参考文章:Cherno_游戏引擎系列教程(1):1~16_game engine series-CSDN博客

Entry Point Game Engine Series

代码的结构:Hazel 是一个dll项目,Sandbox(沙盒) 是一个exe

什么是沙盒(sandbox)

sandbox(沙盒)是一种安全机制,用于限制程序的访问权限和行为范围。它创建了一个受限的执行环境,将程序隔离在其中,以防止恶意代码或不安全的操作对系统造成损害。

引擎入口点

引擎入口点(Engine Entry Point)通常指的是一个程序的起始执行位置,也可以被称为主函数(Main Function)。程序从这里开始执行,并按照预定的流程继续执行。
例如,在C语言中,引擎入口点通常被命名为main函数,它是程序的起始位置。在C++中,引擎入口点可以是全局的main函数,也可以是类的静态成员函数。

上一节我们的 Sandbox 的项目的 Application.cpp是这样写的:

namespace HEngine
{__declspec(dllimport) void Print();
}void main()
{HEngine::Print();
}

这意味着 main 函数是由 Application 定义的,但是引擎的入口应该由引擎负责定义,我们希望这些是由引擎端控制的。我们要在 Sandbox 项目里创建一个 Application 类,来定义和启动我们的应用程序。我们还要把 __declspec(dllimport) 和 __declspec(dllexport) 写到宏里,然后我们可以重用头文件。

宏(条件判断的实现逻辑)

#define 宏名称 值或代码

#ifdef 标识符
    // 如果标识符已经被定义,则编译这部分代码
#else
    // 如果标识符没有被定义,则编译这部分代码
#endif

宏不会自动定义。如果在 属性页 -> C++ -> 预处理器 中填入一个宏XXX,这意味着在编译代码时会自动在预处理阶段为XXX这个宏定义一个值。
这样不用手动编写一个宏,可以直接使用#ifdef语句进行条件判断。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/11552.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【自然资源】吉林一号卫星有关知识,你要了解

吉林一号卫星有关知识,你要了解 吉林一号商业卫星是中国第一套自主研发的商用遥感卫星星座,由长光卫星技术有限公司研制。 “吉林一号”商业卫星组星包括1颗光学遥感卫星、2颗视频卫星和1颗技术验证卫星,工作轨道均为高约650公里的太阳同步轨…

博图与Factory I/O结合实现运料小车自动往返四次控制

一、示例要求 按照上图所示完成运料小车的往返控制,由于对虚拟工厂中零件应用不熟悉,所以料斗门和小车底门都用M0.x代替完成;只对传送带有了解,因此此处借助传送带使得纸箱达到往返运动。 二、I/O分配表 类别元件I/O端口编号备注…

扩散模型和重新照明的未来

重新照明(relighting)是在给定输入场景的情况下,在指定的目标照明条件下渲染场景的任务。这是计算机视觉和图形学中的关键任务。然而,这是一个不适定问题,因为场景中物体的外观是由光源、几何形状和表面材料属性等因素…

想学习海量数据的管理方法?听这节课就够了

在大模型时代,由于模型规模的升级,需要处理的数据量也大幅增加,因此对数据管理提出了更高的要求。 首先,分布式存储系统对于企业来说至关重要,将数据分散存储在多个节点上,可以提高数据的访问速度和处理能…

Works With线上开发者大会将提供物联网行业深入的专业知识和技能

Silicon Labs2024年Works With线上开发者大会定于11月20日至21日举行,将汇集全球各地的物联网开发人员、设备制造商、无线技术专家、工程师和商业领袖,观众可免费注册参加。同时,为了方便中文观众,所有在线视频均配有中文字幕。 芯…

2024 年(第 7 届)“泰迪杯”数据分析技能赛B 题 特殊医学用途配方食品数据分析 完整代码 结果 可视化分享

一、背景特殊医学用途配方食品简称特医食品,是指为满足进食受限、消化吸收障碍、代谢素乱或者特定疾病状态人群对营养素或者膳食的特殊需要,专门加工配置而成的配方食品,包括0月龄至12月龄的特殊医学用途婴儿配方食品和适用于1岁以上的特殊医…

【日记】总感觉搞这些才回到了自己的老本行……(1179 字)

正文 前两天忘记写了几件事。 一是,周五晚上打开自己的博客,准备翻自己的笔记,然后…… 我发现,博客的子列表打不开了。我知道,完蛋了。Mdbook 它又双叒叕更新了。这次不知道又把 index.hbs 哪里给改了。 反正&#xf…

2024年11月11日历史上的今天大事件早读

700年11月11日宰相狄仁杰逝世 1821年11月11日《罪与罚》的作者陀思妥耶夫斯基诞辰 1844年11月11日清政府在五口通商口岸解除天主教禁 1851年11月11日御史王茂荫提出请变科举 1861年11月11日清皇太子载淳即皇帝位 1891年11月11日热河金丹教杨悦春发动反洋教起义 1918年11月…

【ESP】一小时速通入门笔记

【ESP】一小时速通入门笔记 前言: 之前上学时就用过一次esp32, 当时初次使用搭建编译环境费了老大功夫.在我第一篇esp32笔记中也有说明.以至于我好像忘记记录完整的入门笔记了.最近因为工作需要又开始接触esp32才发现,现在已经方便得多了.顺利的话一小时速通. 前排提醒: 本笔记…

海量小文件挑战下的CephFS:优化策略与实践探索

文章目录 1.背景2.基本概念2.1 CephFS IO流程2.2 Ceph-FUSE 3. 问题3.1 问题源起3.2 理论分析3.3 原因排查3.3.1 Ceph-FUSE日志分析3.3.2 提出猜想3.3.3 代码验证3.3.3.1 MDS端3.3.3.2 Ceph-FUSE端 3.4 小结 1.背景 随着大数据、人工智能技术的蓬勃发展,人类对于算…

团队发展与个人价值的共生

一、团队属性 团队的本质属性,在很大程度上表现为一种选择性和甄别性,即排外与排异。这意味着团队需要筛选出具有相同目标、价值观以及能力互补的成员,以达成高效的协作与共同进步。在团队运作的过程中,首要任务是明确并深入理解…

git命令及原理

git: 目录则被称之为“树” 文件被称作 Blob 对象. git help <command>: 获取 git 命令的帮助信息 git init: 创建一个新的 git 仓库&#xff0c;其数据会存放在一个名为 .git 的目录下 git status: 显示当前的仓库状态 git add <filename>: 添加文件到暂存区 git …

大模型的记忆困境:平衡持续学习与灾难性遗忘

1. 引言 持续学习是智能的关键方面。它指的是从非平稳数据流中增量学习的能力&#xff0c;对于在非平稳世界中运作的自然或人工智能体来说是一项重要技能。人类是优秀的持续学习者&#xff0c;能够在不损害先前学习技能的情况下增量学习新技能&#xff0c;并能够将新信息与先前…

实时高效,全面测评快递100API的物流查询功能

一、引言 你是否曾经在网购后焦急地等待包裹&#xff0c;频繁地手动刷新订单页面以获取最新的物流信息&#xff1f;或者作为一名开发者&#xff0c;正在为如何在自己的应用程序中高效地实现物流查询功能而发愁&#xff1f;其实&#xff0c;有一个非常好用的解决方案——快递10…

HR人才评价系统软件选择攻略

企业对人力资源管理价值的日益认同&#xff0c;人才评价系统软件市场迎来了蓬勃发展的春天。在数字化转型的浪潮中&#xff0c;企业对人才的多元化需求愈发明显&#xff0c;传统的评价手段已难以跟上时代的步伐。因此&#xff0c;人才评价系统软件应运而生&#xff0c;迅速成为…

蓝桥杯真题——good-sequence(C语言)

问题描述 一个序列 [b1,b2,...,bm] 若对于 2≤i≤m 满足 bi≤b1 &#xff0c;则称为好序列。 现在给定 [a1,a2,...,an] &#xff0c;求对于该序列的每一个后缀 [ak,ak1,...,an](1≤k≤n)最少能划分成多少个好序列。 输入格式 第一行包含一个整数 n &#xff0c;表示数组 a …

智慧煤矿可视化管理平台

通过图扑可视化平台集成实时数据采集&#xff0c;提供对煤矿生产、安全及环境监测等多方面的二三维动态展示。通过优化资源调度和风险预警&#xff0c;提高了煤矿运营效率和安全性&#xff0c;支持科学决策与管理。

华为ISC供应链服务运营:流程、组织、治理与绩效管理的综合框架

华为整合物流服务&#xff08;Integrated Logistics Services&#xff0c;简称ILS&#xff09;是华为推出的一项旨在提升供应链效能和敏捷性的创新举措。以下是关于华为ILS运营模式设计的详细分析&#xff1a; 一、运营模式设计的核心目标 华为ILS运营模式设计的核心目标是实…

优化时钟网络之时钟偏移

Note&#xff1a;文章内容以Xilinx 7系列FPGA进行讲解 1、基本介绍 所谓时钟偏移&#xff08;Clock Skew&#xff09;&#xff0c;是指在同步时序电路中&#xff0c;同一个时钟信号到达各个寄存器时钟端口的时间不一致的现象。如下图所示&#xff1a; 时钟从源端到达寄存器FF1的…

华为ENSP路由器出现41解决方法之一

我解决这个问题的方法&#xff1a; 这个方法很简单 一&#xff0c;首先我们打开电脑上的Oracle VM VirtualBox&#xff0c;找到AR_Base(ARse_Link) ,右键删除 二&#xff0c;打开ENSP模拟器&#xff0c;选择一个AR系列路由器并启动&#xff0c;在时候ENSP会提示&#xff1a;未…