一面:电话面试 一个人
第二个人
1.测试性能分析表格 得出结论(控制变量法) FPS 输入输出延迟
2.游戏参数设置 影响
3.V-Sycn G-Sycn介绍
4.抗锯齿
5.各向异性过滤
6.平时玩的游戏(?
二面:视频面试 一共三个人
第一个人
1.自我介绍
2.询问家常
3.介绍项目 人员分工 具体逻辑代码 样式等处理
4.算法题 冒泡排序
第二个人 (和电话面基本一致)
1.测试性能分析表格 得出结论(控制变量法) FPS 输入输出延迟
2.游戏参数设置 影响
3.V-Sycn G-Sycn介绍
4.抗锯齿
5.各向异性过滤
6.平时玩的游戏(?
第三个人 电话面试的那个人
职业规划 未来发展
有什么问题吗
笔记
游戏性能指标
FPS:显卡1s可以渲染的帧数
输入延迟:用户输入到输入结果反映到显示器上的时长
它们取决于
显卡计算能力
内存频率
CPU&GPU主频等因素
场景复杂度
抗锯齿优化程度
屏幕刷新率
垂直同步
帧生成时间
OpenGL渲染管线
什么是OpenGL:开放图形库的应用编程API 由各个硬件厂商进行硬件加速的实现,专注于图形的渲染,不包括输入等其他功能
整个过程是
用户输入
CPU进行逻辑运算 准备渲染内容并交给GPU
GPU执行渲染管线(pipeline)
生成帧缓存等待输出
输出到显示器
渲染管线流程
顶点数据
-
顶点变换 (顶点着色器)
-
三维坐标变换成二维坐标
模型顶点构建
变换到世界坐标
变换到相机坐标
变换到屏幕坐标
三维到二维
-
形状(图元)装配 面处理 这个阶段是根据索引将顶点连接在一起,组成线、面单元
几何着色器 将顶点着色器的输出值执行裁剪、透视分割、视口变换后进入光栅化阶段。
光栅化 将连续的物体结构(顶点信息&线面方程?)映射到离散的像素级别,确定需要被绘制的像素,完成插值工作(像素值插值)
片段着色器 对光栅化后的像素进行着色工作,产生每个像素值的颜色,alpha值,z-depth值 景深
-
测试与混合
裁剪测试
透明度测试
模板测试
深度测试
混合测试
输出到帧缓冲
将mesh(模型)从磁盘中读取到内存
-
CPU对每一个mesh设置渲染状态,调用draw call让GPU渲染所有使用同一个渲染状态的mesh
渲染状态包括 顶点着色器 像素着色器 材质 纹理等
相同渲染状态的mesh可以在一个batch中让GPU处理,因此可以通过合并draw call来进行优化,因为设置渲染状态是一件比较耗时的工作
-
设置渲染状态的同时将mesh信息从内存全部拷贝到显存
- mesh信息包括 定点位置 法线 切线等
顶点着色器对所有顶点进行坐标转换 最终转换到camera坐标
根据camera的可视视角对顶点信息进行裁剪,去掉视野外的
执行Culling,去掉所有非朝向camera的顶点(面?) 屏幕映射
-
光栅化,将连续的物体结构(顶点信息&线面方程?)映射到离散的像素级别,确定需要被绘制的像素,完成插值工作(像素值插值)
光栅化的本质是坐标变换、几何离散化。就是将几何信息转换成一个个的栅格组成的图像的过程。
确定需要被绘制的像素:通过对每个像素点进行采样,判断采样点是否在三角形内部来决定是否需要绘制
纹理信息的插值在这一步完成,为每一个像素得到正确的纹理坐标
基于采样的抗锯齿就在这一步执行:SSAA, MSAA等,越好的抗锯齿会导致越高的计算量
-
像素着色器/片段着色器:对光栅化后的像素进行着色工作,产生每个像素值的颜色,alpha值,z-depth值
- 阴影的渲染在这一步进行,越多的细节会需要进行越多次的着色过程
-
产生的每个像素值经过
z-test深度测试(去除所有被覆盖的像素),
通过的像素再进行混合测试(可以用于透明材质),
模板测试(一个掩膜,可以用于限制画面范围),
color mask(对颜色通道进行控制)后,得到最终颜色,放进颜色缓冲区
颜色缓冲区即帧缓冲
基于后处理的抗锯齿在这一步之后进行,主要通过对像素信息的分析以及一些缓冲信息得出边缘信息,并对边缘进行重着色
垂直同步
垂直同步主要聚焦在生成帧缓冲之后
需要解决的问题:
显卡输出帧与显示器显示不同步导致的画面撕裂
产生理由:
显示器与显卡的帧率不同,在显示器从前缓冲区读取像素信息还没有读取完的时候,显卡完成了新的一帧并向前缓冲区写入,导致显示器从前缓冲区读到两帧不同的画面
解决办法:
垂直同步强制将GPU与显示器的刷新率保持一致,在显示器读完一帧之前,不允许显卡写入前缓冲区
问题:
延迟&输入延迟变高,FPS降低
三重缓存
使用前中后三个帧缓冲区来解决锁FPS的问题,当垂直同步信号来之前,显卡产生的帧在中&后缓冲区交替缓存,当同步信号来了之后,将最新的帧缓冲与前缓冲区交换,保证了低延迟,同时不会有画面撕裂的问题,但是会对显存大小有要求
G-Sync和Adaptive-Sync(Free Sync)
搭载G-sync和Free sync的显示器可以动态调整他们的刷新率而不是固定的1/60秒或者1/144秒扫描完一张画面,他会去适应显卡的输出帧,而不是在这里等着,说白了就是:显示器刷新率变频技术。这样的话不仅可以解决画面撕裂,解决错帧,还可以保证几乎没有的鼠标延迟。
抗锯齿
主要有基于采样的抗锯齿和基于后处理的抗锯齿,还要了解一下最新的DLSS,以及这些抗锯齿会对游戏产生的影响(一般而言抗锯齿等级越高,游戏FPS越低,DLSS是例外,开了DLSS后游戏的FPS可能会升高)可以参考下面两篇文章
失真
-
几何失真
- 几何体边缘和一个像素部分覆盖
-
透明失真
- 贴图包含透明图案,由于贴图本身由个数有限的像素阵列所组成,当判断被渲染几何体透明与否的时候会将贴图的栅格化特性带入最后的渲染结果.
-
子像素失真
- 栅格化物体小于一像素
-
纹理失真
- 包含大量高频信号的纹理未被充分采样
-
渲染失真
- 像素渲染器在对每个像素进行颜色填充时产生的失真.
基于采样的反锯齿技术
提高渲染时的采样数来减少锯齿.
其中,采样数量,采样位置,采样类型和采用或和模式,影响画面质量
采样位置
OGAA(理想的四点采样) 规整的采样点排列 (不是最优解)
SGAA 稀疏摆放-任意两个采样点不会再N x N网格的同一行 列以及对角线上.(N皇后问题)
采样类型
SSAA 超采样抗锯齿 每个采样点都进行独立计算
MSAA 多重采样抗锯齿 每个像素点仅计算1次,对深度和模板值仍计算n次(降低性能开销)
CSAA (Nvidia 2006) 覆盖采样抗锯齿 保留MSAA像素点计算,深度和模板值处理方式的通识,增加了覆盖采样.后者并不存储任何着色,深度或模板信息,而是存储了一个二进制的Coverage值作为参考(增加了少量性能开销但在输出质量上更高),剥离覆盖率这个特性,针对地增加覆盖采样信息,更高的狂锯齿效率.
[图片上传失败...(image-ef8655-1592376782781)]
采样混合模式
常见或和方法 相同权重混合 box filter (传统MSAA采用
(AMD 2007 HD2900) 可编程的混合能力 根据采样点离像素中心的距离决定相应的混合权重
虽然基于采样的抗锯齿算法不仅原理简单,在采样点足够的情况下也有很优秀的效果,但在性能方面仍然会带来巨大的开销
后处理抗锯齿(分析抗锯齿)
渲染出未使用抗锯齿的原始画面(无任何采样和缩放),随后尝试通过对成品画面的分析来减少锯齿和失真。
延迟渲染中先不进行光照计算,而是在所有的缓冲区都计算完成(法线,色彩,深度信息等)最后融合这些缓冲区结果,在融合郭崇中剔除掉被遮盖的物体,进行针对性的光照运算,避免大量额外运算.
- 复杂度由O(mn) m代表总的几何体的像素总量 降低到O(m'n) m'代表屏幕分辨率 n代表光照数量。由于在很多情况下m'<<m,延迟渲染的性能优势就尤为明显。
冲突
MSAA的原理,我们可以发现MSAA之所以能节省性能是因为它仅仅处理几何体边缘相关的那些像素——计算混合完相关像素信息后覆盖到原有值上。但现在由于渲染管线被打乱,特别是由于最终的合成渲染是针对数个缓冲区执行,那些几何体原始信息已经丢失,便无法在最终渲染中判断到底哪些是边缘而哪些不是。这样一来MSAA只能对所有的像素进行采样,和SSAA已经没有什么区别了。
多重采样抗锯齿的缺失一直是延迟渲染的一个痛点,当然也有一些科学家试图引入额外的信息来辅助MSAA在这种渲染流程中判断边缘信息,但出于各种各样的原因应用并不广泛。
RTX20系列特性
实时光线追踪性能提高
DirectX12 Ultimate
可变速率着色集中处理细节丰富的区域,从而提高性能
同步浮点和整数处理使Turing GPU 性能提高
-
DLSS 深度学习超级采样 训练GPU渲染清晰的游戏图像
显卡性能不足以支持高分辨率流畅运行的时候
用低分辨率的硬件要求,实现了接近于高分辨率的显示效果