# CPU & GPU的关系


## ***前言***

*想写这一篇博客，是因为看到有人用纯用蓝图写游戏，然后就变成面条了。评论有人劝他改c++，并且性能也好。然后就有个人来怼了。*

*以下原话：*

-----------------------------------------------------------------------------------------------------

*“每次遇到这种说法的都感觉这人不懂c++，也不懂游戏开发，先不谈c要写多少的问题，游戏性能跟c++能挂上钩就很离谱，游戏逻辑运行在CPU里，渲染场景运行在显卡，我到现在没玩过一个游戏能吃满CPU，游戏帧率低都是场景大，面数多显卡不行导致的，现在性能瓶颈全在显卡上，你写的蓝图还是c都只是游戏逻辑，tick里面也没有多少东西，根本影响不到帧率，至于用c写效率的问题，更是抽象，我向来都是用c写函数库封装再用蓝图宏观调用，你看到一片蓝图就以为人家没用c也抽象，写c更快也很抽象，c更直观那就是抽象中的抽象收起”*

*"显卡渲染，跟cpu可以说毫无关系，你先搞清楚 cpu 跟 gpu是干什么的，显卡分不到工作就不像是正常发言，GPU跟CPU干的活就没啥关系"*

*"你没法把CPU跟GPU的活全部摘干净，你要优化项目性能，culling跟draw call都很容易优化，但是场景中模型面数高就是实实在在的，你想优化也很难，这才是GPU的大头，才是卡在性能瓶颈的鸡肋，你非要提CPU跟渲染有关没有任何意义，GPU就是个计算器，又不是全能，UE有一万个降低draw call的方法，而且场景中actor的数量你很好限制，可以合并或者用ism，但每个actor的面数你怎么限制呢？CPU的性能大头也不可能是辅助渲染的这点工作，还是处理你写的各种事件驱动函数相关的逻辑"*

----------------------------------------------------

*关于c++ 和 蓝图的区别已经性能区别和原理我都在另一个博客写了，那么这个博客就来说说 CPU 与 GPU的区别。虽然说游戏逻辑是在CPU运行，画面渲染是在GPU运行，但是他们真的不会互相影响吗?*

*想探讨一下这些问题，我们就得先懂什么是CPU，什么是GPU*

## ***什么是CPU***

*CPU (中央处理器)：博学多才的“指挥官”*

- *特点：核心少（比如 8 或 16 核），但每个核心都极其聪明，处理速度极快。*
- *擅长：处理复杂的逻辑判断（If/Else）、复杂的数学公式、管理内存、调度资源。它是一个“串行处理器”，擅长一件接一件事地解决烧脑难题。*

*不同的处理器架构使用了不同的策略来避免停滞。CPU 经过优化，可以处理大量的数据结构和大型代码段，CPU 一般都具有多个处理器，每个处理器都以串行的方式来执行代码。为了最小化延迟所带来的影响，CPU芯片中的大部分面积都是高速的本地缓存，这些缓存中存满了接下来可能会用到的数据。CPU也还会使用一些智能技能来避免停滞，比如 分支预测 等…*

## ***什么是GPU***

*GPU (图形处理器)：力大无穷的“画师团”*

- *特点：核心极多（成千上万个）*
- *擅长：“并行计算”。它不擅长思考，但如果你让它同时计算屏幕上 200 万个像素点的颜色，它能瞬间完成。*

*GPU 采用了不同的策略，GPU 芯片中的很大一片面积都是大量的处理器，也叫做着色器核心，GPU芯片中通常会有数千个着色器核心。*

*GPU 是一个流处理器，他会依次处理有序的相似数据。由于数据的相似性（例如一组顶点或者像素），因此 GPU 可以通过大规模并行的方式来处理这些数据*

*GPU 专门对吞吐量（throughput）进行了优化，吞吐量指的是数据能够被处理的最大速度。但是这种快速处理是有代价的，由于用于缓存和控制逻辑的芯片面积较少， 因此每个着色器核心的延迟，通常都会比 CPU 处理器所遇到的延迟要大*

## ***ISM***

*它是 UE 中解决 Draw Call 瓶颈的神器。如果你要在场景里放 1000 棵一模一样的树：*

- *普通方式：1000 个 Actor，1000 个 Draw Call。CPU：我谢谢你。*
- *ISM 方式：1 个 Draw Call。CPU 告诉 GPU：“这是这棵树的模型，这是那 1000 个位置的清单，你自己画去吧。”*

*ISM 有一个巨大的缺点：“一荣俱荣，一损俱损”。*

*如果这 1000 棵树里有一棵在镜头里，GPU 就会默认这 1000 棵树都在，并把它们全部处理一遍。这会导致 GPU 做了大量无用功。*

## ***默契的CPU和GPU***

*每一帧画面的渲染，都是一次 CPU 发起、GPU 完成的跨部门协作：*

*第一步：CPU 逻辑计算（算剧情）*

*在画面出来之前，CPU 要先算出这个世界发生了什么：*

- *玩家按了空格，角色该跳多高？（物理计算）*
- *AI 怪物看到玩家了，该走哪条路包抄？（AI 寻路）*
- *技能系统（GAS）：火球术撞到了墙，触发了爆炸标签，扣除 50 点血。（逻辑判断）*
- ***此时 GPU 还在闲着。***

*第二步：CPU 遮挡剔除（定方案）*

*CPU 查看当前的摄像机位置：*

- *“左边这棵树在镜头外，不用画。”*
- *“墙后面有个箱子被挡住了，不用画。”（这叫 **Culling/剔除**）*
- ***这是 CPU 极其繁重的任务。** 如果 CPU 算不清楚，GPU 就会画一堆看不见的垃圾，浪费性能。*

*第三步：CPU 发送指令（下订单 - Draw Calls）*

*这是最关键的接力点。CPU 整理好所有要画的数据，给 GPU 发指令：*

- *“去，用这个纹理画这个模型，放在坐标 (X,Y)。”*
- *注意：CPU 准备订单的过程非常累。如果订单太多（Draw Call 太多），CPU 就卡在这里了。*

*第四步：GPU 渲染绘制（干苦力）*

*GPU 接到订单，开始疯狂干活：*

- *...GPU渲染管线...*
  - ***光栅化**：把 3D 的三角形变成 2D 的像素点。*
  - ***像素着色**：计算每个点的光影、材质表现。*
  - ***后期处理**：加上动态模糊、调色。*
- ***最后**：把画好的图片推送到显示器。*

## ***总结***

*所有说 不用过分的否定cpu的不重要性，CPU 和 GPU 都可能成为瓶颈。需要具体分析*

