MassEntity 学习
MassEntity 是 UE5 里面一个面向数据的框架,与 Unity DOTS 非常相似。 引入 ECS 的主要目的也是要充分利用多核 CPU 的并行能力,发挥缓存的优势,从而提高性能。
MassEntity 是 UE5 里面一个面向数据的框架,与 Unity DOTS 非常相似。 引入 ECS 的主要目的也是要充分利用多核 CPU 的并行能力,发挥缓存的优势,从而提高性能。
现在我们已经成功地渲染并在屏幕上展示了一个三角形,更重要的是,我们把 Vulkan 中的大部分知识都过了一遍,现在让我们来回顾一下它的每个步骤
本文中我们将会结合之前的东西,最后在屏幕上把三角形画出来
命令在 Vulkan 中,比如绘图操作和内存传递,并不能直接经过函数调用来执行。我们必须要把所有需要执行的操作记录到命令缓冲区对象中。这样做的优势在于配置绘图命令的复杂工作能够提前且多线程进行。这之后,我们只需要在主循环中通知 Vulkan 执行这些命令
在之前的文章中已经讨论了很多帧缓冲区相关的东西,并且我们已经配置了渲染路径,渲染路径基于一个单独的与交换链图像具有相同格式的帧缓冲区,但我们实际上还没有创建它
首先还是添加一个成员函数并在 initVulkan 中调用它
与早期 API 不同,Vulkan 中的着色器代码必须要以字节码的格式指定,而不是像 GLSL、HLSL 这样人类可读的语法。这种字节码格式是 SPIR-V,它可以用于 Vulkan 和 OpenCL。它是一个用来写图形与计算着色器的格式,但是现在我们只关心可用于 Vulkan 图形流水线的着色器
我们需要配置渲染时需要使用的帧缓冲区附着的相关信息。我们需要指定有多少个颜色和深度缓冲区,它们的采样数以及通过渲染操作应当如何处理它们的内容。所有的这些信息都会被封装到渲染路径对象中,于是我们添加一个成员变量来保存它
接下来的文章我们将会配置图形流水线来绘制我们的三角形。图形流水线就是一系列的操作,这些操作把我们的网格体中的顶点和纹理转换成渲染目标上的像素点
为了能够使用 VkImage,包括交换链中的在内,我们需要在渲染管线中创建 VkImageView。一个图像视图真的就是字面意思的图像的视图。它描述了如何访问这个图像以及访问这个图像的哪个部分,例如图像可能被当作不需要 Mipmap 的二维深度贴图
我们在把图像展示到屏幕之前,需要先把它们渲染到缓冲区中,而交换链就是存放缓冲区的地方。交换链本质上是一个存放需要展示到屏幕的图像的队列。我们的应用程序要做的就是从这个队列中取出一个图像,然后在上面渲染,最后再返回给队列。这个队列是怎么工作的以及队列中的图像什么时候展示到屏幕上,它们都取决于交换链是怎么创建的,但是交换链一般的目的都是同步图像展示和屏幕刷新率
选取了物理设备之后,我们需要创建一个逻辑设备来跟它进行交互。逻辑设备的创建过程跟实例的创建过程类似,我们需要描述要用到的特性。我们还需要根据之前查询好的队列族,指定需要创建的队列。我们甚至可以对于同一个物理设备创建多个逻辑设备来应对不同的需求
创建了表面之后我们接下来就可以在系统中选取一张显卡,事实上我们可以选取多张显卡并同时使用它们,但是在本文中我们只用一张显卡作为示范
Vulkan 是一个跨平台的 API,它不能够直接与不同平台的窗体系统进行交互。为了在 Vulkan 与窗体系统之间建立连接来把渲染结果展示到屏幕上,我们需要使用一些 WSI 扩展。本文将会介绍 VK_KHR_surface 扩展。它暴露一个 VkSurfaceKHR 对象,这个对象代表一个我们可以把图像渲染上去的抽象表面
开始一切之前,我们先引入 Vulkan 的头文件
Vulkan 是一个跨平台的图形与计算 API,本系列文章将使用 Vulkan 绘制一个三角形,旨在为上手 Vulkan 提供帮助
相对于 Git 和 SVN,Perforce 在管理二进制文件上更方便
UE4 的材质编辑器中我们可以创建材质结点然后给它们连线来创建材质
本文将根据源码解析材质结点在内存中的数据结构
在游戏工业中的模块化设计是指把可复用、可内联的模块组织起来形成更大的结构或者环境,以此降低工作量,同时还能减少运行时内存消耗
使用 UE4 的材质编辑器的时候我们可以为材质的颜色、粗糙度、金属度等连接一个常量或者纹理结点,如果要实现复杂效果可能还会用到混合结点,最后就可能看到一个完整的材质其实是由一堆结点和它们之间的连线组成
渲染管线会把内存中的三维模型输出到二维的屏幕上,它具有明显的先后顺序,每一个阶段的输出都会作为下一个阶段的输入。它也可以翻译为渲染流水线
跟随本文阅读 TaskGraph 的源码来了解其实现细节
这个东西跟 Unity 中的 Job 很相似,都是基于任务的并行程序设计,可以处理资源竞争与执行顺序问题
官方手册里有提到,但是没有具体描述。本文主要基于官方示例代码与实践
这部分内容手册中没有,本文参考的是官方示例代码与官方论坛
https://github.com/Unity-Technologies/EntityComponentSystemSamples
在编辑器为 GameObject 挂载 Physics Body 和 Physics Shape 这两个 Authoring 脚本会为转化出的 Entity 添加很多个组件
跟主流物理引擎一样,Unity Physics 也具有碰撞查询的功能
本文介绍获取与修改刚体速度的方法
并实现控制立方体每隔一段时间朝随机方向运动,具有匀速运动与施加冲量两种方式
前文展示了一个简单的 HelloWorld,本文将进一步介绍其中用到的 Physics Shape 和 Physics Body 这两个脚本的参数设置
现在 Unity 的 Package Manager 中已经有了适用于 ECS 框架的物理引擎,功能完善
可以说 Unity 的 DOTS(面向数据技术栈)已经能够用于制作大部分游戏类型
虽然还是预览版,但我感觉它已经完整地发挥了 ECS 架构的优点,上手也很快
前文中我们用 IJobForEach 或者 JobComponentSystem.Entities.ForEach 都只能筛选并遍历具有特定 Component 的 Entity,但其实有更灵活且同样高效的方式
一般游戏中都避不开实体的动态生成与动态销毁。
本文演示使用 Prefab 创建旋转的立方体方阵并定时销毁。
本文将介绍 Unity ECS 中对于 Component 的内存管理
上一章介绍了 ECS 并行处理的实现,接下来就这个 HelloWorld 进行深入的研究。
跟随本文,创建一个立方体 Entity,利用一个 System 控制它不断旋转。
之前接触 ECS 是因为看了守望先锋的架构分析。了解了一下发现这种架构天生支持多线程,而且对缓存非常友好,似乎做联网同步也很方便,感觉这应该是个挺有前途的设计思路。
之前做 Unity 网络游戏开发的时候,想着后端也用 C#就很方便,于是看上了开源跨平台的.NET Core,当时网络模块就是用了 LiteNetLib 实现的。