PCEVA,PC绝对领域,探寻真正的电脑知识
123
返回列表 发新帖
打印 上一主题 下一主题
开启左侧

游戏高帧数需要高刷新显示器搭配才有效果

[复制链接]
41#
Ivanonline 发表于 2021-2-27 01:37 | 显示全部楼层
本帖最后由 Ivanonline 于 2021-2-27 04:29 编辑
印第安纳琼斯 发表于 2021-2-26 22:12
显示的确受限于速率,不过
缓存区不是直接发信息给显示器的。显示器接收的信号频率是固定的。缓存的更新 ...

我同意你的观点。看来还是你是完全理解了我的意思。。

实际传输的数据也就是一帧的数据,只不过这一帧包含了显卡在1/60秒这段时间内输出的N个帧的一部分。根本没有超过HDMI或者DISPLAY线缆标准的要求。

DP或HDMI的标准不断提升是有原因:是因为画面:8K,16K。画面越大,所需要传输的数据量越大。这个就不解释了。看看1080P,4K,8K,16K拍摄出来的视频大小就知道了。

我画的图虽然是用不同的颜色来标识不同的帧,但在实际显卡生成的每一帧,区别都是很小的。而且这种区别随着显卡生成的帧的增加(FPS提高),会越来越小。即使最后显示器显示出来的图像,由多个主机帧合到一起。区别也不是太大的。这一帧图像(显示器显示出来的)会有少许的位移(就像网上介绍画面撕裂,总是用的那种图一样)。但是这仅仅是一帧图像,显示器在1秒中内显示的60张图片中的一张。在没有动起来之前,在不知道后续显示器显示的图像之前。你是体会不到“撕裂”的。(关于撕裂我上面已经解释过了。我也举了一个能看到“画面撕裂”的例子。)

PS:别看我图上的显卡生成帧都是花花绿绿的,其实画面区别是不大的。
42#
Ivanonline 发表于 2021-2-27 03:12 | 显示全部楼层
本帖最后由 Ivanonline 于 2021-2-27 04:27 编辑

虽然涉及编程了,而且是安卓下的。但是这个原理应该还是可以看的懂的,特别是里面的两张图。
那两张图将输入也加进去了。带入咱的讨论,我感觉也可以变相的理解为游戏中的输入操作。这样就能更简单的理解游戏中操作是如何反映到屏幕上的。



多屏幕刷新率(refresh rate)模式下的帧显示流水线

来源:https://blog.csdn.net/alijaja/ar ... 1000.2123.3001.4430
43#
Ivanonline 发表于 2021-2-27 10:53 | 显示全部楼层
kingyesx1 发表于 2021-2-27 07:20
这和前缓存和后缓存没什么关系。而是产生什么样的帧内容。人只会根据帧的内容产生反应。
很多的操作是隐藏 ...



你引用错了。我发现你跟我一样。讨论着讨论着,发现引用错,然后就不知道说给谁了。我翻了翻我的帖子,我发现我也引用错发错人了。

PS:我66楼的图被你无视了。



44#
Ivanonline 发表于 2021-2-27 10:58 | 显示全部楼层
本帖最后由 Ivanonline 于 2021-2-27 11:22 编辑
kingyesx1 发表于 2021-2-27 07:32
没上限不停传输整帧的数据就会有我説的传输率上限的问题你可以算一下你説的模式所需要的传输上限是多少, ...

我之前就已经解释过这个了。

你一直认为是整帧传输。我一直在说是传输一部分。

我拿我之前举得那个例子再详细说明一下:就像你在windows里面拷贝一个文件。

这个文件大小是不变的(一整帧的大小),

拷贝时间是不变的(1/60秒拷贝完成)。

变的就是里面内容(根据主机生成的帧的多少)。


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

这是拿我62楼所的做为例子:

显示器在1/60秒显示的第一帧
ABCD
ABCD
BCD3
CCDD

然后咱按照这16个字母来带入。

在 1/60/16 秒,显示器显示了第一行的字母A
在 2/60/16 秒,显示器显示了第一行的字母B
在 3/60/16 秒,显示器显示了第一行的字母C
在 4/60/16 秒,显示器显示了第一行的字母D
在 5/60/16 秒,显示器显示了第二行的字母A
在 6/60/16 秒,显示器显示了第二行的字母B
在 7/60/16 秒,显示器显示了第二行的字母C
在 8/60/16 秒,显示器显示了第二行的字母D
在 9/60/16 秒,显示器显示了第三行的字母B

