Gry na konsole i komputery PC mają czasami łatki do naprawiania błędów, których twórcy nie zauważyli / nie mieli czasu naprawić.
Moje pytanie brzmi: jak to działa?
Czasami pliki łatek mają kilka megabajtów. Nie rozumiem, jak mały plik może zmienić zgodny program.
Odpowiedzi:
Można to zrobić na wiele sposobów, najprościej byłoby XOR obu plików i skompresować je (GZIP itp.). Teoria tego polega na tym, że mam nadzieję, że można uzyskać dużą sekwencję zer (długie sekwencje tych samych wartości dobrze się kompresują).
Możesz rozwinąć tę koncepcję i znaleźć obszary dwóch plików, w których dane są identyczne, i całkowicie je pominąć.
Wreszcie możesz wykorzystać strukturę każdego typu pliku na swoją korzyść. Na przykład w EXE można spakować każdą metodę osobno (tylko te, które uległy zmianie) i samodzielnie odtworzyć EXE podczas aplikacji łatki; należy jednak pamiętać, że jest to bardzo prawdopodobne w dziedzinie przesady i może nie być warte wysiłku (zysk nad prostym bdiffem może nie uzasadniać dodatkowej złożoności, która mogłaby się złamać na wolności). Jako kolejny przykład możesz użyć plików diff do skryptów.
Jednak większość systemów łatających na wolności podąża najprostszą drogą: po prostu pakuje zmienione pliki - nie próbuje jedynie pakować zmian w tych plikach (prawdopodobnie z dobrego powodu większość zawartości gry jest już skompresowana i tworzy łatki przeciwko wysokim entropia lub skompresowane dane w ogóle nie będą działać ).
źródło
Kod wykonywalny gry nie zawsze znajduje się tylko w pliku wykonywalnym, często jest podzielony na kilka bibliotek dynamicznych (na przykład gry, silników graficznych i dźwiękowych), rzeczywisty plik wykonywalny i być może wiele skryptów do różnych celów.
Łatka może naprawiać problemy w dowolnej z tych części bez uzasadnienia zmiany we wszystkich z nich.
Inne podejście niż zastąpienie wszystkich zmienionych plików może być po prostu zrobić binarne diff na nich, a tylko packackge rzeczywiste różnice mają być rozdzielone.
(To oczywiście działa tylko na pliki, które możesz zagwarantować, że nie zostaną zmienione przez użytkownika).
źródło
Zwykle używają zewnętrznego systemu różnic binarnych do dystrybucji poprawek do danych gry. Pliki wykonywalne są zwykle wystarczająco małe, aby można je było całkowicie trywialnie dystrybuować.
Większość współczesnych gier ma setki megabajtów danych gry (głównie tekstury, modele, dane poziomów itp.). Wymagają one łatania dość często. O ile mi wiadomo, wydawcy zwykle mają standardowy, zastrzeżony sposób na zrobienie tego.
Nie trzeba dodawać, że istnieją przykłady typu open source. Niektóre dystrybucje Linuksa (Fedora?) Używają binarnych różnic w swoich łatkach. Możesz je zbadać i przeczytać ich kod źródłowy lub dokumentację.
źródło
Nowoczesne
diff
algorytmy mogą efektywnie znajdować sekwencje bajtów wspólne dla dwóch plików binarnych. Nic dziwnego, jeśli się nad tym zastanowić. Kompresja plików polega również na znalezieniu identycznych sekwencji bajtów.Gdy masz już listę identycznych sekwencji bajtów, wystarczy wysłać stare i nowe przesunięcia, długość i oczywiście wszystko, co jest zupełnie nowe. Po stronie odbiorczej jest to zatem prosty montaż. Skopiuj bity, które musisz zachować ze starego pliku, wypełnij nowe bity.
Tworzenie łatki staje się jeszcze łatwiejsze, jeśli twój linker może wypluć plik MAP, który zawiera listę przesunięć każdej funkcji w pliku.
źródło