2009-06-28 10 views
5

Utrzymujemy starą grę wideo, która wykorzystuje tryb 256-kolorowy na pełnym ekranie z DirectDraw. Problem polega na tym, że niektóre aplikacje działające w tle czasami próbują zmienić paletę systemu podczas działania gry, co powoduje uszkodzenie grafiki."Ekskluzywna" paleta DirectDraw nie jest w rzeczywistości ekskluzywna.

Możemy (czasami) wykryć, kiedy tak się dzieje, przetwarzając komunikat WM_PALETTECHANGED. Kilka aktualizacji wersji temu dodaliśmy rejestrowanie (wystarczy, że zalogujesz się do tytułu/klasy okna/nazwy procesu), co pomogło użytkownikom zidentyfikować obraźliwe aplikacje i je zamknąć. MSN Live Messenger był częstym winowajcą.

Problem pogorszył się, gdy dowiedzieliśmy się, że Windows Vista (i 7) robi to "samodzielnie". Parametry WM_PALETTECHANGED wskazują na CSRSS i okno pulpitu. W systemie Vista rozwiązaniem, które często działało, było otwieranie dowolnego folderu (komputer, dokumenty itp.) I pozostawienie go otwartego podczas uruchamiania gry. Brzmi śmiesznie, ale zadziałało - w większości przypadków. W systemie Windows 7 to obejście już nie działa. Użytkownicy stwierdzili, że zatrzymanie niektórych usług (Windows Update i usługa indeksowania) również rozwiązało problem w niektórych konfiguracjach.

Jakiś czas temu zacząłem próbować przypadkowych rzeczy w nadziei na znalezienie rozwiązania. Zauważyłem, że ustawienie palety GDI (przy użyciu opcji Utwórz/WybórPaleta) przed ustawieniem palety DirectDraw (przy użyciu IDirectDrawPalette :: SetEntries) przywróci paletę po jej uszkodzeniu (WM_PALETTECHANGED handler). SetSystemPalette Zastosowanie i wywołanie SetPalette na powierzchni podstawowej pomogło nieco więcej. Jednak nadal widoczne jest migotanie, gdy aplikacja próbuje ukraść paletę, co jest szczególnie widoczne podczas zacieków.

Pytanie: czy istnieje sposób na uzyskanie "prawdziwej" ekskluzywnej palety, która całkowicie uniemożliwia innym aplikacjom zmianę palety Windows, o ile nasza gra zachowuje ostrość?

Odpowiedz

1

Ktoś rzeczywiście znalazł poprawkę wpisu rejestru w tym celu:

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

Poszukaj "zakodowanych kolorów" na tej stronie, a dojdziesz do części z poprawką, której potrzebujesz.


Ponieważ zasoby online są ulotne, choć tu jest pełne wyjaśnienie:

Utwórz nowy klucz pod "HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ DirectDraw \ Compatibility \" dla programu.

Jeśli program, dla którego aplikujesz, jest programem 32-bitowym, a używasz systemu 64-bitowego (stosując go ręcznie lub w programie 64-bitowym), nie zapomnij o dodać "Wow6432Node" pomiędzy "Software" i "DirectDraw", aby to zrekompensować.

W tym kluczu ustaw następujące wartości:

  • "Flags" (REG_BINARY): [00,08,00,00]
  • "Name" (REG_SW): Nazwa pliku programu. Brak ścieżki, tylko nazwa pliku wykonywalnego.
  • "ID" (REG_BINARY): DirectDraw ID aplikacji.

Aby uzyskać wymaganą ID DirectDraw, uruchom program, a następnie sprawdzić ten klucz rejestru:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectDraw\MostRecentApplication 

Ponownie, jeśli jesteś na systemie 64 bitowym oraz programem robisz to dla jest 32-bitowym, dodaj "Wow6432Node" po "Software".

Identyfikator tego klucza ma cztery bajty. Odwróć ich kolejność, aby uzyskać bajty do wprowadzenia wartości identyfikatora. 32dd83d5 stanie się d5,83, dd, 32.

+0

Dzięki, wysłaliśmy skrypt do testowania naszych użytkowników, zobaczmy jak będzie działać w naszej grze w praktyce. –

+0

Tak, wydaje się działać :) Dzięki! –

+0

To wygląda na kompatybilność, którą Microsoft umieścił w aplikacjach, które nie obsługiwały prawej palety. –

