最近在 Windows 7 上玩了經典遊戲 Road Rash PC 版,發現顏色在遊戲開始不久後出現 紫色、紅色、綠色 等很奇怪的破圖

立刻想到以前玩的 世紀帝國2 也是如此,


來看一下所謂的 破圖,還有原本該是什麼樣子 :




BAD - Age of Empires 2

AOE 2



GOOD - Age of Empires 2

AOE 1  





BAD - Road Rash PC

RoadRash 2



GOOD - Road Rash PC

RoadRash 1  




Solutions - Old Way


網路上大部分都是以下做法,利用 BAT 檔去把 explorer 執行程序關閉後,再來執行遊戲

缺點是會把視窗關閉,而且程式恢復後,有些應用程式的 系統列圖示不會讀取回來,


TradKillExp  





Solutions - Good Way


下載這個 免安裝小程式 Palettestealer Suspender (點 Download zipped binary)

在遊戲運行前打開,再開啟遊戲,問題一切解決 (至於如何設定程式 請往下看)



設定上只要設定一次即可,下次只要打開 PalettestealerSuspender

直接執行遊戲,程式會自動偵測遊戲有沒有在運行 而生效



如何設定 :


prep. 打開 Palettestealer Suspender

1. 點 Browse 瀏覽遊戲 (如果遊戲是 由啟動器執行,要瀏覽真正在跑的程式,而非啟動器)

2. 點 Add 新增到遊戲清單

3. 將 上面遊戲清單中選項 打勾

4. 點右下角 Save and Hide

5. 直接開遊戲~


PalettestealerSuspenderHowTo  



而下次使用時,只要將程式打開,接著直接執行遊戲!





Notes


該程式偵測到遊戲執行時,會把 explorer.exe 視窗總管 "暫止"

類似於像是 System Explorer, Process Explorer, Process Hacker 等軟體內的 Suspend Process 功能


因此如果按 Alt + Tab ,回到桌面時將會無法控制任何視窗

解決辦法 :
此時按 Ctrl + Alt + Del 叫出工作管理員,將 PalettestealerSuspender.exe 和 explorer.exe 關閉

再執行 explorer.exe 即可恢復正常





Other Ways


請參考 此篇文章

本篇文章的大部分來源都是參考自該文章




Why it Happens


根據 Palettestealer Suspender 的作者文章 表示

DirectX 有個 Directdraw 元件,是用來 render 2D 圖片


在以前電腦不是跑的很快的時候,Directdraw 記錄著一張 256色的 palette, 可以用來快速地繪圖

那麼這張 palette 就不應該在繪圖期間被修改,像是有幾個顏色是 草地的顏色、海洋的顏色

如果被修改,那麼畫出來就會變亂七八糟的


有個 API 函式 SetSystemPaletteUse 就是來修改這個 palette

而 Vista 和 Windows 7 的 explorer.exe 和 csrss.exe 就是呼叫 SetSystemPaletteUse 函式的元兇

因此遊戲繪出來的 一些顏色是被其他程式給指定的


有些 programmers 利用一些方法來偵測 "何時" 這個 palette 被修改,然後嘗試立刻修復這張 palette

但是大部分結果還是 遊戲圖片會閃爍,因為程式還是在互相呼叫來呼叫去

所以,最簡單的方法就是把會在遊戲期間呼叫 SetSystemPaletteUse 的程式給 suspend


problem solved





Ebola

ebola777.pixnet.net


文章標籤
創作者介紹

Shawn's Blog

Shawn 發表在 痞客邦 PIXNET 留言(0) 人氣()