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 都可能成为瓶颈。需要具体分析