Crash Bandicoot – Khi 2 MB RAM không thể ngăn được các kỹ sư Naughty Dog

Ngày nay, một chiếc điện thoại có thể có 8 GB, 12 GB, thậm chí 16 GB RAM. Một game hiện đại chiếm hàng chục GB cũng chẳng còn khiến chúng ta ngạc nhiên.

Nhưng năm 1996, Naughty Dog phải tạo ra Crash Bandicoot trên chiếc PlayStation đầu tiên với:

Trong khi đó, Naughty Dog lại muốn tạo ra một game 3D có môi trường dày đặc, nhân vật nhiều animation và những màn chơi lớn hơn rất nhiều lượng RAM mà PlayStation có thể chứa.

Giải pháp của họ không phải là làm game nhỏ đi.

Họ tìm cách đánh lừa giới hạn của phần cứng.


Bài toán: Level lớn hơn cả RAM

Một level của Crash có thể lớn hơn nhiều vùng RAM thực tế dành cho game.

Nếu cách làm thông thường là:

CD-ROM
   |
   v
Load toàn bộ level
   |
   v
RAM

thì Crash đơn giản là không thể chạy.

Naughty Dog cần một cách khác:

Không cần đưa toàn bộ thế giới vào RAM. Chỉ cần đưa phần thế giới mà người chơi sắp nhìn thấy vào RAM.

Ý tưởng nghe rất quen thuộc ngày nay.

Nhưng đây là năm 1996.


Biến CD-ROM thành một dạng "bộ nhớ mở rộng"

Andy Gavin, đồng sáng lập Naughty Dog và là người viết phần lớn công nghệ nền tảng của Crash, xây dựng một hệ thống quản lý dữ liệu khá giống bộ nhớ ảo (virtual memory).

Dữ liệu của level được chia thành những page khoảng 64 KB.

Có thể hình dung:

CD-ROM

[64K][64K][64K][64K][64K][64K][64K][64K]
              |         |
              +----+----+
                   |
                   v
                Streaming
                   |
                   v

RAM

[Crash][Geometry][Texture][Animation][Code]

Khi Crash di chuyển về phía trước, engine xác định những dữ liệu nào sắp cần và đọc chúng từ CD vào RAM.

Những dữ liệu phía sau không còn cần thiết có thể bị loại bỏ để lấy chỗ cho dữ liệu mới.

Về bản chất:

Thế giới rất lớn

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

             [ RAM ]

                 ---> Crash di chuyển

RAM chỉ trở thành một cửa sổ trượt trên toàn bộ level.

Đây chính là tư tưởng mà sau này trở thành chuyện bình thường trong các game thế giới mở: asset streaming.


Nhưng CD-ROM chậm khủng khiếp

Có một vấn đề.

Ổ CD của PlayStation chỉ đọc khoảng vài trăm KB mỗi giây và đặc biệt chậm khi phải seek liên tục giữa những vùng dữ liệu nằm xa nhau trên đĩa.

Nếu Crash chạy tới khu vực mới mà dữ liệu chưa đọc xong:

Crash chạy tới
      |
      v
[????????????]
      ^
      |
CD vẫn đang seek...

game sẽ khựng hoặc không có dữ liệu để render.

Naughty Dog vì vậy không chỉ quan tâm dữ liệu nào nằm trên CD.

Họ còn quan tâm:

Dữ liệu đó nằm ở đâu về mặt vật lý trên chiếc CD.

Những dữ liệu có khả năng được sử dụng liên tiếp được bố trí sao cho đầu đọc CD không phải di chuyển quá xa.

Nói cách khác, việc tối ưu Crash không dừng ở code.

Nó đi xuống tận:

Gameplay
   ↓
Engine
   ↓
Memory manager
   ↓
File layout
   ↓
Vị trí vật lý của dữ liệu trên CD

Camera cố định thực ra là một vũ khí kỹ thuật

Nếu từng chơi Crash, chúng ta sẽ thấy một đặc điểm rất rõ:

Người chơi không được tự do xoay camera.

Camera thường chạy theo một tuyến đường được Naughty Dog xác định trước.

Thoạt nhìn đây chỉ là lựa chọn gameplay.

