Oyunlardaki yamalar nasıl çalışır?


37

Konsol ve PC oyunlarında bazen geliştiricilerin kaçırdığı / düzeltmek için zamanı olmayan hataları düzeltmek için yamaları vardır.

Benim sorum bu nasıl çalışır?

Bazen yama dosyalarının boyutu birkaç megabayttır. Küçük bir dosyanın zorunlu bir programı nasıl değiştirebileceğini anlamıyorum.


Küçük bir yama kullanarak yaptığınız bir derlenmiş oyunları değiştirmek ister misiniz?
wolfdawn

Hayır, sadece arkasındaki teoriyle ilgileniyorum. Oyunlarım onları yeniden
derleyip

4
Bu ilginç bir soru. Oyun tasarımıyla karşılaştığınız bir soruna dayanmaz. Yamayı en saf yoldan ele almanın, en karmaşık şekilde değiştirilmiş olan tüm dosyaları değiştirerek, varolan dosyalardaki belirli şeyleri değiştirmek için yönergeler almanın birçok yolu vardır. Bu sorunun bu siteye uygun olduğundan emin değilim.
wolfdawn

3
Birkaç megabayt "küçük" değil. Sıkıştırılmış altı megabayt çalıştırılabilir kod olan üç megabaytlık bir dosyamız olduğunu varsayalım. Talimatların ortalama altı bayt olduğunu varsayalım, bu yüzden yaklaşık bir milyon talimat. (Dize değişmezleri ve ne olursa olsun gibi statik verileri görmezden gelelim.) Eğer bir C satırı yaklaşık on makine komutuna karşılık gelirse, bu 100.000 satırlık koddur. Bir oyunun ana motoru için bu yeterli gibi görünüyor. Kurulum boyutunun çoğu doku haritaları, ekranlar, video dizileri gibi şeyler olacaktır.

2
birkaç megabayt küçük olabilir, hepsi içinde ne olduğuna ve toplam kod tabanının yüzde kaçına bağlıdır. Tüm dokular da dahil olmak üzere seçilen dosya formatları vs. nedeniyle bütün bir 3B seviye haritasının değiştirilmesi gerekiyorsa, birkaç megabayt gerçekten çok küçük olabilir.
12'de

Yanıtlar:


30

Bunu yapmanın birçok yolu vardır, en basit olanı iki dosyayı XOR'a koymak ve bunları sıkıştırmaktır (GZIP ya da benzeri). Bunun arkasındaki teori, umarım büyük bir sıfır dizisi elde edersiniz (aynı değerlerin uzun dizileri iyi sıkıştırılır).

Bu kavramı daha ileriye götürebilir ve verilerin aynı olduğu iki dosyanın alanlarını bulabilir ve tamamen çıkarabilirsiniz.

Son olarak, her bir dosya türünün yapısını kendi yararınıza kullanabilirsiniz. Örneğin, bir EXE'de her yöntemi ayrı ayrı paketleyebilir (yalnızca değişenleri) ve düzeltme eki uygulaması sırasında EXE'yi yeniden oluşturabilirsiniz; Bununla birlikte, bunun, aşırı öldürme aleminde çok muhtemel olduğunu ve çabaya değmeyebileceğini unutmayın (basit bir bdiff'in kazancı, vahşi doğada kırılabilecek ekstra karmaşıklığı haklı çıkarmayabilir). Başka bir örnek olarak, komut dosyaları için diff dosyalarını kullanabilirsiniz.

Bununla birlikte, vahşi ortamdaki çoğu yama sistemi en basit rotayı izler: sadece değişen dosyaları paketler - yalnızca bu dosyalar içindeki değişiklikleri paketlemeye çalışmazlar (muhtemelen iyi bir nedenle, çoğu oyun içeriği zaten sıkıştırılmış ve yüksek oranda yamalar oluşturuyor) entropi veya sıkıştırılmış veri hiç çalışmaz ).


Bir exe içindeki her bir yöntemi ayrı ayrı paketlemekle neyi kastediyorsunuz? Bu pratik mi?
wolfdawn