在 10/60/16 秒,显示器显示了第三行的字母C (注意这里,由于显卡第二帧已经完成,前后缓冲区切换,这时候,下一个字母输出的为显卡输出的第二帧中的数据,也可以认为是前缓冲区切换后,前缓冲区接着上面之前的前缓冲区继续传输的数据。)
在 11/60/16 秒,显示器显示了第三行的字母D   
在 12/60/16 秒,显示器显示了第三行的字母3
在 13/60/16 秒,显示器显示了第三行的字母C
在 14/60/16 秒,显示器显示了第三行的字母C
在 15/60/16 秒,显示器显示了第三行的字母D
在 16/60/16 秒,显示器显示了第三行的字母D(这时候 显示器整帧完成。)


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

为方便理解,下面是复制的63楼

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

既然你提到挤压了,我这里说一下。并没有挤压,挤压是你强加给我的。
按照你的图。应该就是这个状态(我就不画了,太费眼了。):ABCD   S1B2
ABCD   ACD1
BCAD   BCAD   <---
BBAA   BBAA   <---你这前两帧最后两行居然一样。不用你的了。我再编一个。


  显卡生成的
第一帧   第二帧                                     显示器在1/60秒显示的第一帧
ABCD     S1B2                                        ABCD
ABCD     ACD1                                        ABCD
BCAD     B1D3   --->   生成的是这个图      BCD3
BBAA     CCDD                                        CCDD



黄色太不明显,我这里用橘红色代替黄色。你知道这个意思就行了。。然后显示器生成的第一帧图像是后面那个。这样应该更清楚了。后面那一帧也是这样的。并没有挤压



然后撕裂我先不谈。这里也先别讨论撕裂。撕裂是另一回事。稍后我涉及到撕裂了,咱在讨论,好吗?


然后你的最后的问题,我的回答是:不能。


还有其他不是太明白的吗??

---------------------------------------------------------------------------------
45#
Ivanonline 发表于 2021-2-27 11:24 | 显示全部楼层
本帖最后由 Ivanonline 于 2021-2-27 11:26 编辑
kingyesx1 发表于 2021-2-27 11:11
嗯。观点的区别了。实际究竟是部分还是整帧,我不是专业的,我只是提出我的观点。因为这是我説高帧需要高 ...

我感觉这个应该就是分歧的关键点了。
另外关于139楼的文章你看了吗?那个里面可以提供给你关于延迟的一些思路。
46#
Ivanonline 发表于 2021-2-27 11:31 | 显示全部楼层
本帖最后由 Ivanonline 于 2021-2-27 11:32 编辑

算了我还是贴出来吧。
这是部分
注意中间流水线的图(时间轴的那几个图)
-------------------------------------------------------------------------------
多屏幕刷新率(refresh rate)模式下的帧显示流水线
whoatenereyhow 2020-05-07 12:54:58 1118 [url=] 收藏 1[/url]

分类专栏: Android Display/Graphics 文章标签: android core graphics framebuffer framework

[url=]版权[/url]



       给Android应用和游戏开发工程师的最新参考。

       长时间以来,手机显示屏幕的刷新率一直是固定的60Hz. 从2019年开始,由于游戏等应用对响应速度的需求越来越高,越来越多的手机开始在高刷新率(90/120Hz)的屏幕硬件上进行尝试,其中典型厂商的有小米、三星、摩托罗拉等。国内的天马、BOE等屏幕生产商也开始有能力供货高刷新率屏幕面板。

       当手机屏幕都是60Hz刷新率的时候,应用和游戏开发者只需要认定每一帧的处理时间16.6毫秒,并据此来优化自己的代码,显示的一切就都可以掌控。但以后就不是这样了。新的旗舰手机甚至中低档手机,都开始装配高刷新率的显示屏幕来提供更流畅动画,更低的延迟,更优秀的整体用户体验。有些手机更是同时支持多种刷新率,比如Pixel 4,Motorola edge,都同时支持60Hz 和 90Hz. 作者本次就是拿Pixel 4和Motorola edge作为参考机来了解高刷新率feature的。

       运行在60Hz刷新率模式的屏幕,每16.6毫秒刷新一次显示内容。这意味着一副画面显示的时间长度都是16.6毫秒的整数倍(16.6毫秒,33.3毫秒,50毫秒,等等)。但对于支持多刷新率的屏幕,想要保证显示刷新的速度和流畅性,应用开发工程师则需要考虑更多。比如,游戏开发工程师通常简单地假设手机一直以60Hz刷新,当在游戏运行中发现不能维持60fps流畅帧率的时候,就把游戏画面的帧率降低到30fps,从而保证用户仍然不会感觉到卡顿(因为此时屏幕每16.6毫秒更新一帧,那么更低的帧率就是每33.3毫秒更新一帧)。但一款游戏不能只适合运行在60Hz的设备上,当它被安装到90Hz刷新的手机上时,为了维持流畅的刷新,应用开发工程师需要把帧率降低到45fps(因为此时屏幕每11.1毫秒更新一帧,那么更低的帧率就是每22.2毫秒更新一帧)。在90hz的手机上,相同的游戏可以给用户提供更顺畅的显示体验(90/45fps比60/30fpx感觉更平滑)。一款同时支持90Hz和120Hz刷新率的手机,它在120、90、60(120/2)、45(90/2)、40(120/3)、30(90/3)、24(120/5)fps的帧率下,都能提供平滑的显示。