Nhưng về mặt kỹ thuật, nó đem lại một lợi thế khổng lồ:

Nếu biết camera đang ở đâu và nhìn về hướng nào, engine có thể biết trước những thứ nào có khả năng xuất hiện trên màn hình.

Ví dụ:

Camera ---> Crash

               ███████████
               █ Vách đá █
               ███████████

                   |
                   |
                   v

        Hàng loạt geometry phía sau
        không thể nhìn thấy

Nếu người chơi không thể quay camera nhìn xuyên qua vách đá thì những thứ phía sau nó không cần xuất hiện trong RAM hoặc không cần render tại thời điểm đó.

Đây là lúc level design và engineering bắt đầu hòa vào nhau.


Cây, vách đá và góc cua không chỉ để trang trí

Nhìn lại các level Crash đời đầu, chúng ta thường thấy:

Đường hẹp
   ↓
Cây / đá
   ↓
Góc cua
   ↓
Đường hầm
   ↓
Khu vực mới
   ↓
Góc cua

Những thứ này không chỉ tồn tại vì đẹp.

Chúng còn giúp Naughty Dog kiểm soát lượng geometry mà camera có thể nhìn thấy tại cùng một thời điểm.

Một vách đá có thể che toàn bộ khu vực phía sau.

Một góc cua có thể khiến khu vực trước đó biến khỏi tầm nhìn.

Một đường hầm có thể tạo ra điểm chuyển tiếp lý tưởng để engine thay dữ liệu trong RAM.

Thay vì cố render cả thế giới:

████████████████████████████████████
████████████████████████████████████
████████████████████████████████████

PlayStation thực tế chỉ cần xử lý:

           [ phần camera nhìn thấy ]
                    ████
                    ████

Đây là một ví dụ rất đẹp về việc:

Giới hạn kỹ thuật trở thành một phần của thiết kế game.


Tính trước những gì camera có thể nhìn thấy

Naughty Dog còn đưa một phần công việc ra khỏi PlayStation hoàn toàn.

Các workstation Silicon Graphics mạnh hơn rất nhiều được sử dụng trong quá trình phát triển để phân tích level.

Hệ thống có thể tính trước:

Một số quá trình tính toán level có thể mất nhiều giờ.

Nhưng điều đó không quan trọng.

Máy của Naughty Dog có thể mất hàng giờ để tính trước.

Đổi lại, chiếc PlayStation của người chơi không phải làm công việc đó khi đang chạy game.

Có thể hình dung đây là:

Workstation mạnh
      |
      | tính toán nhiều giờ
      v
Precomputed Data
      |
      v
CD-ROM
      |
      v
PlayStation yếu
      |
      v
Chỉ đọc kết quả đã tính sẵn

Một nguyên tắc tối ưu rất mạnh:

Nếu một phép tính không cần thực hiện trong thời gian thực, đừng bắt phần cứng yếu thực hiện nó trong thời gian thực.


Crash cũng phải được "ép" lại

Môi trường chưa phải vấn đề duy nhất.

Crash là một nhân vật có lượng animation và biểu cảm rất lớn so với tiêu chuẩn game 3D thời đó.

Nếu lưu animation theo cách đơn giản, lượng dữ liệu sẽ quá lớn.

Naughty Dog vì vậy phát triển những cách nén animation rất mạnh.

Thay vì dành cùng một lượng dữ liệu cho mọi vertex, engine có thể xem phạm vi chuyển động thực tế của từng thành phần rồi chỉ dành số bit cần thiết để biểu diễn nó.

Ví dụ đơn giản:

Vertex A chỉ di chuyển trong phạm vi rất nhỏ
→ không cần nhiều bit

Vertex B di chuyển rất xa
→ cần nhiều bit hơn

Thay vì:

Mọi vertex = cùng một lượng dữ liệu

họ hướng tới:

Vertex nhỏ  = ít bit
Vertex lớn  = nhiều bit

Khi hàng nghìn vertex và hàng loạt animation được xử lý như vậy, lượng bộ nhớ tiết kiệm được trở nên rất đáng kể.

Đó là một trong những lý do Crash có animation và biểu cảm nổi bật so với nhiều nhân vật 3D cùng thời.