0

Podobno "an application should not call SetSystemPaletteUse, unless it has a maximized window and the input focus". Być może jakiś inny program źle się zachowuje. Opis ten sprawia, że ​​brzmi to tak, jakby Microsoft miał nadzieję, że wszystkie programy będą współpracować i nie będą w stanie zmusić ich do tego. To jak powrót do Windows 3.1. :)

Losowa sugestia: czy wypróbowałeś SetSystemPaletteUse z parametrem SYSPAL_NOSTATIC256?

Można również sprawdzić, czy paleta zawiera 20 zarezerwowanych kolorów Windows; jeśli tak, oznacza to, że jakikolwiek inny program z paletyzacją, który po prostu używa kolorów Windows, nie będzie musiał zmieniać palety, aby sam się wyrenderować, jak rozumiem.

+0

Gdy paleta dostanie skradziony, to zwykle cała (lub większość widocznej) palety, więc prawdopodobnie nie było to ustawienie aplikacji SetSystemPaletteUse. Dodaliśmy wywołanie SetSystemPaletteUse (dc, SYSPAL_NOSTATIC256), które pomogło w niektórych sytuacjach, ale nie rozwiązało głównego problemu. Przestrzeń paletowa jest ciasna, więc wolimy pozostać przy naszym migotaniu od czasu do czasu niż odtwarzać zawartość gry lub użytkownika. –

3

Co można zrobić, to "proste" obejście problemu. Ponieważ gra jest stara gra to chyba nie pasuje do obecnego sprzętu, który jest dlaczego ta sztuczka zadziała:

  • Blit wszystko do buforu poza ekranem (pamięć)
  • konwertować bufora 8bit do 16 bitów (lub 32 bitów) przy użyciu bieżącego palety (tak też wykonane w pamięci)
  • kopiowanie zawartości 16-bitowe lub 32-bitowego) (bufor do Backbuffer ekranu
  • klapce screenbuffer.

To wymaga minimalnych zmian w swojej grze i będzie pozbyć się problemów palety całkowicie, choć gra może nadal korzystać ze wszystkich to paleta oszustwo

R

+0

Ktoś robi to z pierwszych dwóch gier Command & Conquer (C & C1 i Red Alert 1), dokonując nadpisania ddraw.dll. Sprawdziło się całkiem ładnie i dodał także tryb okienkowy (po kilku hakach, aby dostosować funkcje przesunięcia myszy, aby zrekompensować przesunięcie 0 0 teraz-zmiennej). Informacje o projekcie pod adresem http://hifi.iki.fi/cnc-ddraw/ – Nyerguds

+0

Właśnie z tym przeszliśmy, ale nie przyszło taniej.Niektórzy użytkownicy zgłosili * potrójne * użycie procesora z powodu transformacji palety oprogramowania. –

+0

@CyberShadow Wtedy możesz zrobić to źle. Transformację można przeprowadzić za pomocą naprawdę ciasnej pętli, używając tylko odnośników. Jeśli chcesz, mogę sprawdzić twój kod. – Toad

0

nie wiem DirectX w wszystkie, ale proponuję spróbować renderowania poza ekranem, a następnie konwersji do głębi wyświetlania ... Wyobrażam sobie, możesz uzyskać Direct2D, aby zrobić to wszystko dla ciebie ...

0

Wszystko co musisz zrobić, to ustawić komputer do 16 bit kolorów w Panelu sterowania, a gra chodzi dobrze, działa na Original Command and Conquer dla mnie: D

+1

To nie jest rozwiązanie, które można zastosować w grze wideo. Co więcej, nie będzie działać w wersjach systemu Windows zaczynających się od Windows 8, które nie obsługują już trybów kolorów niższych niż True Color. –

+1

Nie można również ustawić głębi kolorów wyświetlacza na 16-bitową w systemie Windows 8 i nowszych. –

+0

Po prostu FYI, istnieje [a override ddraw] (http://hifi.iki.fi/cnc-ddraw/) stworzone specjalnie dla Command & Conquer, które działa na wszystkich systemach operacyjnych. Radziłbym tylko pobrać [pełną nieoficjalną łatkę do gry] (http://nyerguds.arsaneus-design.com/cnc95upd/cc95p106/); CnC-DDraw został zoptymalizowany do tego tak: p – Nyerguds

Powiązane problemy