Rendering at high rates

       Render的速度越快,越难以维持该render速度,这是因为更高的render速度意味着同样的工作但更短的处理时间。在90Hz的刷新率下,应用只有11.1毫秒来处理完一帧数据。而在60Hz的刷新率下,应用就有16.6毫秒来完成相同的工作。

       为了更直观的说明问题,我们来看一下Android UI的render流水线,把应用的帧显示过程拆分成5个阶段:

  • 应用的UI thread 收到 input events,调用应用的callbacks并更新 the View hierarchy’s list of recorded drawing commands;
  • 应用的RenderThread发送 the recorded commands到GPU;
  • GPU进行绘图工作;
  • 负责各应用窗口显示工作的系统服务SurfaceFlinger,对各应用的显示内容进行合成并把合成后的frame发送给HAL(有些硬件合成的过程就是往屏幕发送数据的过程);
  • frame开始扫描并更新到屏幕上(比如通过MIPI接口)。

       整个流水线是由Android Choreographer控制的. Choreographer的运行又基于屏幕的vertical synchronization (vsync) events。vsync event代表显示硬件开始扫描输出图像到屏幕上(一行一行的显示). 基于vsync events,应用和SurfaceFlinger有不同的唤醒时间偏移量。下图显示了Pixel4在60Hz刷新率模式下的帧处理流水线。 应用在vsync event 发生后2毫秒被唤醒,而SurfaceFlinger是在vsync event发生后的6毫秒被唤醒. 这样应用就有20毫秒(阶段2+阶段3)的时间去处理一帧数据,而SurfaceFlinger也有10毫秒的时间去合成显示数据(阶段4)。这个处理时间对于一般的硬件平台都是可以胜任的。

       当手机运行在90Hz刷新率模式下的时候,应用仍是是在vsync event发生后2毫秒被唤醒,而SurfaceFlinger是在vsync event发生后的1毫秒被唤醒,这样为了给Surface留下足够的10毫秒时间去合成数据。但是,如果仍然要求数据在第2帧就往屏幕上发送的话,应用就只有10毫秒的时间去画图了,如下图。 这是一个非常短的时间,稍微复杂一些的显示工作,对于大部分平台的AP和GPU性能,都难以这么短的时间内完成画图工作。

       为了减轻画图的负担,Android的UI系统(hwui) 使用一种 “render ahead”机制 (SurfaceFlinger合成时间推迟一帧,但仍然在vsync event发生后1毫秒开始) 把显示时间延迟一个vsync period来拉长一帧数据的流水线时长. 这样应用就有21ms的时间去处理数据(画图,包括AP render和GPU渲染),而仍然能保持90Hz的帧率。

       有些应用,包括大部分游戏,会根据他们的画图的工作量来定制自己的render流水线,增加或减少render阶段数量。一般来说,因为画图工作量太大,会增加render流水线的长度,即在阶段2和阶段3增加并行处理阶段来提升计算效率。然而,这样的折中方案又会引入更大的帧延时 (the latency will be number_of_pipeline_stages x longest_pipeline_stage),需要综合权衡考量。





47#
Ivanonline 发表于 2021-2-27 18:31 | 显示全部楼层
刚刚去了一个朋友那里,他是专门搞软件,写代码的那种。前期开发过好几个手游。我专门问了问他这个问题。他说像他这种搞软件的,具体的工作就是把数据丢进帧缓存里面。之后之后如何显示到显示器上。他也不是太清楚。

48#
Ivanonline 发表于 2021-2-28 09:18 | 显示全部楼层
本帖最后由 Ivanonline 于 2021-2-28 09:19 编辑
印第安纳琼斯 发表于 2021-2-27 19:09
缓存里的画面,要显示到画面上,不翻译成显示器理解的“格式语言”是不行的。
那个“翻译”就是由我假想的 ...

学习了。以前看到显示器属性里面的这个,总是不明白什么意思。瞄一眼,就直接过了(对于不了解的知识的一般处理方法)。现在理解了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部