屏幕分辨率与FPS
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了屏幕分辨率与FPS相关的知识,希望对你有一定的参考价值。
屏幕分辨率
刷新率分为垂直刷新率和水平刷新率,一般提到的刷新率通常指垂直刷新率。
垂直刷新率表示屏幕的图象每秒钟重绘多少次,也就是每秒钟屏幕刷新的次数,以Hz(赫兹)为单位。
刷新率越高越好,图象就越稳定,图像显示就越自然清晰,对眼睛的影响也越小。刷新频率越低,图像闪烁和抖动的就越厉害,眼睛疲劳得就越快。
一般来说,如能达到80Hz以上的刷新频率就可完全消除图像闪烁和抖动感,眼睛也不会太容易疲劳。
显然刷新率越高越好,但是建议你不要让显示器一直以最高刷新率工作,那样会加速CRT显像管的老化,一般比最高刷新率低一到两档是比较合适的,建议85Hz。
而液晶显示器(LCD/LED)的发光原理与传统的CRT是不一样的,由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不象阴极射线管显示器(CRT)那样需要不断刷新亮点。
因此,液晶显示器画质高而且绝对不会闪烁,把眼睛疲劳降到了最低。
而刷新率对CRT的意义比较突出,有时,LCD/LED刷新高了,反而会影响其使用寿命般保持在60-75就可以了。
参考: http://ask.zol.com.cn/q/6612.html
以我的笔记本为例,用了2个显示器,如下图:
Mac 下外接 Dell GL2250 显示器的刷新率:
Mac 笔记本自身的显示器 刷新率是没法设置的。
查看硬件详情可以看到:
外接 Dell E2715H 的分辨率是 60Hz,
查询硬件说明,跟显示器有关的如下:
https://support.apple.com/kb/SP649?locale=zh_CN&viewlocale=zh_CN
- 13.3 英寸 (对角线) LED 背光光面宽显示屏,支持数百万色彩。
- 支持分辨率:16:10 宽高比可显示 1280 x 800 (初始)、1152 x 720、1024 x 640 和 800 x 500 像素;4:3 宽高比可显示 1024 x 768、800 x 600 和 640 x 480 像素;4:3 拉伸宽高比可显示 1024 x 768、800 x 600 和 640 x 480 像素;3:2 宽高比可显示 720 x 480 像素;3:2 拉伸宽高比可显示 720 x 480 像素
LCD的闪烁频率是不能调节的。
液晶显示器的刷新频率,就使用操作系统默认的60Hz,不要改(不管系统默认多少都不要改)。LCD不是CRT显示器,它的内部不是阴极射线管,不是靠电子枪去轰击显像管上的磷粉产生图像。
LCD显示器是靠后面的灯管照亮前面的液晶面板而被动发光,只有亮与不亮、明与暗的区别。所以,液晶显示器没有电子枪逐行及隔行扫描屏幕的原理(LCD显示器工作时,每个像素点自始至终都发光,不存在闪烁的现象),也就不存在刷新频率的概念,改不改都一个样,刷新频率对所有的LCD均不起作用。
FPS 相关信息
frames per second(FPS, 帧率),作为渲染效率的一种衡量,反映的是整个程序在当前的一个渲染状态下平均每秒所能容纳的“渲染循环”执行次数,也表征了平均每个“渲染循环”(帧)所用的时间。就表面来看,很多人觉得只要在一个每帧运行一次的函数内设置一个计数器,这样计算出一秒内的记数,便可作为该1s瞬间的FPS了;同样也很容易能求出平均FPS。
http://www.zwqxin.com/archives/opengl/swapbuffers-fps-vsync.html
为什么我的程序的FPS基本不会大于75呢?
恩,以前做的DEMO,如果是有计算FPS的,都是这样:场景复杂的时候它可以降低到1或者直接0掉,但是对于简单的场景它永远只有72左右的FPS;再简单,也是72左右;再再简单,还是72左右……可以说是“封顶”了。
于是我把整个渲染流程核查一次,先把消息处理和循环部分弄成一般WIN32的形式,貌似无关……然后又检查像素格式,直接把最佳像素格式设置为10,(某些程序DEMO中设计者会轮巡所有像素格式找出最佳匹配的,于是我也容易知道对我最“友好”的像素格式是10号……)貌似也没啥。另外,检查FPS计算的式子,没发现异常。我又把渲染函数RenderGLScene内的东西一个个注释……才发现,只有当我注释了SwapBuffers时,屏幕显示死掉了,但FPS上到了3000以上……对比72的FPS我还是比较相信这个——所以,是双缓冲的关系么。在像素设置中改像素描述器的PFD_DOUBLEBUFFER为PFD_SWAP_COPY、PFD_SWAP_EXCHANGE之类的,这下FPS也是很高,但是屏幕猛闪~ - - 。google吧,步小心发现了一个东西:vsync。
在学Irrlicht引擎的时候,建立DEVICE的时候有一个参数选项:vsync,vertical syncronisation,API解释得不清楚,就知道跟屏幕有关……屏幕?屏幕刷新率?我突然想起我做图像处理的WIN32程序时的一个窘况:release出来的程序在人家面前演示,发现图片/视频出不来,后来明白是屏幕刷新率的问题——屏幕刷新率太高会把WIN32循环对屏幕窗口所做的东西“消灭”掉。那么,这里呢?好,我去看文章了:vertical syncronisation。
垂直同步。原来,程序每一帧的函数全部执行完之后,还要等屏幕刷新了才去执行下一帧啊!一查屏幕刷新率——难怪是72左右呀,正因为偶电脑上设置的屏幕刷新率是72!恩,这里头肯定有个像sleep那样有等待功能的函数做帮凶——噢,亲爱的SwapBuffers,是你呀~
曾经有人说SwapBuffers比glut库的glutSwapBuffers效率低不少(见这里),但这里不是这个问题。无论是SwapBuffers还是glutSwapBuffers还是wglSwapBuffers,它们位于渲染体的末端,都有这么个“功能”:当显卡的垂直同步功能vsyn被置为TRUE时,每一帧渲染完后来到SwapBuffers,都要悲情地等待下一次屏幕刷新的时刻到来,再交换前后缓冲并开始执行下一帧……上面那篇文章用到了WGL_EXT_swap_control扩展,利用wglSwapIntervalEXT来设置“等待的间隔”。间隔是指一个屏幕刷新的周期,譬如屏幕刷新率是72Hz,那么一个周期就是(1/72)s, wglSwapIntervalEXT(1)表明要让SwapBuffers类函数开始执行后要等到下一个屏幕刷新时才返回——然后继续下一帧的执行。wglSwapIntervalEXT(2)就是等下个再下个屏幕刷新了。这么说,wglSwapIntervalEXT(0),哈,就是不用等——关闭垂直同步Vsync。
曾经有人说SwapBuffers比glut库的glutSwapBuffers效率低不少(见这里),但这里不是这个问题。无论是SwapBuffers还是glutSwapBuffers还是wglSwapBuffers,它们位于渲染体的末端,都有这么个“功能”:当显卡的垂直同步功能vsyn被置为TRUE时,每一帧渲染完后来到SwapBuffers,都要悲情地等待下一次屏幕刷新的时刻到来,再交换前后缓冲并开始执行下一帧……上面那篇文章用到了WGL_EXT_swap_control扩展,利用wglSwapIntervalEXT来设置“等待的间隔”。间隔是指一个屏幕刷新的周期,譬如屏幕刷新率是72Hz,那么一个周期就是(1/72)s, wglSwapIntervalEXT(1)表明要让SwapBuffers类函数开始执行后要等到下一个屏幕刷新时才返回——然后继续下一帧的执行。wglSwapIntervalEXT(2)就是等下个再下个屏幕刷新了。这么说,wglSwapIntervalEXT(0),哈,就是不用等——关闭垂直同步Vsync。
来自:http://www.zwqxin.com/archives/opengl/swapbuffers-fps-vsync.html
以上是关于屏幕分辨率与FPS的主要内容,如果未能解决你的问题,请参考以下文章