5

我们正在维护一个使用 DirectDraw 的全屏 256 色图形模式的旧视频游戏。问题是,某些在后台运行的应用程序有时会在游戏运行时尝试更改系统调色板,从而导致图形损坏。

我们可以(有时)通过处理 WM_PALETTECHANGED 消息来检测何时发生这种情况。几个更新版本之前,我们添加了日志记录(只记录窗口标题/类/进程名称),这有助于用户识别有问题的应用程序并关闭它们。MSN Live Messenger 是一个常见的罪魁祸首。

当我们发现 Windows Vista(和 7)“自行”完成时,问题变得更糟了。WM_PALETTECHANGED 参数指向 CSRSS 和桌面窗口。在 Vista 中,一种常用的解决方法是打开任何文件夹(计算机、文档等)并在运行游戏时将其保持打开状态。听起来很荒谬,但它确实有效——在大多数情况下。在 Windows 7 中,即使是这种解决方法也不再有效。用户发现停止某些服务(Windows 更新和索引服务)也解决了某些配置上的问题。

前段时间我刚开始尝试随机的东西,希望能找到解决方案。我发现在设置 DirectDraw 调色板(使用 IDirectDrawPalette::SetEntries)之前设置 GDI 调色板(使用 Create/SelectPalette)会在调色板损坏后恢复它(WM_PALETTECHANGED 处理程序)。SetSystemPaletteUse 和在主表面上调用 SetPalette 提供了更多帮助。然而,当应用程序试图窃取调色板时,仍然存在可察觉的闪烁,这在淡入淡出期间尤为突出。

问题:有没有办法获得一个“真正的”专有调色板,只要我们的游戏保持焦点,就完全不允许其他应用程序更改 Windows 调色板?

4

5 回答 5

3

您可以做的是一个“简单”的解决方法。由于您的游戏是旧游戏,它可能与当前硬件不匹配,这就是为什么这个技巧会起作用的原因:

  • 将所有内容都复制到屏幕外缓冲区(内存)
  • 使用当前调色板将 8 位缓冲区转换为 16 位(或 32 位)(也在内存中完成)
  • 将 16 位(或 32 位)缓冲区的内容复制到屏幕的后缓冲区
  • 翻转屏幕缓冲区。

这将需要对您的游戏进行最少的更改,并且将完全摆脱调色板问题,尽管您的游戏仍然可以使用它所有的调色板技巧

R

于 2009-08-11T11:09:44.227 回答
1

有人实际上在这里找到了一个注册表项修复:

http://answers.ea.com/t5/Command-Conquer-The-Ultimate/Common-Problems-Read-This-Before-Posting/mp/222052

在该页面上查找“加扰颜色”,您将获得所需修复的部分。


不过,由于在线资源转瞬即逝,以下是完整的解释:

在“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectDraw\Compatibility\”下为程序创建一个新密钥。

如果您应用兼容性的程序是 32 位程序,并且您在 64 位系统上(手动应用或通过 64 位程序应用),请不要忘记添加“Wow6432Node “在“软件”和“DirectDraw”之间进行补偿。

在该键中,设置以下值:

  • “标志”(REG_BINARY):[00,08,00,00]
  • “名称”(REG_SW):程序的文件名。没有路径,只有可执行文件名。
  • "ID" (REG_BINARY):应用程序的 DirectDraw ID。

要获取所需的 DirectDraw ID,请运行该程序,然后检查此注册表项:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectDraw\MostRecentApplication

同样,如果您使用的是 64 位系统并且您正在执行此操作的程序是 32 位系统,请在“软件”之后添加“Wow6432Node”。

该密钥中的 ID 为四个字节。颠倒它们的顺序以获取要放入 ID 值的字节。32dd83d5 变为 d5,83,dd,32。

于 2010-08-02T20:47:55.257 回答
0

显然“应用程序不应调用 SetSystemPaletteUse,除非它具有最大化的窗口和输入焦点”。也许其他一些程序行为不端。这种描述听起来很像微软希望所有程序都合作并且没有办法强迫他们这样做。这就像回到 Windows 3.1。:)

随机建议:您是否尝试过 SetSystemPaletteUse 与 SYSPAL_NOSTATIC256 参数?

您还可以查看您的调色板是否包含 20 种 Windows 保留颜色;如果是这样,这意味着任何其他只使用 Windows 颜色的调色板程序都不需要更改调色板来呈现自己,据我所知。

于 2009-06-30T16:43:54.327 回答
0

我根本不知道 DirectX,但我建议尝试在屏幕外进行渲染,然后转换为显示深度......我想你可以让 Direct2D 为你做所有这些......

于 2010-05-26T20:17:12.923 回答
0

您所要做的就是16 bit在控制面板中将您的 PC 设置为颜色,然后游戏就可以正常运行Original Command and Conquer了:D

于 2013-07-19T19:24:01.587 回答