玩游戏最难受的事情是什么?不是打不过Boss,也不是抽卡保底,而是你花了大价钱配了一台电脑,进了游戏还是卡。关阴影、降分辨率、开DLSS,再祈祷风扇别飞走了。
因为现在的游戏美术越来越卷:更大的地图、更多的NPC、更真实的物理效果,每一样都在疯狂吃性能。
几十年来,游戏优化一直在研究同一件事:怎么让电脑少干活,同时让玩家觉得它什么都干了。换一种说法就是——来骗,来偷懒。

第一招:心外无物
游戏优化的第一招叫"心外无物",说的就是Culling剔除——不渲染距离远的、相机以外的、以及被遮挡的地方。看不见的能不画就不画,尽量减少画面渲染的计算量。
就像你面前的这朵花,你不看它时,它就不渲染。当然也不是彻底不存在,它的位置、模型和贴图依然是硬盘或内存里的0和1。
这多少有点王阳明心学里"心外无物"的意思。有人问王阳明:深山里的花,就算没人看,不也一样会自己开放吗?王阳明回答:你没看这朵花的时候,它与你同归于寂;等你真正看到它的时候,它的颜色才一下子明白起来。
游戏里玩家的视野,可以想象成一束从摄像机里打出去的手电筒。手电筒照得到的地方才被渲染,照不到的地方就不渲染。
但引擎怎么知道一个东西到底在不在玩家的视野里?肯定不能把模型的几万个顶点一个一个拿出来算,那太费劲了。于是有人想到:先给每一个物体套一个Bounding Box(包围盒或包围球),接下来只需要判断这个盒子或球有没有和摄像机的视野发生交集。如果整个包围盒都在视野外面,直接剔除;只有进入视野的物体才值得继续往下计算。
就算进入了镜头,也不代表一定要全部渲染。如果物体刚好被一堵墙挡住,引擎还可以用场景深度信息继续做一次遮挡剔除。有些游戏进一步优化了渲染流程:从场景里挑出几百个最有遮挡价值的大物件(山体、建筑、墙体),给这些复杂模型做一套只有几个面的极简遮挡替身。CPU先用这些低面数代理快速生成一张低分辨率的深度图,再拿其他物体的包围盒去判断是否被完全挡住。如果确定看不见,这些模型甚至还没进入GPU正式渲染流程,就已经被剔除了。
所以游戏并不是先把整个世界全部渲染出来,再截一块画面给你看。它会有各种各样的方式偷懒:镜头外的不画,被挡住的不画,最后真正给GPU的只剩下玩家这一帧有可能看到的那一小部分。
第二招:以假乱真
就算用上了各种渲染剔除,还是架不住游戏里的场景越来越复杂,地图和视野越来越大,很多东西不得不渲染。这时候就要掏出第二招:以假乱真。
说白了就是:只要你看不出来,我就可以偷工减料。
最有代表性的就是LOD技术。引擎会根据物体距离摄像机多远,或者它在屏幕上实际占多大面积,自动切换几个档位不同精度的模型,以此减少计算压力。就像50米开外有棵树,肯定看不太清楚树叶的细节——看不清那就不用看清了,随便用低面数的模型糊弄一下就行了。
但LOD有一个明显的缺点:有时候模型会跳,也就是两个不同精度的模型切换被你看出来了。所以我们还需要更丝滑、同样能节省性能的方法。
前几年在《黑客帝国》的虚幻5演示里,就用到了一个新的技术思路:Nanite。Epic在《堡垒之夜》上也用了这个功能。Nanite换了一种思路:不是做几个档位精度模型切来切去,而是把原本的模型拆分出许多小块。这样根据玩家摄像机的距离检测,就不是突然换一个低模,而是按照玩家显示器上的形状,引擎根据它们当前画面的占比,分别决定需要表现多少细节。
现在已经有不少游戏在用这个方案解决场景优化的问题,比如《巫师4》的技术演示、《无主之地4》、《异环》等。当然现阶段这个技术也不是完全淘汰了LOD,两个技术叠加在一起用,既省了性能,还可以少做很多LOD模型。
第三招:预制菜
面对超大型项目,只有前两招肯定扛不住。为了理解第三招,我们得先认识一下电脑里几个干活的员工。
把电脑的渲染工作想象成饭店做饭:游戏硬盘里的模型、贴图、动画这些美术资产,就是厨房仓库里的原料。电脑要做的就是把这些原料一道道加工,最后保证按时出菜,游戏不卡。
饭店创业早期只有一个主厨,就是CPU,炒菜和管理整个饭店挺全能的。但后来业务扩张,菜品花样越来越多,一个人忙不过来,于是从英伟达的厨师培训学校里招了几十个年轻厨师——GPU。这些厨师称不上聪明,但就是纯劲大,非常擅长大量重复工作,比如同一时间处理几十万个三角形、几百万个像素,给它们上色、打光、算阴影、加特效。
内存可以理解成临时操作台,因为真做菜的时候不能每切一刀都跑一次硬盘仓库,所以要提前把食材搬出来。为了进一步提高效率,老板还给每个GPU厨师面前配了个独立的操作台,就是显存,省得每次炒菜再从背后的内存上拿原料。
游戏渲染的大概流程就是:CPU主厨先接单,判断这一帧发生了什么,需要哪些模型、哪些动画、哪些灯光,然后开始给厨房所有人分配工作。接着硬盘里相关的资源被提前搬到内存这个操作台上,再由GPU这些流水线厨师拿走,开始疯狂加工。一顿猛炒之后,一张完整的游戏画面终于被端到玩家面前。
如果游戏要稳定在60帧,厨房每秒至少要连续端出60盘,出菜时间只有大约16.7毫秒。有时候游戏卡了,就可能是菜品太复杂、厨房人手不够。这时候就需要第三招:预制菜。
游戏里比较有代表性的预制菜优化,比如烘焙光影——提前把场景中的光影细节烘焙到模型的贴图上,减少厨房的压力。因为游戏中实时光照其实非常消耗性能,真实光线的折射反射轨迹很复杂,还涉及不同材质的多次反射,现做厨房肯定忙不过来。这时候直接从仓库搬出预制好的光影贴图,简单地钉一下,非常省事。
还有法线贴图,大大减少了模型的渲染面数。简单来说就是把高模的光影信息通过法线贴图"拍"到低模上,让低模也有了高模的细节。更进阶的做法,比如GTA6中衣服的动态褶皱,就会用几张提前做好的法线贴图来回切换,这样就不会费大力气去实时计算布料的复杂褶皱了。
还有预制好的火焰、烟雾特效,这些逐帧动画直接用2D图片播放,大大减少了真实物理的计算量。或者设计一些镜头演出或场景效果,比如《战神》中角色开门动画、《寂静岭》中烟雾的遮挡、爬梯子,都是为了尽量拖延一下加载时间。有的时候实在搞不定,还可以在大场面前面加一段MP4,就说是为了配合剧情。
DLSS5:AI时代的新菜谱
三大优化招法只是极简的归纳,各家厂商都有自己的独门秘籍,但核心思想不变:用各种奇技淫巧减少电脑的负担,提升画面效果。
最近英伟达又给后厨推出了一门新绝活:DLSS5。效果的确挺惊艳,而且它开辟了一条新的AI渲染思路——3D引导神经渲染。可以理解成厨房还是按照原先的流程做菜,但每一步都给你加了一点点鸡精、味精,利用神经网络帮忙补出光影、材质、法线贴图的细节。
它不是拿每帧做好的画面套了一层AI图生图滤镜。DLSS5本身就是游戏管线渲染的一部分,会参考当前渲染结果、运动信息和游戏本身的3D结构,让生成出来的东西老老实实待在原来的模型上。目前看对写实类的游戏场景质感有非常强的加强,但人物在个别情况下会强化法令纹,感觉人都老了,皮肤质感也会显得有些油腻。
但这套思路还是非常厉害的。今后的硬件性能和优化技术继续沿着这样的技术思路逐渐应用,那真是左脚踩右脚、螺旋升天,游戏画面真的要分不清现实了。
我们活在一场模拟游戏里吗?
智人走出非洲到工业革命,大约用了6万年。电子游戏从胖嘟嘟的几个像素到今天的画面,只用了五十几年。
马斯克曾经在一个采访中说道:如果未来的智慧文明真的能创造出无数个与现实无法区分的模拟世界,那么我们又凭什么确定现在生活的这个就是唯一的那个真正的世界?
当然,我们没有证据证明世界是一场模拟游戏。但至少过去50年的电子游戏已经证明了一件事情:想让一个世界显得真实,并不需要把一切都真实地算出来,只需要让里面的人看不出周围的破绽就行了。
所以你现在看到的这个画面,说不定只是某个超级计算机为了维持沉浸感,临时给你生成的。
资料来源:B 站视频 BV1pwhx6dE5y(游戏优化技术科普);配图为《黑神话:悟空》游戏实机画面。


