Doom Chạy Liên Tục 2,5 Năm Trước Khi Crash Do Lỗi Integer Overflow

Nhóm biên tập BigGo
Doom Chạy Liên Tục 2,5 Năm Trước Khi Crash Do Lỗi Integer Overflow

Một thí nghiệm thú vị đã tiết lộ game engine gốc của Doom năm 1993 thực sự mạnh mẽ đến mức nào. Sự tò mò của một developer về hệ thống phát lại demo của game đã dẫn đến một cuộc thử nghiệm phi thường kéo dài hai năm rưỡi, khám phá ra một hạn chế cơ bản mà nhiều game kinh điển đều có chung.

Thí Nghiệm Bắt Đầu Từ Đây

User minki từ Lenowo đã bắt đầu hành trình bất thường này sau khi khám phá cách engine của Doom xử lý các chuỗi demo. Mỗi lần demo của game chạy và reset, engine lưu trữ một biến mới trong một chuỗi ngày càng phát triển. Quá trình này tiếp tục vô thời hạn, về mặt lý thuyết dẫn đến tình trạng overflow khi dữ liệu vượt quá khả năng lưu trữ của biến được sử dụng để chứa nó.

Thay vì để lại điều này chỉ là lý thuyết, minki quyết định đưa nó vào thử nghiệm bằng một thiết bị PDA cũ. Việc lựa chọn phần cứng không phải ngẫu nhiên—khả năng huyền thoại của Doom có thể chạy trên hầu như bất kỳ thiết bị nào có màn hình đã làm cho điều này trở thành khả thi. PDA được cấp nguồn thông qua UPS kết nối với cổng USB của router, cung cấp nguồn 5V ổn định để đảm bảo hoạt động không bị gián đoạn.

Cuộc Chờ Đợi Dài và Kết Thúc Kịch Tính

Sau khi chạy liên tục trong đúng hai năm rưỡi, điều không thể tránh khỏi đã xảy ra. Chỉ vài giờ sau khi vượt qua cột mốc này, một popup Fatal Error xuất hiện trên màn hình, xác nhận rằng biến đã thực sự overflow và gây ra sự cố hệ thống như dự đoán. Khoảnh khắc này đã xác nhận nhiều năm tính toán lý thuyết về các hạn chế nội bộ của game.

Một Mô Hình Trong Các Tựa Game Kinh Điển

Hiện tượng này không chỉ riêng của Doom . Cộng đồng gaming đã ghi lại những đặc điểm tương tự trên nhiều tựa game kinh điển, tiết lộ một mối liên hệ chung trong cách các game cũ xử lý thời gian và theo dõi sự kiện. Crash Bandicoot 3 thể hiện hành vi đặc biệt kỳ lạ khi bộ đếm thời gian toàn cục của nó overflow sau khoảng 2,27 năm chơi liên tục. Khi điều này xảy ra, game đi vào trạng thái siêu thực nơi kẻ thù di chuyển ngược thời gian, các vật thể đóng băng tại chỗ, và toàn bộ các level bị phá vỡ hoàn toàn.

Final Fantasy IX trình bày một trường hợp hấp dẫn khác với thanh kiếm được khao khát thường yêu cầu đạt đến dungeon cuối cùng trong vòng 12 giờ chơi game. Tuy nhiên, những người chơi kiên nhẫn đã khám phá ra một con đường thay thế—để game chạy khoảng hai năm khiến bộ đếm đồng hồ nội bộ overflow và reset, làm cho vũ khí có thể truy cập một lần nữa. Khám phá này đã mang lại cho thanh kiếm danh hiệu thú vị là có thể bỏ lỡ trong phạm vi hợp lý trong các cộng đồng gaming.

Ví dụ về Integer Overflow trong các Game Kinh điển

Game Thời gian Overflow Hiệu ứng
Doom (1993) 2.5 năm Lỗi nghiêm trọng khiến game crash
Crash Bandicoot 3 ~2.27 năm Kẻ thù di chuyển ngược, các level bị hỏng
Final Fantasy IX ~2 năm Đồng hồ reset, kiếm hiếm trở nên có thể lấy được
Paper Mario 4.5 năm Bộ đếm thời gian nướng bánh reset về mức hoàn hảo
Ảnh chụp màn hình từ Crash Bandicoot 3 làm nổi bật một lỗi hài hước do tràn số bộ đếm thời gian sau thời gian chơi kéo dài
Ảnh chụp màn hình từ Crash Bandicoot 3 làm nổi bật một lỗi hài hước do tràn số bộ đếm thời gian sau thời gian chơi kéo dài

Thực Tế Kỹ Thuật Đằng Sau Phép Thuật

Những hành vi bất thường này xuất phát từ các hạn chế cơ bản của việc lưu trữ integer trong các hệ thống gaming cũ. Hầu hết các game retro dựa vào bộ đếm 16-bit hoặc 32-bit tăng dần với mỗi game tick vì lý do hiệu suất. Một integer có dấu 16-bit chỉ có thể lưu trữ giá trị lên đến 32,767, trong khi đối tác không dấu của nó tối đa là 65,535. Khi các game engine chạy ở 30 hoặc 35 tick mỗi giây cuối cùng vượt quá những giới hạn này, kết quả dao động từ những lỗi thú vị đến sự cố hệ thống hoàn toàn.

Tình trạng overflow xảy ra khi bộ đếm vượt quá giá trị tối đa của nó, hoặc quay trở lại giá trị tối thiểu hoặc kích hoạt lỗi tùy thuộc vào cách code được thiết kế để xử lý những tình huống như vậy. Các developer thời đó không bao giờ dự đoán người chơi sẽ để game chạy trong nhiều năm liền, làm cho những khám phá này vừa bất ngờ vừa sáng tỏ.

Giới hạn lưu trữ số nguyên

  • Số nguyên có dấu 16-bit: Giá trị tối đa 32,767
  • Số nguyên không dấu 16-bit: Giá trị tối đa 65,535
  • Số nguyên có dấu 32-bit: Giá trị tối đa 2,147,483,647
  • Tốc độ tick của game: Thường là 30-35 tick mỗi giây trong các game cổ điển

Minh Chứng Cho Thiết Kế Game Cổ Điển

Thay vì đại diện cho các thực hành lập trình kém, những vấn đề overflow này làm nổi bật các ràng buộc thực tế và triết lý thiết kế của việc phát triển game thời kỳ đầu. Các developer đã đưa ra những giả định hợp lý về các mô hình sử dụng và tối ưu hóa code của họ tương ứng. Thực tế là những game này có thể chạy liên tục trong nhiều năm trước khi gặp phải vấn đề thực sự chứng minh sự ổn định và hiệu quả đáng chú ý trong kiến trúc cơ bản của chúng.

Những thí nghiệm này phục vụ như những cái nhìn hấp dẫn vào nền tảng toán học của gaming kinh điển, tiết lộ cách các giới hạn của số học thay vì lỗi lập trình tạo ra những hành vi bất ngờ này. Đối với những người chơi tận tụy sẵn sàng chờ đợi nhiều năm cho các vật phẩm hiếm hoặc trải nghiệm độc đáo, những tình trạng overflow này cung cấp những con đường không thông thường nhưng hợp pháp đến các thành tựu gaming.