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

时间:2011-06-10 15:42:17

标签: windows opengl graphics direct3d

在普通计算机上显示模式更改(分辨率,深度)时会发生什么? (经典的便携式和笔记本电脑)

由于视频卡如此不同,这可能不是那么微不足道,但有一件事对所有人来说都很常见:

  • 屏幕变黑(可以理解,因为信号关闭)
  • 使用新模式
  • 返回信号需要几秒钟

如果它在D3D或GL下:

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

有人可以解释这个的潜在本质,特别是为什么显示模式的改变不是后备缓冲器的一个简单的重新分配并且需要这么长的时间吗?

1 个答案:

答案 0 :(得分:13)

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

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

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

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

如果像素数据格式发生变化,通常需要对可见帧缓冲区进行完全重新初始化,但是今天的GPU在将异构像素格式映射到目标帧缓冲区方面非常出色,因此也没有必要的延迟。