Domanda

Stiamo mantenendo un vecchio video gioco che utilizza una modalità grafica a 256 colori a schermo intero con DirectDraw. Il problema è che alcune applicazioni in esecuzione in background volte cercano di cambiare la tavolozza di sistema mentre il gioco è in esecuzione, che si traduce nella grafica danneggiati.

(a volte) di rilevare quando questo accade per l'elaborazione del messaggio WM_PALETTECHANGED. Qualche aggiornare le versioni fa, abbiamo aggiunto la registrazione (solo registrare il / classe / nome del processo titolo della finestra), che ha aiutato gli utenti a identificare le applicazioni incriminate e li chiudono. MSN Live Messenger è stato un colpevole comune.

Il problema è peggiorato quando abbiamo scoperto che Windows Vista (e 7) lo fa "da sé". I parametri WM_PALETTECHANGED puntano verso CSRSS e la finestra del desktop. In Vista, una soluzione che spesso ha lavorato è stato quello di aprire qualsiasi cartella (Computer, documenti, etc.) e lasciarlo aperto durante l'esecuzione del gioco. Suona ridicolo, ma ha funzionato - nella maggior parte dei casi. In Windows 7, nemmeno questa soluzione ha funzionato più. Gli utenti hanno scoperto che l'arresto di alcuni servizi (Windows Update e il servizio di indicizzazione) ha inoltre deliberato il problema su alcune configurazioni.

Qualche tempo fa ho iniziato a provare le cose a caso nella speranza di trovare una soluzione. Ho trovato che l'impostazione della tavolozza GDI (utilizzando Create / SelectPalette) prima di impostare la tavolozza DirectDraw (usando IDirectDrawPalette :: SetEntries) sarebbe ripristinare la tavolozza dopo che è diventato corrotto (WM_PALETTECHANGED handler). SetSystemPaletteUse e chiamando SetPalette sulla superficie primaria ha aiutato un po '. Tuttavia, v'è ancora percepibile sfarfallio quando un'applicazione tenta di rubare la tavolozza, che è particolarmente evidente durante dissolvenze.

Domanda: c'è un modo per ottenere una tavolozza esclusivo "reale", che non consente completamente altre applicazioni che cambiano la tavolozza di Windows a patto che il nostro gioco mantiene a fuoco

?
È stato utile?

Soluzione

Qualcuno ha effettivamente trovato una soluzione voce di registro per questo, qui:

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

Cercare "colori criptata" a quella pagina e si arriva a parte con la correzione è necessario.


Dal momento che le risorse online sono fugaci, però, ecco la spiegazione completa:

Fare una nuova chiave sotto "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ DirectDraw \ Compatibility \" per il programma.

Se il programma si sta applicando la compatibilità è un programma a 32 bit, e sei su un sistema a 64 bit (sia applicando manualmente o attraverso un programma a 64 bit), non dimenticare di aggiungere il "Wow6432Node" tra "Software" e "DirectDraw" per compensare questo.

In quella chiave, impostare questi valori:

  • "Flags" (REG_BINARY): [00,08,00,00]
  • "Nome" (REG_SW): Nome del file del programma. Nessun percorso, solo il nome del file eseguibile.
  • "ID" (REG_BINARY):. DirectDraw ID dell'applicazione

Per ottenere l'ID DirectDraw necessario, eseguire il programma e quindi controllare questa chiave di registro:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectDraw\MostRecentApplication

Anche in questo caso, se siete su un sistema a 64 bit e il programma si sta facendo questo è un 32 bit uno, aggiungere il "Wow6432Node" dopo "Software".

L'ID in quella chiave è di quattro byte. Invertire la loro fine di ottenere i byte per mettere in valore ID. 32dd83d5 diventa d5,83, dd, 32.

Altri suggerimenti

Che cosa si può fare è una soluzione 'semplice'. Dal momento che il gioco è un vecchio gioco è probabilmente alcuna corrispondenza per l'hardware attuale, che è il motivo per cui questo trucco funziona:

  • Blit tutto per un buffer di fuori campo (memoria)
  • convertire il buffer 8bit a 16 bit (o 32 bit) utilizzando la palette corrente (Quindi anche fatto in memoria)
  • copiare il contenuto del buffer a 16 bit (o 32 bit) alla backbuffer dello schermo
  • capovolgere la screenbuffer.

Ciò richiede modifiche minime al vostro gioco, e sarà sbarazzarsi di problemi di tavolozza completamente, se il gioco può ancora usare tutta la sua gamma di inganno

R

"la domanda non dovrebbe chiamare SetSystemPaletteUse, se non ha una finestra ingrandita e l'input focus ". Forse qualche altro programma si comporta male. Tale descrizione fa sembrare molto simile a Microsoft sperano tutti i programmi coopereranno e offrono alcun modo per costringerli a farlo. E 'come essere di nuovo in Windows 3.1. :)

suggerimento a caso: hai provato SetSystemPaletteUse con il parametro SYSPAL_NOSTATIC256

?

Si potrebbe anche vedere se la palette contiene i 20 di Windows colori riservati; se è così, vuol dire che qualsiasi altro programma palettised che utilizza solo i colori di Windows non sarà necessario modificare la tavolozza per rendere se stessa, se ho capito bene.

Non so DirectX a tutti, ma io suggerirei di provare a fare il vostro resa off-screen quindi la conversione alla profondità di visualizzazione ... immagino si può arrivare Direct2D per fare tutto ciò che per te ...

Tutto quello che dovete fare è impostare il PC per 16 bit colori nel Pannello di controllo e il gioco viene a destra, funziona su Original Command and Conquer per me: D

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top