Bagaimana cara tambalan dalam gim bekerja?

37

Game konsol dan PC terkadang memiliki tambalan untuk memperbaiki bug yang tidak sempat / tidak sempat diperbaiki oleh pengembang.

Pertanyaan saya adalah bagaimana cara kerjanya?

Terkadang file tambalan berukuran beberapa megabyte. Saya tidak mengerti bagaimana file kecil dapat mengubah program yang dipatuhi.

MulletDevil
sumber
Anda ingin mengubah gim yang dikompilasi yang Anda buat menggunakan tambalan kecil?
wolfdawn
Tidak, saya hanya tertarik pada teori di baliknya. Game saya cukup kecil untuk hanya mengkompilasi ulang dan mendistribusikan seluruh game lagi :)
MulletDevil
4
Ini pertanyaan yang menarik. Itu bukan berdasarkan masalah yang Anda hadapi dengan desain game. Ada juga banyak cara untuk menangani tambalan dari cara yang paling naif, mengganti semua file yang dimodifikasi menjadi yang paling rumit, mendapatkan instruksi untuk mengubah hal-hal tertentu pada file yang ada. Saya tidak yakin pertanyaan ini cocok untuk situs ini.
wolfdawn
3
Beberapa megabyte tidak "kecil". Misalkan kita memiliki file tiga megabyte yang merupakan enam megabyte dari kode yang dapat dieksekusi, dikompresi. Misalkan instruksi rata-rata panjangnya enam byte, jadi sekitar sejuta instruksi. (Mari kita abaikan data statis seperti string literal dan yang lainnya.) Jika satu baris C sesuai dengan sekitar sepuluh instruksi mesin, itu 100.000 baris kode. Itu sepertinya cukup untuk mesin inti permainan. Sebagian besar ukuran instalasi akan berupa hal-hal seperti peta tekstur, layar, urutan video.
2
beberapa megabyte mungkin kecil, semua tergantung pada apa yang ada di dalamnya dan berapa persen dari total basis kode. Jika mengatakan seluruh peta level 3D perlu diganti karena format file yang dipilih dll., Termasuk semua tekstur dan yang tidak, beberapa megabyte memang bisa sangat kecil.
jwenting

Jawaban:

30

Ada beberapa cara untuk melakukan ini, yang paling sederhana adalah dengan XOR dua file dan kompres mereka (GZIP atau sebagainya). Teori di balik ini adalah semoga Anda bisa mendapatkan urutan besar nol (urutan panjang dengan nilai yang sama kompres dengan baik).

Anda dapat mengambil konsep itu lebih jauh dan mencoba dan menemukan area dari dua file yang datanya identik dan menghilangkannya sama sekali.

Akhirnya, Anda bisa menggunakan struktur masing-masing jenis file untuk keuntungan Anda. Misalnya, dalam EXE Anda dapat mengemas setiap metode secara individual (hanya yang telah berubah) dan menyusun kembali EXE sendiri selama aplikasi patch; perlu diingat, bahwa hal ini sangat mungkin terjadi di ranah kerja keras yang berlebihan dan mungkin tidak sepadan dengan usaha tersebut (keuntungan dari seorang bdiff sederhana mungkin tidak membenarkan kerumitan ekstra yang bisa pecah di alam liar). Sebagai contoh lain Anda bisa menggunakan file diff untuk skrip.

Namun, sebagian besar sistem penambalan di alam liar mengambil rute paling sederhana: mereka hanya mengemas file yang telah berubah - mereka tidak mencoba untuk hanya mengemas perubahan dalam file-file itu (mungkin karena alasan yang baik, sebagian besar konten game sudah dikompres dan membuat tambalan terhadap tinggi entropi atau data terkompresi tidak akan berfungsi sama sekali ).

