
Thời điểm này tròn 35 năm về trước, chiếc máy Nintendo Entertainment System của Nhật Bản lần đầu cập bến thị trường Mỹ. Gần 4 thập kỷ trôi qua, công nghệ đồ họa và phần cứng xử lý game cũng đã rất khác xưa. Dám đoán chắc rằng, những người kỹ sư tài năng sáng tạo ra chiếc máy điện tử 4 nút thời ấy không thể tưởng tượng được ngành game lại phát triển mạnh mẽ đến như thế này. Từ chơi game trực tuyến qua mạng internet, cho đến thực tế ảo, trải nghiệm game của con người thời nay đã rất khác xưa, khi phải ngồi dán mắt vào màn hình TV chơi Mario đi cứu công chúa.

Nhưng, nói theo kiểu ngôn tình, thì vẫn luôn có những giá trị bền vững theo thời gian. Đó chính là phong cách đồ họa 8-bit đầy răng cưa và màu sắc được ứng dụng tối giản nhất có thể, dù rằng những trò chơi hiện đại với đồ họa cổ lỗ chẳng liên quan gì tới những hạn chế về mặt phần cứng của thời kỳ console 8-bit cả. Trong số đó, có thể kể tên Shovel Knight, Stardew Valley, hay Undertale, là những cái tên có thể được liệt vào dạng “game lấy phong cách đồ họa 8-bit”. Nhưng suy cho cùng, tất cả những trò chơi đó có chiều sâu phát triển ấn tượng hơn rất nhiều so với những gì các nhà làm game gần 4 thập kỷ trước có thể làm được, tất cả đều chỉ vì hạn chế của phần cứng.

Stardew Valley

Undertale
Khi NES ra mắt, những tác phẩm đã đi vào hàng kinh điển, như Super Mario Bros, Castlevania, Metroid, đều buộc phải chọn phong cách đồ họa khối vuông do hạn chế của phần cứng, chứ không phải chọn vì thích. Tất cả đều có thể được giải thích từ chính cụm từ 8-bit ở tiêu đề bài viết. Đấy là khái niệm mô tả khả năng của chip xử lý trung tâm trong những chiếc máy như NES và Atari 7800, chứ ban đầu nó chẳng liên quan gì tới khả năng xử lý đồ họa cả.

Kiến thức tin học phổ thông, 1 bit là một giá trị nhị phân, là giá trị cơ bản nhất máy tính điện toán của con người có thể xử lý (chưa bàn đến qubit trong máy tính lượng tử anh em nhé, xa quá). Một bit có thể có hai giá trị, 1 hoặc 0, true hoặc false, on hoặc off, tùy cách giải thích trong từng ngữ cảnh. Về cơ bản máy tính của anh em sẽ xử lý dữ liệu dưới dạng các chuỗi nhị phân như vậy, để di chuyển, lưu trữ hoặc sửa dữ liệu.

Ý tưởng chuyển dữ liệu trở thành bit được phát minh vào năm 1732, bởi hai nhà toán học Basile Bouchon và Jean-Baptiste Falcon. Họ dùng những tấm giấy đục lỗ để làm “thuật toán” qua đó ra lệnh điều khiển một cách bán tự động những chiếc máy dệt. Sau đó, khái niệm “bit” lần đầu tiên được nhà toán học Claude E. Shannon sử dụng trong tài liệu nghiên cứu mang tính cách mạng của mình, Lý thuyết Toán học về Truyền thông, thứ đã thay đổi về mặt bản chất cách con người truyền dẫn dữ liệu.

Quảng cáo
Vậy thì 8-bit có nghĩa là gì? Khái niệm này đồng nghĩa với kích thước một đơn vị dữ liệu mà máy tính có thể xử lý. 1-bit có 2 giá trị, cái này ở trên anh em đọc rồi. 2-bit sẽ có 4 giá trị (2^2), 4-bit sẽ có 16 giá trị (2^4). Một đơn vị dữ liệu 8-bit sẽ có 256 giá trị khác nhau (2^8). Xa hơn 35 năm sau, PS5 có nền tảng bộ nhớ 256-bit, một đơn vị dữ liệu 256-bit tương ứng bao nhiêu giá trị thì anh em có thể mở máy tính xem 2 mũ 256 là bao nhiêu nhé.

Quay trở lại với chiếc máy NES, so với console hiện đại, chiếc máy của Nintendo có khả năng lưu dữ liệu thấp hơn rất nhiều. Hệ quả là, các nhà phát triển game có không gian sáng tạo vô cùng hạn hẹp, cụ thể hơn là những gì chiếc máy có thể hiển thị cùng lúc trên màn hình phải thừa nhận là sơ sài. Anh em có thể tìm ra những ví dụ rất cụ thể về việc game trên điện tử 4 nút bị giới hạn ra sao. Ví dụ số lượng màu có thể hiện thị trong một màn chơi, số lượng đối thủ với hình ảnh (sprite) khác nhau hiển thị cùng lúc,…
Trong The Legend of Zelda phần đầu tiên, Link không thể kiếm được quá 255 rupee, vì 256 (0 – 255) là giá trị tối đa của một đơn vị dữ liệu 8-bit. Tương tự, nếu anh em chơi được đến màn thứ 256 của Pacman, game sẽ lỗi đúng nghĩa đen, tạo ra một màn chơi trông như bị ma ám. Cái này ngày xưa anh em gọi là “kill screen”, khi phần mềm bị crash.

