前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >为什么电脑配置高,玩《黑神话:悟空》需要等待这么久

为什么电脑配置高,玩《黑神话:悟空》需要等待这么久

作者头像
Datawhale
发布于 2024-08-30 09:56:49
发布于 2024-08-30 09:56:49
39900
代码可运行
举报
文章被收录于专栏:Datawhale专栏Datawhale专栏
运行总次数:0
代码可运行

Datawhale干货

作者:Eternity,Datawhale成员

不少玩家在玩游戏时总会遇到这样的问题:明明我电脑的配置已经足够高了,为什么需要等待这么久?

遇到这个问题大家不用急着排查故障,首先观看一下游戏界面是否有“着色器正在编译中”这行字,或许这就是导致进入游戏需要等待的“罪魁祸首”之一。

《黑神话:悟空》在 PC 端打开游戏的时候,进度条就会显示:正在进行着色器编译...

「着色器编译」究竟是干什么的?

要回答这个问题,首先要解释:着色器是什么;其次要解释:为什么需要在启动时编译,而不能提前打包到安装包中?

省流版:着色器决定了你在打游戏时能够看到的画面,而着色器又与系统、显卡非常相关,所以通常在启动时(这个时候程序已经知道你的设备是什么操作系统、什么显卡)进行编译(变成一种底层硬件能够认识的格式)。

这里想插入一张图:是谁说我的shader有问题.jpg(本来想放一个表情包):

什么是着色器?

在这之前,先说下 GPU、CPU:CPU 有着比较少的计算核心,但每个核心能干的事情比较多;而 GPU 虽然每个核心能干得不多,可它数量多。比如你有一张图像,需要修改每个像素,在 CPU 上通常需要逐个像素的使用 for 循环;而在 GPU 上,可以为每个像素分配一个核同时进行计算(假设像素个数少于核的数量)。对于图像处理或者图形相关的任务,GPU 就存在一些优势,尤其是需要为每个像素进行大量运算时。

人们不满足于固定的绘制功能,想要自己控制绘制的过程,于是就有了可编程渲染管线。这个时候就需要告诉硬件应该如何绘制——着色器,别名:Shader:在渲染中,通常使用的是顶点着色器与片段着色器,此外还有一些别的着色器不再赘述。

“虚假”的绘制过程(着色器->硬件->绘制结果)

上面展示了着色器代码到硬件,再到玩家看到的画面(当然没有这么简单)。有了着色器之后,开发者就可以写各种各样的代码,去实现各种“花里胡哨”的效果,比如流动的水面、飘逸的发丝等等。

为什么需要在启动时编译,而不能提前打包到安装包中?

下面尝试回答第二个问题:众所周知(如果不知道,现在也不晚),我们写的大部分代码都是机器不能直接使用的(高级语言是为了方便人们理解),需要变为机器所能理解的语言——二进制文件

市面上有不同硬件厂商生产的不同显卡,首先游戏开发者与硬件厂商约定了一些标准/规范(OpenGL、Vulkan、DX 等),硬件厂商基于这些规范去实现相应硬件功能,游戏开发者根据这些规范编写代码,而编译过程则是将这些代码变为显卡所能理解的二进制文件,比如在 OpenGL 可通过以下代码进行编译并链接:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// compile shader
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);

// link shaders
unsigned int shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glLinkProgram(shaderProgram);

对于不同显卡、不同平台/操作系统,编译产物往往不同。此外,着色器中通常存在不同的变体(对应不同行为),比如在一些高性能显卡上,可以开启一些比较消耗性能的特性,而对于相对低端的硬件设备,往往会进行一些降级(这也是为什么在不同机器上,游戏画质不同的原因)。

现代的一些图形接口,如 Metal、Vulkan、DX12,允许编译得到中间格式的结果(比如 Metal IR、SPIR-V 等),一些引擎会选择将这些中间格式结果打入安装包中,但仍然避免不了在首次加载时编译得到最终产物。

这里补充下Raymond Fei老师的回答:

“补充一下,不仅是不同家 GPU 上不统一,同一家的不同代 GPU 都是不统一的,甚至同一款 GPU 用了不同驱动都可能不一样,而且不一定向前兼容,就是说旧 GPU/驱动上编译出来的机器码有的在新 GPU 下面就不存在了。所以唯一能做的就是在用户机器上编译。这就是极致优化所需要的代价:之所以这么搞,除了不同厂商无法统一指令集之外,还因为跑着色器的都是高度实时的程序,用户对性能(比 CPU 上跑的程序)要敏感很多。”

以上也就是游戏在启动时编译着色器的过程,通常在首次加载游戏时需要对着色器进行编译,一些规范允许对编译产物进行缓存,之后能够更加快速地进入游戏。

