“独家”DirectDraw调色板实际上并不是独家的

时间:2009-06-28 06:07:25

标签: gdi directdraw palette

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

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

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

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

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

5 个答案:

答案 0 :(得分:3)

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

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

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

[R

答案 1 :(得分:1)

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

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

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


由于在线资源稍纵即逝,这里有完整的解释:

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

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

在该键中,设置以下值:

  • “Flags”(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。

答案 2 :(得分:0)

显然是"an application should not call SetSystemPaletteUse, unless it has a maximized window and the input focus"。也许其他一些程序行为不端。这种描述听起来非常像微软希望所有程序都能合作,并没有办法强迫他们这样做。这就像回到Windows 3.1。 :)

随机建议:您是否尝试过使用SYSPAL_NOSTATIC256参数设置SetSystemPaletteUse?

您还可以看到您的调色板是否包含20种Windows保留颜色;如果是这样,这意味着任何其他只使用Windows颜色的palettised程序都不需要更改调色板以便自我渲染,正如我所理解的那样。

答案 3 :(得分:0)

我根本不了解DirectX,但我建议尝试在屏幕外渲染然后转换为显示深度...我想你可以让Direct2D为你做所有这些... < / p>

答案 4 :(得分:0)

您需要做的就是在控制面板中将PC设置为16 bit颜色并且游戏正确,对我来说是Original Command and Conquer:D