操作系统是 Debian 12。视频驱动程序是 Nvidia 525.147.05。
我正在尝试通过使用 directx 的 wine 玩一款旧游戏。 (暗黑破坏神2)。我以窗口模式启动游戏,但是当我这样做时,整个屏幕改变了。 (据我所知,亮度、对比度、伽玛值)。游戏运行正常,但退出游戏时,遗憾的是之前的颜色设置没有恢复。
这里发生了什么?应用程序如何更改整个桌面的颜色设置?我如何确定具体更改了哪些设置?我在 中没有看到任何亮度或对比度等设置nvidia-settings
。
我该如何尝试将颜色设置恢复到启动游戏之前的样子?有没有办法“锁定”这些颜色设置,以便随机应用程序无法更改它们?我可以理解单个应用程序更改其设置自己的颜色,但干扰整个桌面是相当奇怪的。
答案1
实际发生的情况可能是由于 DirectX,Wine 将显示颜色深度从通常的 32/24 位“真彩色”模式(= 数百万种颜色同时可用)切换到 16 位索引颜色模式,并且无法切换它正确返回。
在索引颜色模式下,整个屏幕有一组颜色寄存器,其值可以从完整的数百万种颜色范围中选择,但屏幕上当时只能有尽可能多的不同颜色。可用的颜色寄存器(例如,16 位索引颜色模式下有 65536 种颜色,甚至 8 位模式下只有 256 种颜色)。在 X11 术语中,这些索引颜色模式称为伪彩色模式。
早在 X11 最初开发时,真彩色显示器并不常见,这种适应对于支持多个程序(可选地由多个系统通过网络创建)全部显示在同一屏幕的窗口中的能力是必要的。
以下是处理这种适应性时对 X11 应用程序的要求的描述:https://hea-www.harvard.edu/~fine/Tech/X11visuals.html
他们对不同颜色模式及其对用户的影响的描述特别恰当:
24 位真彩色视觉基本上是无限的颜色。你想要一种颜色,你就会得到那种颜色。您不必分配颜色,永远不会用完颜色,也不必满足于不完全是您想要的颜色。
8 位 PseudoColor 将意味着应用程序仅限于 256 种颜色。此外,这些颜色通常在所有应用程序中共享。因此,如果其他应用程序使用 245 种棕色色调,则您的应用程序将变为黑色和白色(几乎总是分配,加上这些棕色,再加上您选择的最多 9 种其他颜色。除非有不止一个其他应用程序正在运行,其中在这种情况下,颜色图可能已满,您无法选择任何颜色。
当然,8 位应用程序可以使用“私有色彩图”运行。这意味着该应用程序可以使用自己选择的任意 256 种颜色,而无需与其他应用程序竞争。这样做的缺点是,在大多数硬件上,这会导致“颜色图闪烁”。当您从一个应用程序移动到下一个应用程序时,整个屏幕会切换到不同的颜色图,这会导致所有非当前应用程序看起来像迷幻的呕吐物。一些用户愿意使用私有色彩图来获得足够的颜色。然而,大多数用户无法忍受。
Windows 的做法大致相同,但他们强制执行了一组大约 16 种“默认颜色”,如果可能的话,这些颜色应该包含在所有程序的颜色索引中,并且窗口装饰和其他 UI 元素被设计为使用尽可能仅使用这些颜色,从而最大限度地减少程序之间切换时的颜色失真。
好消息是桌面的实际颜色设置没有事实上发生了变化:您只是使用一组有限的颜色来查看常用的桌面。任何会重置 X 服务器的操作(例如注销和重新登录)都应该恢复正常状态。
不幸的是,由于真彩色显示器从此成为常态,处理伪彩色模式的影响,甚至从一种颜色模式切换到另一种颜色模式已经成为一门失传的艺术。现代台式机希望显示屏始终以其完整的原始分辨率和颜色深度运行。但您对旧 DirectX 游戏的使用给工作带来了麻烦。
过去可以/etc/X11/xorg.conf
使用Ctrl- Alt-Numpad+和 -Numpad-键在文件中配置的不同显示模式之间进行切换,但现在,显示模式会自动检测,并且默认情况下可能会禁用模式切换按键,因为平均现代如果用户不小心按下了数千个按键中的任何一个,他们会感到非常困惑。
我认为任何能够告诉 X11 切换显示颜色模式的程序或工具都必须使用该libXtst
库,但我找不到可以有效地将显示重置回默认真彩色模式的程序或工具。您可以尝试该xrefresh
命令,但我不抱太大希望:我认为它并不能完全满足这里的需要。