@ArthurWulfWhite evet. Bir bağımsız ev için muhtemelen çok fazla zaman ve emek harcayacağınız zamana değmeyeceksiniz (aslında kendi bağlantınızı yazmanız gerekir) - 'yama teknolojisiyle' uğraşan bir şirket olarak, sadece bu çabaya değecektir. Her şey yürütülebilir kodun büyüklüğüne bağlıdır - Sacred 2'ye hızlıca baktım ve 26mb'dı (ana EXE için 8 mb). İkili bir fark buna rağmen yaklaşabilir - yine de ortaya koymaya değer bir fikir (CAB'lerin EXE üzerinde iyi bir sıkıştırma elde ettiklerini biliyorum çünkü yapıdan faydalanıyorlar).
Jonathan Dickinson,

Bu çok ilginç. Sanırım bugünkü bant genişliği ile oyunun yama boyutunu küçültmek önemli bir sorun değil. +1 ilginç ve iyi düşünülmüş bir cevap.
wolfdawn

Çoğu oyunda bireysel yöntemlere yama yapmak mümkün değildir. Derleyici, basit kod değişiklikleriyle bile oldukça farklı çıktılara sahip olabilir. Otomatik satır içi kararlar değişebilir, sembol tablo düzeni değişebilir, vb. Kod değişiklikleri de sıklıkla dahili API yapısını değiştirir. Optimizasyonlar, kod editörünüzde gördüklerinize kıyasla fonksiyon sınırları arasındaki çizgiyi zaten bulanıklaştırıyor. DRM sistemleri aynı zamanda suyu çok çamurluyor. Yama sistemleri toptan değiştirme veya ikili farkları kullanır ve bunları sıkıştırır. Önerdiğin herhangi bir şey gerçek dünyada gemi için çok kırılgandır, imo.
Sean Middleditch

2
@SeanMiddleditch Bunu mümkün olduğunu kanıtlamak için yapacağım :).
Jonathan Dickinson

15

Bir oyunun çalıştırılabilir kodu her zaman sadece çalıştırılabilir kodda bulunmaz, genellikle birçok dinamik kütüphaneye (örneğin oyun, grafik ve ses motorları), gerçek çalıştırılabilir ve çeşitli amaçlar için birçok komut dosyasına bölünür.

Bir yama, bu parçaların herhangi birindeki sorunları, hepsinde değişiklik yapılmasını garanti etmeden düzeltmek olabilir.

Değiştirilen tüm dosyaları değiştirmekten farklı bir yaklaşım, sadece üzerlerinde ikili bir fark yaratmak ve sadece yeniden dağıtılacak gerçek farkları paketlemek olabilir.

(Tabii ki sadece garanti edebileceğiniz dosyalar üzerinde çalışacak kullanıcı tarafından değiştirilmeyecektir.)


2
Bunu örnek olarak söyleyebilirsiniz
wolfdawn 14:12

2
İyi pratik cevap. +1
wolfdawn

2

Normalde yamaları oyun verilerine dağıtmak için üçüncü taraf bir ikili fark sistemi kullanırlar. Yürütülebilirler tipik olarak önemsiz bir şekilde tamamen dağıtılacak kadar küçüktür.

Modern oyunların çoğunda yüzlerce oyun verisi vardır (çoğunlukla dokular, modeller, seviye verileri vb.). Bunlar oldukça sık yamalama gerektirir. Bildiğim kadarıyla, yayıncıların normalde bunu yapmanın standart tescilli bir yolu vardır.

Söylemeye gerek yok, açık kaynaklı örnekler var. Bazı Linux dağıtımları (Fedora?) Yamaları için ikili farklar kullanır. Bunları araştırabilir ve kaynak kodlarını veya belgelerini okuyabilirsiniz.


-1

Modern diffalgoritmalar iki ikili arasında ortak olan bayt dizilerini etkili bir şekilde bulabilir. Şaşırtıcı değil, eğer düşünüyorsanız. Dosya sıkıştırma da aynı bayt dizileri bulmaya dayanır.

Aynı bayt dizileri listesine sahip olduğunuzda, eski ve yeni ofsetleri, uzunluğu ve elbette tamamen yeni olan her şeyi göndermeniz yeterlidir. Alıcı tarafta, daha sonra basit bir montaj. Eski dosyadan saklamanız gereken bitleri kopyalayın, yeni bitleri doldurun.

Bağlayıcınız dosyadaki her bir işlevin ofsetlerini listeleyen bir MAP dosyasını dağıtabilirse, eklemeyi oluşturmak daha da kolaylaşıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.