笔者对着色器编译的理解也非常肤浅,编译的一些底层细节以及如何跨平台进行编译,也留给我去慢慢学习,如有不对还请批评指教。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-08-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Datawhale 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
1.opengl绘制三角形
下面,你会看到一个图形渲染管线的每个阶段的抽象展示。要注意蓝色部分代表的是我们可以注入自定义的着色器的部分。
诺谦
2020/09/27
1.3K0
1.opengl绘制三角形
现代OpenGL(一):我的第一个OpenGL程序
OpenGL是一种应用程序编程接口(Application Programming Interface,API)它是一种可以对图形硬件设备特征进行访问的软件库。 在OpenGL 3.0以前的版本或者使用兼容模式的OpenGL环境,OpenGL包含一个固定管线(fixed-function pipeline),它可以在不使用着色器的环境下处理几何与像素数据。我们看到的glBegin()、glRectf()以及glEnd()这些函数都是以前固定管线模式中所使用的API函数。 从3.1版本开始,固定管线从核心模式中去除,因此我们必须使用着色器来完成工作。现代OpenGL渲染管线严重依赖着色器来处理传入的数据,我们一般会使用GLSL(OpenGL Shading Language)编写着色器程序,GLSL语法类似于C语言,GLSL编译以后运行在GPU端。
卡尔曼和玻尔兹曼谁曼
2019/01/22
2.4K0
现代OpenGL(一):我的第一个OpenGL程序
OpenGL现代编程第二课——第一个多边形
https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/
用户5908113
2020/01/02
7820
GPU的工作原理
在GPU出现以前,显卡和CPU的关系有点像“主仆”,简单地说这时的显卡就是画笔,根据各种有CPU发出的指令和数据进行着色,材质的填充、渲染、输出等。 较早的娱乐用的3D显卡又称“3D加速卡”,由于大部分坐标处理的工作及光影特效需要由CPU亲自处理,占用了CPU太多的运算时间,从而造成整体画面不能非常流畅地表现出来。 例如,渲染一个复杂的三维场景,需要在一秒内处理几千万个三角形顶点和光栅化几十亿的像素。早期的3D游戏,显卡只是为屏幕上显示像素提供一个缓存,所有的图形处理都是由CPU单独完成。图形渲染适合并行处
刘盼
2018/04/08
3.9K2
GPU的工作原理
【WebGL】初探WebGL,我了解到这些
WebGL基于OpenGL ES(嵌入式系统) 一种广泛用于在各种平台上渲染2D和3D图形的标准。它允许开发人员使用JavaScript与用户设备的GPU(图形处理单元)交互,实现硬件加速渲染。
且陶陶
2023/10/16
5150
【WebGL】初探WebGL,我了解到这些
深入GPU硬件架构及运行机制
对于大多数图形渲染开发者,GPU是既熟悉又陌生的部件,熟悉的是每天都需要跟它打交道,陌生的是GPU就如一个黑盒,不知道其内部硬件架构,更无从谈及其运行机制。
数字芯片社区
2021/04/19
5K1
深入GPU硬件架构及运行机制
快速入门 WebGL
WebGL 是 Web 3D 渲染引擎的基础,它作为非常底层的 API,学习上手难度非常大,这是因为 WebGL 要求的背景知识比较多。而网上的教程一般没有过多介绍直接就介绍 API 开始渲染了,容易让人云里雾里,很容易被劝退,就算学到了 API 使用,也是只懂表面知识,没有了解背后的原理,很容易就忘记了。
羽月
2022/11/11
3K0
快速入门 WebGL
一起来玩玩WebGL
上一篇文章说到我从客户端转前端的历程,短短一年的时间就打开了前端世界的大门,简直就是有无穷多的东西可玩,以前酷爱Java的我终于见识到什么都可以写的JavaScript的厉害了,不仅仅可以写Web,客户端,后端,系统应用,还可以在神经网络、物联网,甚至嵌入式都可以,简直就是一个万能的语言,可以说能编程的地方理论上都可以用JS来写!
ConardLi
2020/06/29
1.2K0
一起来玩玩WebGL
【iOS】OpenGL入门资料整理
在应用程序调用任何OpenGL执行之前,首先需要创建一个OpenGL的上下文。这个上下文是一个非常庞大的状态机,保存了OpenGL中的各种状态,这也是OpenGL指令的基础。
MapleYe
2020/03/30
1.6K0
【iOS】OpenGL入门资料整理
Rust 与 GPU 编程的现状与前景探究
话说,程序员三大浪漫,操作系统、编译器和图形处理。Rust 语言已经攻陷了其中两大浪漫,操作系统和编译器,那么图形处理呢?Rust 语言还能“浪”起来吗?
张汉东
2023/11/20
4.1K0
Rust 与 GPU 编程的现状与前景探究
OpenGL & Metal Shader 编程系列来了,要不要上车?
前面发了一些关于 Shader 编程的文章,有读者反馈太碎片化了,希望这里能整理出来一个系列,方便系统的学习一下 Shader 编程。
字节流动
2023/09/04
1.5K0
OpenGL & Metal Shader 编程系列来了,要不要上车?
谷歌正式发布WebGPU!90多位贡献者研发6年,浏览器终于可以利用底层硬件了
整理 | 褚杏娟、核子可乐 经过六年的开发,当地时间 4 月 6 日,谷歌 Chrome 团队正式发布 WebGPU,用于在网络上进行高性能 3D 图形与数据并行计算。WebGPU 现已在 Beta 测试阶段的 Chrome 113 中默认启用。 WebGPU 是一种新型 Web 图形 API,具有显著减少同等图形规模下 JavaScript 工作量、将机器学习模型的推理效率提升 3 倍以上等优势。之所以能实现这样的飞跃,要归功于其令 WebGL 无法实现的灵活 GPU 编程和高级功能访问能力。 据悉,W
深度学习与Python
2023/04/10
1.3K0
谷歌正式发布WebGPU!90多位贡献者研发6年,浏览器终于可以利用底层硬件了
OpenGL自制游戏引擎-HelloTriangle
Pipeline: 开始绘制图形之前,我们必须先给OpenGL输入一些顶点数据,OpenGL不是简单地把所有的3D坐标变换为屏幕上的2D像素;OpenGL仅当3D坐标在3个轴(x、y和z)上都为-1.0到1.0的范围内时才处理它。所有在所谓的标准化设备坐标(Normalized Device Coordinates)范围内的坐标才会最终呈现在屏幕上. 定义这样的顶点数据以后,我们会把它作为输入发送给图形渲染管线的第一个处理阶段:顶点着色器。它会在GPU上创建内存用于储存我们的顶点数据,还要配置OpenGL如何解释这些内存,并且指定其如何发送给显卡。顶点着色器接着会处理我们在内存中指定数量的顶点。 通过顶点缓冲对象(Vertex Buffer Objects, VBO)管理这个内存,它会在GPU内存(通常被称为显存)中储存大量顶点。使用这些缓冲对象的好处是我们可以一次性的发送一大批数据到显卡上,而不是每个顶点发送一次。从CPU把数据发送到显卡相对较慢,所以只要可能我们都要尝试尽量一次性发送尽可能多的数据。 顶点缓冲对象是我们在[OpenGL]教程中第一个出现的OpenGL对象。就像OpenGL中的其它对象一样,这个缓冲有一个独一无二的ID,所以我们可以使用glGenBuffers函数和一个缓冲ID生成一个VBO对象:
祝你万事顺利
2019/07/02
1.6K0
一看就懂的 OpenGL 基础概念丨音视频基础
这个公众号会路线图式的遍历分享音视频技术:音视频基础 → 音视频工具 → 音视频工程示例 → 音视频工业实战。关注一下成本不高,错过干货损失不小 ↓↓↓
关键帧
2022/11/29
2.8K0
一看就懂的 OpenGL 基础概念丨音视频基础
【C++】OpenGL:着色器基础与GLFW创建三角形示例
另外,在图形渲染中,要记住2D坐标和像素也是不同的,2D坐标精确表示一个点在2D空间中的位置,而2D像素是这个点的近似值,2D像素受到你的屏幕/窗口分辨率的限制。
DevFrank
2024/07/24
4310
【C++】OpenGL:着色器基础与GLFW创建三角形示例
【前端可视化】 OpenGL / WebGL 入门和实践
OpenGL 是一套规范,不是接口,学习这套规范,就可以在支持 OpenGL 的机器上正常使用这些规范,在显示器上看到绘制的结果。
ConardLi
2019/10/24
4.8K1
从关键概念开始,万字带你轻松入门 WebGL
只要理解了 WebGL 背后的概念,学习 WebGL 并没有那么难。很多 WebGL 入门文章并没有介绍这些重要的概念,直接使用 WebGL 复杂的 API 开始渲染图形,很轻松就把入坑文变成了劝退文。这篇文章将会着重讲解这些概念,并一步步探究 WebGL 是如何渲染图片到屏幕的,理解这些重要的概念,将会大大降低学习曲线。
羽月
2022/10/08
2.2K0
从关键概念开始,万字带你轻松入门 WebGL
音视频技术基础(四)-- OpenGL
既然是学习音视频技术,那必然少不了渲染这个环节,OpenGL就是进行图形渲染的一个重要角色。
黑眼圈云豆
2020/07/10
2.1K0
OpenGL 系列---基础绘制流程
OpenGL 是一种应用程序编程接口,它是一种可以对图形硬件设备特性进行访问的软件库。
音视频开发进阶
2019/07/26
2K0
跨平台渲染引擎之路:拨云见日
最近在工作中越来越多地接触到一些3D以及相比常见特性更酷炫的效果,因此萌发了想要自己从0开始打造一个渲染引擎的念头,一方面是为了更好地实现公司业务的需求,另一方面则是可以学到整个渲染流水线上的方方面面。
音视频开发进阶
2019/07/30
1.5K0
相关推荐
1.opengl绘制三角形
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验