- 主题:directx怎么实现输出可变帧率?
显卡输出到显示器的那个参数叫做刷新率,不叫帧率。这是两个概念。刷新率是显卡驱动层的工作,应用程序不需要做任何事情。free sync 是显卡驱动和显示器共同支持才能实现的。
对于应用程序来说,你只要关注帧率就行了。
【 在 o5o 的大作中提到: 】
: 不只是游戏或者视频本身内容的fps,而是显卡输出信号的场频可变。就是free sync 或者gsync的信号输出。RefreshRate. numerator这个应该是固定场频输出,比如60Hz。怎么实现30-120的动态变化啊。谢谢
--
FROM 120.244.156.*
具体原理不清楚,但是实现这个应该有很多方法吧。最简单的办法就是显卡驱动收到一帧画面就给显示器推送一帧。这不就是可变刷新率嘛。
对比固定帧率,就是无论显卡驱动有没收到新的画面都以一个固定频率定时的给显示器推送数据。
【 在 o5o 的大作中提到: 】
: 感谢,我对帧率这个概念有点误解。freesync是显卡和显示器共同作用,但是显卡当前时刻用什么刷新率,freeaync下,这是游戏的帧率来定的,我问得就是dx上这里游戏怎么和显卡变化的刷新率同步上。显卡的输出是跟着游戏渲染速度来的。
:
--
FROM 120.244.156.*
首先,显卡驱动并不知道当前的帧率,也不需要知道。只要一帧数据准备好了就产生一个 v sync 就行了(具体机制不清楚,不一定是 v sync。也可能是其他硬件信号)。任意两个 v sync 之间的间隔都不需要相同。对于显示器来说见到 v sync 就刷新,没有就等待。根本就没有一个固定刷新率。
显卡驱动不需要 DX 给任何控制。只要 DX 能告诉显卡驱动一帧图像准备好了就行。
DirectX 我不熟,我估计大概的流程也类似一个 BEGIN() END() 块(或者其他类似的函数)。 在 END() 函数里 DX 会告诉显卡驱动我这帧画完了,你可以拿走了。
【 在 o5o 的大作中提到: 】
: 假如游戏前10秒是60hz的速度渲染,后10秒是30hz的渲染,那显卡驱动是怎么知道某个帧开始,要从60hz改成30hz输出的?是freeaync的显卡驱动会自动去变不需要dx控制么?只看数据有数据来显示就产生v sync?
: 如果是固定刷新率的显卡,是固定输出vsync,这个dx在初始化时候就是可以设定的
:
--
FROM 120.244.156.*
freesync也是有范围的,肯定是显卡驱动和显示器协商一个刷新率的范围,两帧间隔过短并不会帧同步信号。间隔过长显卡驱动肯定会自动的插信号的。
【 在 o5o 的大作中提到: 】
: 如果说是freesync,没有一个固定刷新率是对的。如果是普通信号,基本刷新率就是固定的,vtotal不会变化,最多一条htotal。
: 如果按您说的只要数据好了就可以,那有可能freesync时候,显卡驱动就是数据来了就产生vsync,数据没来就一直是v front porch
:
--
FROM 117.136.0.*