游戏引擎如何与 GPU 对话,过程中间是什么?
How does a game engine talks to the GPU, what is in the middle of the process?
我想了解游戏引擎中的命令如何转换为可能使用 D3D 或 OpenGL 的 gpu 指令。 *我开始学习统一,我想更好地了解引擎盖下的内容。谢谢。
游戏引擎通常不仅仅执行低级渲染命令。你也需要声音和物理。 Unity 提供的不仅仅是渲染设备的抽象 (D3D/OpenGL)。它还为您进行场景管理以实现高效渲染。
假设您开始加载一些资产并将它们放入场景中。加载涉及在 GPU 上为 vertices/normals/animations 创建缓冲区,材质纹理甚至着色器。最有可能您已经听说过场景图,您的场景实体在其中进行管理。为了高效渲染,需要遮挡对象(其他实体后面的实体可能根本不会被渲染,因为您无论如何都看不到它们)并剔除(视锥之外的对象)。
我知道这个答案很宽泛,但希望它能给您一些想法,了解背景中发生的事情。如果您有兴趣,请查看 OpenGL 的现代渲染管道 (https://www.opengl.org/wiki/Rendering_Pipeline_Overview)。如果你只是想写一个游戏,那么一旦你熟悉了 unity 和 sorts 就太过分了。
我相信最好的答案会在一本关于游戏引擎的书中找到,但我可以笼统地告诉你事情是如何工作的。
游戏引擎必须让世界保持活力。这意味着,它必须跟踪大量数据,例如每个对象的位置信息,并每秒多次更新其位置和其他状态。
许多此类信息(例如顶点位置、几何数据和纹理)都存储在 GPU RAM (VRAM) 中并保存在那里,仅在必要时进行更新。有一些方法可以有效地做到这一点,例如,您可以在 X 坐标上将 +1 添加到角色的所有顶点,并且更新是在 GPU 端并行完成的。您永远不想更新 CPU 侧的每个顶点。这就是如何使用实时图形的本质。
所以CPU和GPU是两个非常接近的世界,但不共享它们的内存space。数据经常从 CPU 到 GPU 来回移动(主要是向 GPU)。
您将希望尽量减少 CPU 和 GPU 之间传输的数据量,并尝试通过着色器在 GPU 端完成所有工作。
通常,在游戏引擎中,CPU 处理游戏命令、AI 和大部分时间的物理(GPU 也可以处理物理)。虽然 GPU 渲染和重新计算每个顶点和每个像素的所有效果,但希望每秒 60 次。有时,为了节省一些通信量,数据会冗余地保存在两边。
现在,为了便于开发,所有这些都隐藏在脚本语言的层层之下。脚本语言仅被游戏引擎的内部所理解,以执行我之前提到的内容。在脚本语言之上,您将拥有带有按钮和许多其他元素的用户界面,以简化游戏设计师的工作。
为了更好地理解游戏引擎,您应该寻找的关键字:
- 事件
- 逻辑循环
- 渲染循环
- 着色器
- 碰撞检测
- 游戏引擎的脚本语言
我想了解游戏引擎中的命令如何转换为可能使用 D3D 或 OpenGL 的 gpu 指令。 *我开始学习统一,我想更好地了解引擎盖下的内容。谢谢。
游戏引擎通常不仅仅执行低级渲染命令。你也需要声音和物理。 Unity 提供的不仅仅是渲染设备的抽象 (D3D/OpenGL)。它还为您进行场景管理以实现高效渲染。
假设您开始加载一些资产并将它们放入场景中。加载涉及在 GPU 上为 vertices/normals/animations 创建缓冲区,材质纹理甚至着色器。最有可能您已经听说过场景图,您的场景实体在其中进行管理。为了高效渲染,需要遮挡对象(其他实体后面的实体可能根本不会被渲染,因为您无论如何都看不到它们)并剔除(视锥之外的对象)。
我知道这个答案很宽泛,但希望它能给您一些想法,了解背景中发生的事情。如果您有兴趣,请查看 OpenGL 的现代渲染管道 (https://www.opengl.org/wiki/Rendering_Pipeline_Overview)。如果你只是想写一个游戏,那么一旦你熟悉了 unity 和 sorts 就太过分了。
我相信最好的答案会在一本关于游戏引擎的书中找到,但我可以笼统地告诉你事情是如何工作的。
游戏引擎必须让世界保持活力。这意味着,它必须跟踪大量数据,例如每个对象的位置信息,并每秒多次更新其位置和其他状态。 许多此类信息(例如顶点位置、几何数据和纹理)都存储在 GPU RAM (VRAM) 中并保存在那里,仅在必要时进行更新。有一些方法可以有效地做到这一点,例如,您可以在 X 坐标上将 +1 添加到角色的所有顶点,并且更新是在 GPU 端并行完成的。您永远不想更新 CPU 侧的每个顶点。这就是如何使用实时图形的本质。
所以CPU和GPU是两个非常接近的世界,但不共享它们的内存space。数据经常从 CPU 到 GPU 来回移动(主要是向 GPU)。 您将希望尽量减少 CPU 和 GPU 之间传输的数据量,并尝试通过着色器在 GPU 端完成所有工作。
通常,在游戏引擎中,CPU 处理游戏命令、AI 和大部分时间的物理(GPU 也可以处理物理)。虽然 GPU 渲染和重新计算每个顶点和每个像素的所有效果,但希望每秒 60 次。有时,为了节省一些通信量,数据会冗余地保存在两边。
现在,为了便于开发,所有这些都隐藏在脚本语言的层层之下。脚本语言仅被游戏引擎的内部所理解,以执行我之前提到的内容。在脚本语言之上,您将拥有带有按钮和许多其他元素的用户界面,以简化游戏设计师的工作。
为了更好地理解游戏引擎,您应该寻找的关键字:
- 事件
- 逻辑循环
- 渲染循环
- 着色器
- 碰撞检测
- 游戏引擎的脚本语言