Làm thế nào để các bản vá trong trò chơi hoạt động?


37

Các trò chơi trên Console và PC đôi khi có các bản vá để sửa lỗi mà các nhà phát triển đã bỏ lỡ / không có thời gian để sửa.

Câu hỏi của tôi là làm thế nào để làm việc này?

Đôi khi các tệp vá có kích thước vài megabyte. Tôi không hiểu làm thế nào một tập tin nhỏ có thể thay đổi chương trình tuân thủ.


Bạn muốn thay đổi một trò chơi đã biên dịch bằng cách sử dụng một bản vá nhỏ?
sói

Không, tôi chỉ quan tâm đến lý thuyết đằng sau nó. Các trò chơi của tôi đủ nhỏ để chỉ biên dịch lại và phân phối lại toàn bộ trò chơi :)
MONSDevil

4
Đây là một câu hỏi thú vị. Nó không dựa trên một vấn đề bạn đang gặp phải với thiết kế trò chơi. Cũng có nhiều cách để xử lý bản vá từ cách ngây thơ nhất, thay thế tất cả các tệp đã được sửa đổi thành phức tạp nhất, nhận hướng dẫn để thay đổi những thứ cụ thể trong các tệp hiện có. Tôi không chắc câu hỏi này phù hợp với trang web này.
sói

3
Một vài megabyte không "nhỏ". Giả sử chúng ta có một tệp ba megabyte là sáu megabyte mã thực thi, được nén. Giả sử rằng các hướng dẫn trung bình dài sáu byte, vì vậy đó là khoảng một triệu hướng dẫn. (Chúng ta hãy bỏ qua dữ liệu tĩnh như chuỗi ký tự và không có gì.) Nếu một dòng C tương ứng với khoảng mười lệnh máy, đó là 100.000 dòng mã. Điều đó dường như đủ cho động cơ cốt lõi của một trò chơi. Hầu hết kích thước cài đặt sẽ là những thứ như bản đồ kết cấu, màn hình, chuỗi video.

2
một vài megabyte có thể nhỏ, tất cả phụ thuộc vào những gì trong đó và bao nhiêu phần trăm của tổng số cơ sở mã. Nếu nói toàn bộ bản đồ cấp 3D cần phải được thay thế do các định dạng tệp đã chọn, v.v., bao gồm tất cả các kết cấu và những gì không, một vài megabyte thực sự có thể rất nhỏ.
jwenting

Câu trả lời:


30

Có nhiều cách để làm điều này, cách đơn giản nhất là XOR hai tệp và nén chúng (GZIP hoặc hơn thế nữa). Lý thuyết đằng sau điều này là hy vọng bạn có thể nhận được một chuỗi số 0 lớn (chuỗi dài có cùng giá trị nén tốt).

Bạn có thể đưa khái niệm đó đi xa hơn và thử và tìm các khu vực của hai tệp có dữ liệu giống hệt nhau và bỏ qua nó hoàn toàn.

Cuối cùng, bạn có thể sử dụng cấu trúc của từng loại tệp để lợi thế của bạn. Ví dụ: trong EXE, bạn có thể đóng gói từng phương thức riêng lẻ (chỉ những phương thức đã thay đổi) và tự phục hồi EXE trong ứng dụng vá; tuy nhiên, hãy nhớ rằng điều này rất có khả năng trong lĩnh vực quá mức cần thiết và có thể không đáng để nỗ lực (việc đạt được một bdiff đơn giản có thể không biện minh cho sự phức tạp thêm có thể phá vỡ trong tự nhiên). Như một ví dụ khác, bạn có thể sử dụng các tệp diff cho các tập lệnh.

Tuy nhiên, hầu hết các hệ thống vá lỗi đều có cách đơn giản nhất: chúng chỉ gói các tệp đã thay đổi - chúng không cố gắng chỉ thay đổi gói trong các tệp đó (có thể vì lý do chính đáng, hầu hết nội dung trò chơi đã được nén và tạo các bản vá chống lại cao entropy hoặc dữ liệu nén hoàn toàn không hoạt động ).


Bạn có ý nghĩa gì khi gói từng phương thức trong một exe riêng lẻ. Điều đó có thực tế không?
sói