Nhưng cùng lúc, cũng chính đồ họa 8-bit đã sản sinh ra những nhân vật bất tử của làng game, như quả bóng hồng Kirby hay anh chàng robot Rockman chẳng hạn.
Quảng cáo

Phần cứng của NES có một bộ phận xử lý hình ảnh. Nó chia đồ họa của một trò chơi hiển thị trên TV ra làm hai lớp, background và sprite. Lớp background là 256 ô vuông 8x8 pixel. Cũng vì bộ xử lý 8-bit, nên các nhà phát triển chỉ được dùng tối đa 256 màu độc lập. Vì thế, việc lặp đi lặp lại những ô tile đồ họa là điều trò chơi nào cũng ứng dụng, vì dù có thể hiển thị 256 màu sắc khác nhau, cùng lúc hình ảnh hiển thị trên màn hình chỉ hiện được từ 13 đến 64 màu sắc khác nhau. Đến lớp sprite, những mô hình nhân vật đầy răng cưa, cũng có quy luật xử lý riêng.
Tất cả những hạn chế về mặt công nghệ nói trên đã khai sinh thời kỳ đồ họa 8-bit. Ví dụ con trùm khổng lồ trong Mega Man 2 là một phần của lớp đồ họa background, chứ không đủ chỗ xử lý sprite lớn cỡ đó. Trong khi đó, Batman Return of the Joker thì đánh lừa người chơi bằng lớp background di chuyển, được tạo thành một vòng lặp để mô phỏng quá trình chuyển động của nhân vật.

Một ví dụ rất hay chính là video clip dưới đây của nhà phát triển Morphcat Games. Họ mô tả rất chi tiết cách để làm thế nào viết được một trò chơi phức tạp, nhưng toàn bộ dung lượng game vẫn phải nhét vừa 40 KB, giới hạn đọc dữ liệu mỗi giây của chip RAM bên trong băng máy NES. Để tiện so sánh, 40 KB chỉ ngang bằng 2 giây âm thanh chuẩn mp3. Tất cả những mánh rất độc đáo đều được khai thác. Nói theo kiểu của các cụ, thì cái khó ló cái khôn, không sai một chút nào cả:
Trong số 40 KB kể trên, có 32KB code và dữ liệu, còn lại chỉ còn vỏn vẹn có 8KB dữ liệu đồ họa của game có thể được máy NES đọc và hiển thị lên màn hình. Một ô sprite của game viết cho NES là một hình vuông 8x8 pixel, chỉ dùng được 3 màu sắc khác nhau, nhưng bù lại anh em có thể kết hợp nhiều sprite thành một hình khối kích thước lớn hơn (metasprite). Vấn đề tiếp theo, mỗi lần màn hình quét (1Hz), chỉ có 8 sprite có thể hiển thị trên màn hình cùng lúc, sprite nào thừa sẽ biến mất. Với những trò chơi có nhiều quái vật và sprite nhân vật phức tạp cùng hiển thị, các nhà phát triển game sẽ phải ứng dụng hiệu ứng flickering để các mô hình nhân vật lần lượt xuất hiện trên màn hình, scanline 60 lần 1 giây, cứ thế chia nhau render.

Giới hạn tiếp theo đến từ chính kích thước 256 ô sprite. Nếu muốn nhân vật có nhiều cử động đa dạng, sẽ rất tốn dung lượng, vì mỗi ô sprite lại chứa một cử động khác nhau. Khi ấy, những ô sprite có thiết kế giống hệt nhau sẽ được gộp chung làm 1, dùng đi dùng lại cho nhiều cử động để tiết kiệm dung lượng bộ nhớ.

Các meta sprite sẽ được chia thành nhiều phần khác nhau, và may quá, NES cho phép lật ngang lật dọc sprite tùy ý, nên quá trình tối ưu này, dù mất thời gian, nhưng rất xứng đáng.




Kế đến là thiết kế background cho màn chơi. Tương tự như trên đây, những ô background trùng lặp sẽ được lưu một lần và dùng cho nhiều vị trí trong màn chơi. Nhưng sáng tạo hơn, đôi khi màn chơi sẽ được chia làm đôi, nửa bên này với nửa bên kia màn chơi giống hệt nhau, rồi tối ưu lượng dữ liệu còn sót lại để dịch chuyển từng lớp tile background, tạo ra màn chơi đa dạng, thử thách thay vì đều chằn chặn như soi gương.




Đấy mới chỉ là tối ưu 8 KB dữ liệu đồ họa, còn code lập trình để game vận hành lại là một câu chuyện khác phức tạp không kém.
Đến giữa thập niên 90, các nhà phát triển game đều đã thuộc nằm lòng những mánh khóe phát triển game 8-bit, từ đó góp phần tạo ra những thế giới ảo muôn màu như trong Kirby’s Adventure hay Excitebike. Còn những trò chơi 8-bit của thời hiện đại, chúng chỉ lấy ý tưởng sáng tạo để khai thác mặt hình ảnh, chứ chẳng thể nào nhét vừa dung lượng chip ROM bên trong một chiếc băng NES. Nếu có nhét vừa, thì phần cứng cũng chẳng thể nào xử lý được.
Theo Inverse