5

DirectDrawでフルスクリーンの256色グラフィックモードを使用する古いビデオゲームを維持しています。問題は、バックグラウンドで実行されている一部のアプリケーションが、ゲームの実行中にシステムパレットを変更しようとすることがあり、その結果、グラフィックが破損することです。

WM_PALETTECHANGEDメッセージを処理することで、これがいつ発生するかを(場合によっては)検出できます。いくつかの更新バージョンでは、ログを追加しました(ウィンドウのタイトル/クラス/プロセス名をログに記録するだけです)。これにより、ユーザーは問題のあるアプリケーションを特定して閉じることができます。MSNLiveMessengerが一般的な原因でした。

Windows Vista(および7)が「単独で」それを実行することがわかったとき、問題はさらに悪化しました。WM_PALETTECHANGEDパラメーターは、CSRSSとデスクトップウィンドウを指します。Vistaでは、よく機能する回避策は、任意のフォルダー(コンピューター、ドキュメントなど)を開き、ゲームの実行中は開いたままにすることでした。ばかげているように聞こえますが、ほとんどの場合、うまくいきました。Windows 7では、この回避策でさえ機能しなくなりました。一部のサービス(Windows Updateおよびインデックスサービス)を停止しても、一部の構成で問題が解決したことがユーザーからわかりました。

少し前に、私は解決策を見つけることを期待してランダムなことを試し始めました。DirectDrawパレットを設定する前に(Create / SelectPaletteを使用して)GDIパレットを設定すると(IDirectDrawPalette :: SetEntriesを使用)、破損したパレット(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):アプリケーションのDirectDrawID。

必要なDirectDrawIDを取得するには、プログラムを実行してから、次のレジストリキーを確認してください。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectDraw\MostRecentApplication

繰り返しになりますが、64ビットシステムを使用していて、これを実行しているプログラムが32ビットシステムの場合は、「ソフトウェア」の後に「Wow6432Node」を追加します。

そのキーのIDは4バイトです。順序を逆にして、ID値に入れるバイトを取得します。32dd83d5はd5,83、dd、32になります。

于 2010-08-02T20:47:55.257 に答える
0

どうやら「最大化されたウィンドウと入力フォーカスがない限り、アプリケーションはSetSystemPaletteUseを呼び出さないでください」。おそらく、他のプログラムが誤動作している可能性があります。その説明は、Microsoftがすべてのプログラムが協力し、そうするように強制する方法を提供しないことを望んでいるように聞こえます。これは、Windows3.1に戻ったようなものです。:)

ランダムな提案:SYSPAL_NOSTATIC256パラメーターを指定してSetSystemPaletteUseを試しましたか?

また、パレットに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 に答える