Có điểm gì bất thường trong ảnh chụp màn hình trò Captain Tsubasa 2 (máy Famicom) bên dưới?
Điểm bất thường này mang tính kỹ thuật, và chỉ có những người am hiểu về phần cứng/phần mềm của máy này mới nhìn ra được.
Đó chính là font chữ có độ rộng biến thiên, một thứ cực kỳ hiếm trong game hệ Famicom/NES,
Variable width font, hay Proportional font, là kiểu chữ mà độ rộng của các ký tự không đều nhau, mỗi ký tự đều có độ rộng riêng của nó.
Ngày nay chúng ta thấy kiểu chữ này ở khá nhiều nơi, từ sách báo cho tới trò chơi điện tử.
Nó mang lại cảm giác thẩm mỹ cao độ cho văn bản, và là một kỹ thuật cơ bản mà hầu hết các trò chơi điện tử dùng ký tự La Tinh đều hướng đến.
Ngược lại với Proportional font là Monospace font, hay còn gọi là Fixed width font.
Đó là kiểu chữ mà bề ngang của mọi ký tự đều như nhau, mang lại cảm giác lổm ngổm cho văn bản dùng ký tự La Tinh khi đọc.
Kiểu như "t h e q u i c k b r o w n f o x" thay vì "the quick brown fox" theo kiểu Porportional font.
Kiểu Monospace phù hợp với văn bản tiếng Nhật, Trung, Hàn hơn văn bản dùng ký tự La Tinh, bởi vì các chữ cái và chữ Hán trong những ngôn ngữ này có độ rộng gần như tương đương nhau.
Với phần cứng ngày nay, thiết bị dễ dàng hiển thị kiểu Proportional font, nhưng chuyện này không hề dễ dàng trên các phần cứng trước năm 1990.
Kiểu hiển thị Proportional font trong trò chơi điện tử chỉ bắt đầu phổ biến với sự xuất hiện ở máy Sufami của Ninh Tiền Đô vào năm 1990, khi mà tốc độ CPU và dung lượng ROM đều tăng đáng kể so với bản Famicom trước đó.
Nếu để ý, bạn sẽ thấy một sự thật rằng gần 100% trò chơi điện tử trên máy Famicom/Nes mà sử dụng ký tự La Tinh đều dùng kiểu Monospace font, và đều chỉ dùng chữ in hoa.
Số lượng game trên hệ máy này dùng bộ font có đầy đủ chữ in hoa và in thường ít hơn rất nhiều, và số lượng game dùng kiểu hiển thị Proportional font lại càng hiếm, có thể đếm được trên đầu ngón tay.
Hãy nhìn ví dụ như trò Mario, bạn sẽ thấy toàn chữ in hoa và khoảng cách giữa các ký tự đều tăm tắp.
Sở dĩ như vậy là vì 2 giới hạn của máy Famicom/Nes cũng như các loại máy chơi game khác trước nó.
Đầu tiên là dung lượng ROM không đủ để chứa đầy đủ bộ ký tự có cả chữ in và chữ thường. Giá thành cho dung lượng ROM trong thời kỳ đó là cực kỳ đắt đỏ.
Thứ hai là tốc độ xử lý. Các hệ máy game đời đầu của Ninh Tiền Đô dùng đồ họa kiểu mảng.
Một đơn vị đồ họa cơ bản nhất là một mảng, tức một ô vuông 8x8 pixel.
Để có thể hiển thị Porportional font thì CPU phải trải qua nhiều bước, trong đó gồm các bước SHIFT (dời bit) sang phải và phép luận lý OR nhiều lần, khiến nó không còn đủ thời gian để xử lý những tác vụ khác.
Phép luận lý SHIFT cho phép ta đẩy hình ảnh của mảng sang bên phải. Mỗi lần SHIFT là một lần đẩy các pixel của một hàng sang một pixel. Với mảng 8x8 pixel thì cần 8 lần SHIFT để đẩy sang phải một pixel. Cũng với mảng này nhưng cần đẩy sang phải 3 pixel thì cần tới 24 lần SHIFT. Việc này cực kỳ tốn thời gian.
Hãy nhìn vào phần bên dưới của hình ảnh minh họa.
Đây là lưu trình cơ bản để tạo kiểu chữ Porportional font.
Lấy ví dụ là từ "AI". Trong đó chữ "A" có độ rộng 6 pixel và chữ "I" có độ rộng 4 pixel.
Trong ROM chứa hình ảnh của từng ký tự, mỗi slot gồm 16x16 pixel.
Đầu tiên, CPU đọc chữ "A" rồi vẽ từng dòng pixel của nó vào trong vùng đệm. Tại bước này, nó cũng đọc luôn độ rộng của "A" là 6 pixel rồi ghi vào một vùng nhớ khác.
Lúc này, CPU kiểm tra độ rộng của ký tự đứng trước đó. Do chữ "A" đứng đầu nên độ rộng này = 0 nên CPU vẽ "A" mà không có SHIFT, rồi copy vùng đệm này vào Ram chính.
Sau đó nó xóa sạch vùng đệm.
Thứ hai, CPU đọc chữ "I" rồi vẽ từng dòng pixel của nó vào vùng đệm.
Lúc này CPU kiểm tra độ rộng của ký tự trước đó là 6 pixel. Thành ra ở đây, khi vẽ từng dòng pixel của "I" vào vùng đệm thì nó làm phép tính SHIFT 6 lần đối với từng dòng pixel để đẩy các điểm ảnh sang phải 6 lần.
Tiếp đến, CPU copy vùng đệm này, rồi làm phép luận lý OR với vùng Ram chính, nơi đang chứa hình ảnh của "A".
Phép luận lý OR là hợp của hai tập hợp:
0 OR 1 = 1
0 OR 0 = 0
1 OR 1 = 1
Trong đó tập hợp 1 chính là vùng RAM chính đang chứa "A", còn tập hợp 2 là vùng đệm với "I" được dời sang phải 6 pixel.
Khi RAM chính được OR với vùng đệm thì kết quả là ký tự "I" xuất hiện cách ký tự "A" đúng 6 pixel về bên phải.
Đó là quy trình để tạo ra Porportional font.
Tuy nhiên, với tốc độ xử lý của máy Famicom/NES thì việc lặp đi lặp lại bước SHIFT và OR sẽ khiến nó không còn thời gian để làm việc khác, gây ra hiện tượng lag.
Đó là lý do mà hầu hết game Famicom/NES đều không sử dụng kỹ thuật Porportional font.
Còn trong bản dịch Tsubasa 2 này, mình đã tạo ra Porportional font mà không cần SHIFT và OR nhiều lần.
Đó là điểm bất thường.
Bất thường này được tạo ra bằng cách render sẵn từng ký tự. Mỗi ký tự có 8 phiên bản của chính nó. Phiên bản đầu tiên là SHIFT = 0 và phiên bản thứ 8 là SHIFT = 7.
Với cách này thì CPU có thể nhanh chóng hiển thị Proportional font trên màn hình, nhưng bù lại thì dung lượng sẽ phình to đáng kể.
Ngày nay, dung lượng ROM không phải là rào cản, nên sự hy sinh này hoàn toàn chấp nhận được.