“Exclusive” tavolozza DirectDraw non è in realtà esclusiva
-
20-08-2019 - |
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
?Soluzione
Qualcuno ha effettivamente trovato una soluzione voce di registro per questo, qui:
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