GAMES104-现代游戏引擎 1

本文围绕游戏引擎的学习重点,详细介绍了引擎的分层架构,包括编辑器、功能层、资源层、核心层和平台层。讲解了渲染实践中的关键概念,如GPU、SIMD/SIMT、渲染管道、纹理压缩和可见性剔除技术,强调算法与硬件的匹配。
摘要由CSDN通过智能技术生成

主要学习重点还是面向就业,重点复习八股和算法

每天早上八点到九点用来学习这个课程

持续更新中...

第一节 游戏引擎导论

第二节 引擎架构分层

注意逻辑的计算是严格早于渲染的,编程时也要注意不要把它们混在一起

引擎是分层架构的

  • 编辑器(直接和开发者交互的层)
  • 功能层 (用来实现游戏的渲染,动画等不同类型的功能)
  • 资源层 (管理各种美术资源)
  • 核心层 (支持渲染动画物理系统等不同系统的核心代码)
  • 平台层 (一般包括各种图形API,输入输出设备支持以及不同游戏平台底层代码)

越底层的代码越稳定越坚固,越上层的代码越灵活越开放--越适应不同地开发需求制作不同地游戏

Virtual world is composed by a set of clocks -ticks

第三节:如何构建游戏世界

八叉树  四叉树

  • Everything is an object
  • Game object could be described in the component-based way
  • States of game objects are updateed in tick loops
  • Game objects interact with each other via event mechanism
  • Game objects are managed in a scene with efficient strategies

第四节 :游戏引擎中的渲染实践

这一大章节的一个目录

Building Blocks of Rendering


Rendering Pipeline and Data

GPU

SIMD and  SIMT

SIMD是指在运行程序时可以把一条指令同时执行在不同的数据上,目前现代CPU对于SIMD有着很好的支持,这种技术在高性能计算等领域中有着广泛的应用;而SIMT则是把同一条指令分配到大量的计算核心上同时执行,现代GPU的计算过程更类似于SIMT。

GPU 和 CPU 之间通信的代价是非常大的,因此在渲染系统中会尽量把数据通信设计为单向的。这样 GPU 只需要读取 CPU 发送的数据而无需反向传输渲染的结果

Renderable

在进行渲染时我们只需要考虑那些需要进行渲染的 GO,它们称为可渲染对象(renderable)

一般来说我们可以把整个可渲染对象拆分成若干个block,每个block有着自身的网格、材质等渲染信息。

对于材质数据,我们需要定义常见材质的渲染模型。在现代游戏引擎中往往还会集成大量的PBR材质以渲染出更加逼真的图像。

我们还需要考虑材质的纹理。纹理对于材质的定义以及最终渲染呈现的效果起着至关重要的作用。

当然我们还需要考虑shader,在进行渲染时需要把编译好的shader连同数据一起提交的GPU上进行计算。

实际工程中我们往往需要把一个完整的网格拆分成不同的submesh,每个submesh有着自己的材质和纹理而整个网格共享一套顶点和面片信息。这样利用submesh的概念就可以绘制出更加逼真的图像。

当我们需要绘制大量GO时,如果每个GO都使用单独的网格信息则会造成存储和计算资源上的浪费,实际上很多GO和submesh都共享了相同的材质、纹理甚至是shader。因此为了更高效地利用计算资源人们还提出了资源池(resource pool)的概念。在资源池中我们把所有的网格、材质、shader等资源分别集中到一起,在进行实际渲染时对每个对象分别去寻找对应的数据和资源即可。

为了更高效地利用GPU,我们还可以把场景中的submesh按照材质进行排序。这样可以保证渲染时具有相同材质的submesh会放在一起进行绘制,从而降低GPU切换资源的开销。

在很多游戏场景中还存在着大量相似甚至是完全相同的GO。对于这种情况可以通过GPU batch rendering的方法把这些GO组织在一起,然后把同一batch中的对象一次性绘制出来,进一步提升场景渲染的效率。

Visibility Culling

在游戏场景中一种常见的情况是整个场景内有大量的可渲染对象,但在玩家视野内则只有有限数量的单位。在这种情况下如果直接把场景中所有的可渲染对象送入渲染管线无疑会造成计算资源的浪费。

因此可见性剔除(visibility culling)是渲染系统中非常实用的技术,它的思想是在送入渲染管线前首先判断场景中的每个可渲染对象是否在相机视野中,然后只对视野范围内的对象进行渲染。

visibility culling的核心是把可渲染对象使用bounding box进行表示,然后通过bounding box来迅速判断物体是否在视锥范围内。我们通过bounding box将场景中的物体组织起来,这样在渲染时只需要通过对它们进行遍历就可以快速地实现visibility culling。

在现代游戏引擎中,BVH是应用最为广泛的bounding box。BVH的一大特点是它可以在场景中物体发生运动时通过对节点的操作来动态地修改树的结构,这样无需每次都重新建树从而大大提高了计算效率。

在游戏设计中,PVS(potential visibility set)是一种非常实用的技术。它的思想是把整个场景划分为若干个相对独立的区域,不同区域之间通过portal进行连接。当玩家在场景中进行游戏时只会在某个区域中,而这个区域内的可见性是可以事先确定的,这样就可以利用PVS来进一步剔除无需渲染的对象。

利用现代GPU的强大计算性能我们可以通过查询的方式直接获取每个对象的可见性并以此剔除掉不可见的物体,这样的技术称为GPU based culling

算法还是需要和硬件匹配的,算法并不是越精巧越好

Texture Compression


我们在前面的章节介绍过纹理对于渲染出逼真的物体起着重要的作用。通常情况下纹理会通过一张二维贴图进行表示,并且在计算机中使用JPG或是PNG这样的压缩格式进行存储。而在游戏引擎中则无法使用这些常用的图像压缩格式,这主要是因为JPG这样的压缩算法不支持快速的随机图像坐标访问,而且它们往往具有过大的计算复杂度无法进行实时的压缩与解压。

在渲染系统中最常用的纹理压缩算法是block compression,它的思想是统计每个4×4区域内纹理图像最大和最小值然后通过插值的方法进行查询。

参考文章:GAMES104课程笔记02-Layered Architecture of Game Engine - Bo's Blog (peng00bo00.github.io)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值