Tất cả các thủ thuật thực ra là một hệ thống

Điều đáng nể nhất ở Crash Bandicoot không phải một kỹ thuật riêng biệt.

Đó là cách tất cả chúng kết nối với nhau:

Camera được kiểm soát
        ↓
Biết trước camera có thể nhìn thấy gì
        ↓
Tính visibility trước
        ↓
Level design che những khu vực không cần thiết
        ↓
Biết asset nào sắp cần
        ↓
Chia dữ liệu thành page nhỏ
        ↓
Sắp xếp dữ liệu hợp lý trên CD
        ↓
Streaming vào RAM đúng lúc
        ↓
Loại dữ liệu cũ khỏi RAM
        ↓
Tiếp tục chạy

Nếu nhìn theo cách này, Naughty Dog gần như đã biến:

2 MB RAM

thành một cửa sổ nhìn vào một không gian dữ liệu lớn hơn rất nhiều.


Và tất cả công sức đó đã được đền đáp

Crash Bandicoot ra mắt năm 1996 và trở thành một thành công thương mại lớn.

Game đầu tiên bán được hàng triệu bản trên toàn thế giới và trở thành một trong những trò chơi tiêu biểu của PlayStation đời đầu.

Crash nhanh chóng trở thành mascot không chính thức của PlayStation, đủ nổi tiếng để Sony từng sử dụng nhân vật này trong những chiến dịch quảng cáo trực tiếp khiêu khích Nintendo và Mario.

Thành công tiếp tục với:

Quan trọng hơn, Crash đã đưa Naughty Dog từ một studio tương đối nhỏ trở thành một trong những nhà phát triển đáng chú ý nhất của ngành game.

Sony sau đó mua lại Naughty Dog vào năm 2001.

Rồi từ studio từng tìm mọi cách nhét Crash vào 2 MB RAM ấy xuất hiện:

Crash Bandicoot
       ↓
Jak and Daxter
       ↓
Uncharted
       ↓
The Last of Us

Người chơi không cần biết bất kỳ điều gì trong số này

Có lẽ đây mới là phần thú vị nhất của câu chuyện.

Một đứa trẻ chơi Crash năm 1996 không biết:

Nó chỉ nhìn màn hình và nghĩ:

"Game này đẹp thật."

Đó có lẽ cũng là dấu hiệu của engineering tốt.

Những hệ thống cực kỳ phức tạp nằm phía dưới, nhưng người sử dụng cuối cùng hoàn toàn không cần biết chúng tồn tại.


Khi giới hạn tạo ra kỹ thuật xuất sắc

Ngày nay, nếu thiếu RAM, một giải pháp đơn giản có thể là tăng cấu hình tối thiểu từ 8 GB lên 16 GB.

Naughty Dog năm 1996 không có lựa chọn đó.

PlayStation có 2 MB RAM.

Mọi khách hàng đều có đúng 2 MB.

Không thể yêu cầu người chơi nâng cấp.

Không thể mua thêm RAM.

Không thể thay CPU.

Không thể thay ổ CD.

Vì vậy câu hỏi không còn là:

"Làm sao có thêm tài nguyên?"

mà trở thành:

"Làm sao thực hiện được điều tưởng như không thể với lượng tài nguyên đang có?"

Và câu trả lời của Naughty Dog là kết hợp:

thuật toán + quản lý bộ nhớ + streaming + thiết kế level + camera + preprocessing + nén dữ liệu + hiểu biết rất sâu về phần cứng.

Crash Bandicoot vì thế không chỉ là câu chuyện về một con cáo túi chạy đập thùng.

Nó còn là một ví dụ kinh điển của ngành phần mềm:

Khi không thể giải quyết vấn đề bằng cách ném thêm phần cứng vào nó, người ta buộc phải giải quyết bằng engineering.

Và trong trường hợp của Crash Bandicoot, công sức ấy đã được đền đáp bằng hàng triệu bản game được bán ra, một thương hiệu tồn tại hàng chục năm và nền móng cho một Naughty Dog sau này trở thành một trong những studio nổi tiếng nhất thế giới.

Tags:
#coding #legend-story #hardware #game