@ArthurWulfWite có. Đối với một ngôi nhà độc lập có lẽ không đáng thời gian vì nó sẽ tốn rất nhiều thời gian và công sức (về cơ bản bạn cần phải viết trình liên kết của riêng bạn) - vì một công ty xử lý 'công nghệ vá' độc quyền, nó sẽ rất đáng nỗ lực. Tất cả phụ thuộc vào mức độ mã thực thi lớn như thế nào - Tôi đã xem nhanh về Holy 2 và nó là 26mb (8mb cho EXE chính). Một khác biệt nhị phân có thể có thể đến gần nó mặc dù - đó vẫn là một ý tưởng đáng để đưa ra ngoài đó (tôi biết rằng CAB có khả năng nén tốt trên EXE vì chúng tận dụng cấu trúc).
Jonathan Dickinson

Điều đó rất thú vị. Tôi cho rằng với băng thông là như ngày nay, giảm thiểu kích thước bản vá trò chơi không phải là vấn đề chính. +1 một câu trả lời thú vị cũng nghĩ ra.
sói

Nó không phải là khả thi để vá trong các phương pháp riêng lẻ trong hầu hết các trò chơi. Trình biên dịch có thể có đầu ra khá khác nhau với những thay đổi mã đơn giản. Các quyết định nội tuyến tự động có thể thay đổi, bố cục bảng biểu tượng có thể thay đổi, v.v. Thay đổi mã cũng thường thay đổi cấu trúc API nội bộ. Tối ưu hóa đã làm mờ ranh giới giữa các ranh giới chức năng so với những gì bạn thấy trong trình chỉnh sửa mã của mình. Hệ thống DRM cũng làm vẩn đục nước. Hệ thống vá sử dụng thay thế bán buôn hoặc khác biệt nhị phân, và nén chúng. Bất cứ điều gì như bạn đề nghị chỉ đơn giản là quá mong manh để vận chuyển trong thế giới thực, imo.
Sean Middleditch

2
@SeanMiddleditch Tôi sẽ làm điều đó chỉ để chứng minh điều đó là có thể :).
Jonathan Dickinson

15

Mã thực thi của trò chơi không phải lúc nào cũng nằm trong tệp thực thi, thường nó được chia thành nhiều thư viện động (ví dụ: trò chơi, đồ họa và công cụ âm thanh), thực thi thực tế và có thể có nhiều tập lệnh cho nhiều mục đích khác nhau.

Một bản vá có thể khắc phục các sự cố trong bất kỳ một trong những phần này mà không đảm bảo thay đổi trong tất cả các phần.

Một cách tiếp cận khác với việc thay thế tất cả các tệp đã thay đổi có thể chỉ đơn giản là thực hiện một khác biệt nhị phân trên chúng và chỉ đóng gói các khác biệt thực tế sẽ được phân phối lại.

(Tất nhiên điều đó sẽ chỉ hoạt động trên các tệp mà bạn có thể đảm bảo sẽ không bị người dùng thay đổi.)


2
Bạn có thể đề cập đến điều này như một ví dụ: daemonology.net/bsdiff
wolfdawn

2
Câu trả lời thực tế tốt. +1
sói

2

Thông thường họ sử dụng hệ thống khác biệt nhị phân của bên thứ ba để phân phối các bản vá cho dữ liệu trò chơi. Các tập tin thực thi thường đủ nhỏ để được phân phối hoàn toàn tầm thường.

Hầu hết các trò chơi hiện đại có hàng trăm megs dữ liệu trò chơi (chủ yếu là kết cấu, mô hình, dữ liệu cấp độ, v.v.). Những yêu cầu vá khá thường xuyên. Theo tôi biết, các nhà xuất bản thường có một cách độc quyền tiêu chuẩn để làm điều này.

Không cần phải nói, có các ví dụ nguồn mở. Một số bản phân phối Linux (Fedora?) Sử dụng các khác biệt nhị phân cho các bản vá của chúng. Bạn có thể điều tra chúng và đọc mã nguồn hoặc tài liệu của chúng.


-1

Các diffthuật toán hiện đại có hiệu quả có thể tìm thấy các chuỗi byte phổ biến giữa hai nhị phân. Không ngạc nhiên, nếu bạn nghĩ về nó. Nén tệp cũng dựa vào việc tìm các chuỗi byte giống hệt nhau.

Khi bạn có danh sách các chuỗi byte giống hệt nhau, bạn chỉ cần gửi các độ lệch cũ và mới, độ dài và tất nhiên mọi thứ hoàn toàn mới. Về phía tiếp nhận, đó là một hội đồng đơn giản. Sao chép các bit bạn cần giữ từ tệp cũ, điền vào các bit mới.

Việc tạo bản vá trở nên dễ dàng hơn nữa nếu trình liên kết của bạn có thể tạo ra một tệp MAP liệt kê các phần bù của mọi chức năng trong tệp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.