windows - 显示模式更改期间会发生什么?

标签 windows opengl graphics direct3d

普通计算机的显示模式(分辨率、深度)发生变化时会发生什么? (经典文具和笔记本电脑)

这可能不是那么微不足道,因为视频卡是如此不同,但所有这些卡都有一个共同点:

  • 屏幕变黑(可以理解,因为信号已关闭)
  • 信号以新模式返回需要很多秒

如果它在 D3D 或 GL 下:

  • 图形设备丢失,必须重新加载所有 VRAM 对象,使模式更改时间更长

有人能解释一下这背后的本质吗,特别是为什么显示模式的改变不是后台缓冲区的微不足道的重新分配,而且需要这么“长”的时间?

最佳答案

唯一真正改变的是所谓的 RAMDAC(直接连接到视频 RAM 的数字模拟转换器)的设置,今天有了数字连接,它更像是 RAMTX(连接到视频 RAM 的 DVI/HDMI/DisplayPort 发送器)显存)。 DOS 图形程序员老手可能还记得 RAMDAC 之间的争斗、规范和自己代码的困境。

信号返回实际上不需要几秒钟。这是一个相当快的过程,但大多数显示设备都需要时间来与新信号参数同步。实际上,对于编写良好的驱动程序,垂直空白之间的变化几乎会立即发生。几年前,当显示器是,呃,更愚蠢和模拟的时候,在改变视频模式设置后,人们可以看到画面在短时间内变得疯狂,直到显示器重新同步(也许我应该拍一段视频,而我仍然拥有能够做到这一点的设备)。

由于实际发生的只是更改 RAMDAC 设置,因此只要基本参数保持不变,也不会丢失必要的数据:每像素位数、每像素分量数和像素跨度。事实上,OpenGL 上下文通常不会随着视频模式的改变而丢失它们的数据。当然,可见的帧缓冲区布局会发生变化,但移动窗口时也会发生这种情况。

不过,DirectX 图形有点不同。存在设备独占访问权限,每当在 Direct3D 全屏模式和常规桌面模式之间切换时,所有图形对象都会交换,因此这就是 DirectX 图形在从游戏切换到 Windows 桌面时如此滞后的原因。

如果像素数据格式发生变化,通常需要对可见帧缓冲区进行完全重新初始化,但如今 GPU 非常擅长将异构像素格式映射到目标帧缓冲区,因此也不需要延迟。

关于windows - 显示模式更改期间会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6308757/

相关文章:

c - wdm.h中类型名称 'R'中的 'PRKMUTEX'是什么意思?

ios - Swift:无法使用类型为 'init' 的参数列表调用 '($t3, NSString)'

c# - 如何在不创建窗口的情况下将 WPF UserControl 呈现为位图

c++ - 边界检测

c++ - 如何在给定位置和半径的情况下在 D3D11 中绘制球体?

python - 如何将图标添加到 Python pip 生成的可执行文件的入口 pip

java - 从 java 应用程序导出时,IE6 生成奇怪的工作表名称

windows - 批处理文件创建另一个文件,没有 "push"ren 到另一个文件

c++ - 尝试旋转此立方体时,为什么屏幕闪烁?

c++ - OpenGL:在没有绘制顺序的情况下渲染具有大量纹理透明度的模型?