Jonathan Dickinson
sumber
Apa yang Anda maksud dengan paket setiap metode dalam exe secara individual. Apakah itu praktis?
wolfdawn
@ArthurWulfWhite ya. Untuk rumah indie mungkin tidak sepadan dengan waktu karena akan membutuhkan waktu dan usaha yang ekstrem (Anda pada dasarnya perlu menulis linker Anda sendiri) - sebagai perusahaan yang berurusan dengan 'teknologi patching' secara eksklusif itu akan sepadan dengan usaha. Itu semua tergantung pada seberapa besar kode yang dapat dieksekusi - saya melihat cepat pada Sacred 2 dan itu 26mb (8mb untuk EXE utama). Sebuah biner diff mungkin bisa mendekati itu - masih merupakan ide yang layak diletakkan di sana (saya tahu bahwa CAB mendapatkan kompresi yang baik pada EXEs karena mereka mengambil keuntungan dari struktur).
Jonathan Dickinson
Ini sangat menarik. Saya kira dengan bandwidth menjadi seperti sekarang ini, meminimalkan ukuran tambalan bukan masalah utama. 1 jawaban menarik dipikirkan dengan baik.
wolfdawn
Tidak mungkin untuk menambal dalam metode individual di sebagian besar game. Kompiler dapat memiliki keluaran yang agak berbeda secara drastis dengan perubahan kode yang sederhana. Keputusan inlining otomatis dapat berubah, tata letak tabel simbol dapat berubah, dll. Perubahan kode juga sering mengubah struktur API internal. Optimalisasi telah mengaburkan batas antara batas fungsi dibandingkan dengan apa yang Anda lihat di editor kode Anda. Sistem DRM juga membuat air sangat keruh. Sistem patch menggunakan pengganti grosir atau biner, dan kompreslah. Apa pun yang Anda sarankan terlalu rapuh untuk dikirim di dunia nyata, imo.
Sean Middleditch
2
@SeanMiddleditch Saya akan melakukannya hanya untuk membuktikan itu mungkin :).
Jonathan Dickinson
15

Kode yang dapat dieksekusi dari sebuah game tidak selalu berada hanya di dalam executable, seringkali itu dibagi menjadi beberapa perpustakaan dinamis (misalnya game, grafik dan mesin suara), executable yang sebenarnya, dan mungkin banyak skrip untuk berbagai keperluan.

Sebuah tambalan bisa memperbaiki masalah di salah satu bagian ini tanpa menjamin perubahan di semua bagian itu.

Pendekatan yang berbeda dari mengganti semua file yang diubah bisa dengan hanya melakukan diff biner pada mereka, dan hanya packackge perbedaan aktual yang akan didistribusikan.

(Tentu saja itu hanya akan berfungsi pada file yang Anda jamin tidak akan diubah oleh pengguna.)


sumber
2
Anda dapat menyebutkan ini sebagai contoh: daemonology.net/bsdiff
wolfdawn
2
Jawaban praktis yang bagus. +1
wolfdawn
2

Biasanya mereka menggunakan sistem biner pihak ketiga untuk mendistribusikan tambalan ke data game. Executable biasanya cukup kecil untuk dibagikan sepele sepenuhnya.

Sebagian besar game modern memiliki ratusan MB data game (kebanyakan tekstur, model, level data dll). Ini membutuhkan penambalan yang cukup sering. Sejauh yang saya tahu, penerbit biasanya memiliki cara standar kepemilikan untuk melakukan ini.

Tidak perlu dikatakan, ada contoh open-source. Beberapa distribusi Linux (Fedora?) Menggunakan perbedaan biner untuk tambalannya. Anda dapat menyelidikinya dan membaca kode sumber atau dokumentasinya.

MarkR
sumber
-1

Modern diffAlgoritma dapat secara efisien menemukan urutan byte yang umum di antara dua binari. Tidak mengherankan jika Anda memikirkannya. Kompresi file bergantung pada menemukan urutan byte yang identik juga.

Setelah Anda memiliki daftar urutan byte yang identik, Anda hanya perlu mengirim offset lama dan baru, panjangnya, dan tentu saja apa pun yang benar-benar baru. Di sisi penerima, itu kemudian perakitan langsung. Salin bit yang perlu Anda simpan dari file lama, isi bit baru.

Membuat tambalan menjadi lebih mudah jika tautan Anda dapat memuntahkan file MAP yang mencantumkan offset setiap fungsi dalam file.

MSalters
sumber