Multi Thần điện Ninh Tiền Đô 816 bit

  • Thread starter Thread starter SPC700
  • Ngày gửi Ngày gửi
Cách render của monospaced font và proportional font trên máy game.

 
Trong bài trước, bạn đã biết rằng máy Genesis/Megadrive của Xé Gà có tốc độ xử lý nhanh gấp đôi so với máy Sufami/Snes của Ninh Tiền Đô, cho nên hình ảnh chuyển động mượt hơn.

Ok, tốc độ xử lý nhanh hơn thì hình ảnh mượt hơn. Dĩ nhiên rồi. Đó là một sự thật hiển nhiên. Nhưng nguyên lý của sự thật hiển nhiên này là gì thì không phải ai cũng hiểu rõ.
Và đây là bài giải thích về logic đằng sau sự thật hiển nhiên này.

Để hiểu được nội dung bài này thì trước hết bạn cần nắm rõ một số thông tin tiền đề như bên dưới.

1. 60 fps
Các loại Retro console như Famicom, Genesis, Sufami đều chạy ở tốc độ gần 60 fps với hệ màu NTSC (chính xác là 5994 Hz, ở đây ta làm tròn thành 60). 60 khung hình mỗi giây là một con số vẫn còn lý tưởng cho đến ngày nay.

2. Cách hiện ảnh của Tivi CRT
Các loại Tivi CRT được dùng để kết nối với console đương thời cũng đều chạy được 60 fps, giống như các loại console cùng thời.
Cách hoạt động của Tivi CRT là:

- Tia điện tử quét khắp màn hình Tivi, bắn vào lớp lân tinh (tiếng Anh: phosphor ) được phủ trên màn hình, khiến những phần lân tinh được bắn sẽ sáng lên, hiện rõ hình ảnh.
- Tia điện tử quét tuần tự từ trái sang phải, từ trên xuống. Khi tia này quét đến mép ngoài cùng bên phải của màn hình thì nó quay trở lại điểm ngoài cùng bên trái của màn hình, nhưng cách 1 hàng về phía bên dưới so với lúc trước.
- Khi tia điện tử quét xuống hàng cuối cùng của Tivi thì nó sẽ quay lại điểm xuất phát ban đầu ở gốc trên cùng, phía ngoài cùng bên trái của Tivi.
- Khoảng thời gian mà tia điện tử quét hết các đường ngang rồi quay trở lại điểm gốc được gọi là một frame. Như ở 1. có đề cập, trong mỗi giây, tia điện tử của Tivi CRT lặp lại chu trình này 60 lần.

Trong hình minh họa bên dưới, đường màu vàng biểu thị cho chiều quét ngang của tia điện tử. Đường nét đứt màu xanh biểu thị cho việc tia điện tử trở lại mép bên trái của màn hình nhưng cách 1 dòng về bên dưới. Đường màu đỏ biểu thị cho việc tia điện tử quay trở lại gốc tọa độ.
Các đường quét này được gọi ;à tẩu tra tuyến (tiếng Anh: scanline).

Như vậy, toàn bộ hình ảnh không hiện ra một lần trên màn hình, mà chúng xuất hiện dần dần qua mỗi đường quét. Tia điện tử quét tới đâu thì hình ảnh xuất hiện tới đó. Nếu dùng máy quay có tốc độ cao để quay lại màn hình của Tivi CRT thì bạn sẽ thấy rõ điều này. Hình ảnh không liền mạch, mà xuất hiện từng phần rồi biến mất trước khi một frame mới lặp lại.
Còn nếu hỏi tại sao chúng ta lại thấy toàn bộ hình ảnh xuất hiện một cách liền mạch thì đó là do đặc điểm lưu ảnh trên võng mạc của mắt người. Nhờ có nó mà chúng ta thấy phim hoạt hình không phải là những hình ảnh rời rạc.

3. Blanking
Blanking là khoảng thời gian tắt của màn hình, và là một trong những khái niệm quan trọng bậc nhất khi lập trình game console đời cũ.
Tivi CRT có 3 thời điểm tắt màn hình. Tắt ở đây không có nghĩa như bạn nhấn ngón tay vào nút nguồn, mà có nghĩa là tia điện tử ngưng quét, khiến lớp lân tinh trên màn hình không phát sáng và kết quả là ta thấy một màn hình đen tuyệt đối.

Vậy 3 thời điểm tắt màn hình ở đây là gì?

- Force blank: là khoảng thời gian tia điện tử ngừng quét một cách có chủ đích theo ý muốn của nhà lập trình. Nó thường được dùng để chuyển một khối lượng lớn dữ liệu hình ảnh vào Vram. Khi bạn mở cửa vào một căn phòng thì ngay sau đó là màn hình đen. Đó chính là khoảng thời gian Force blank, và mục đích của nó là để load toàn bộ asset đồ họa bên trong căn phòng vào Vram.

- H-blank: là khoảng thời gian tắt màn hình tự động, một cách chu kỳ khi tia điện tử đạt đến điểm cực hữu của màn hình và chuẩn bị quay về điểm cực tả ở hàng bên dưới.

- V-blank: cũng là khoảng thời gian tắt màn hình tự động, một cách chu kỳ khi tia điện tử đạt đến điểm dưới cùng của màn hình và chuẩn bị quay về điểm gốc của tọa độ, chấm dứt một frame.

Dữ liệu hình ảnh chỉ được cập nhật trong 3 thời điểm blanking kể trên. Nhưng vì H-blank diễn ra rất chóng vánh nên hầu như không đủ thời gian để cập nhật hình ảnh.
Thực tế, các nhà lập trình thường dùng Force blank để chuyển hình ảnh vào V-Ram nếu chúng có kích thước lớn. Còn với các dữ liệu có khối lượng nhỏ nhẹ hơn thì chúng được chuyển vào thời kỳ V-blank.

Vậy bạn có thắc mắc là tại sao khi tia điện tử đến điểm dưới cùng của màn hình thì màn hình sẽ tắt để reset tia điện tử về điểm gốc mà mắt ta vẫn thấy hình ảnh xuất hiện liên tục chứ đâu có thấy ngừng chút nào?
Đó là do tính chất tàn ảnh của võng mạc như đã đề cập ở trên, và ngoài ra thì lớp lân tinh vẫn tiếp tục phát sáng vài mili giây sau khi tia điện tử ngừng quét. Điều này khiến ta cảm thấy hình ảnh xuất hiện liên tục, chứ thật ra là trong mỗi giây có tới 60 lần tia điện tử ngừng quét một khoảng thời gian đủ lâu để chuyển dữ liệu vào V-Ram.

4. Cách hoạt động của console

Trong phần trên, bạn đã biết về cách hoạt động của Tivi CRT. Nhưng bản thân nó không tự hoạt động. Những event như Force blank, H-blank hay V-blank đều là do console ra lệnh, còn Tivi không tự phán đoán thời điểm.
Nếu Tivi không được kết nối với máy game, mà chỉ xem vô tuyến bình thường thì nhà đài chính là bên ra lệnh cho Tivi khi nào thì thực hiện các khoảng Blanking.
Mặc dù H-blank và V-blank xảy ra theo chu kỳ nhưng chu kỳ đó là do tín hiệu từ console gửi đến Tivi.

Ngoài việc phát tín hiệu blanking đến Tivi thì console còn hoạt động theo lưu đồ khái quát ở phía bên phải của ảnh minh họa.
Sau khi khởi động xong thì CPU sẽ tính toán các dữ liệu để chuyển hình ảnh vào V-ram hoặc ra lệnh phát âm thanh.
Phần tính toán được thực hiện khi tia điện tử còn đang quét ngang màn hình.
Khi CPU đã tính toán xong mà tia điện tử còn chưa đến đường dưới cùng của màn hình thì CPU không làm gì cả ngoài việc đợi cho đến khi V-blank xảy ra. Khi V-blank xảy ra thì hình ảnh được cập nhật lên màn hình theo kết quả vừa được tính toán.
Đối với các game nhẹ, tính toán đơn giản thì lưu trình này khá phổ biến. Và ta thấy hình ảnh được làm mới mỗi frame. Độ mượt của Genesis với Sufami là tương đương nhau, đều cùng 60 fps.

Nhưng khi game có nhiều dữ liệu để tính toán thì sự khác biệt sẽ xảy ra. Với CPU tốc độ cao của Genesis thì nó vẫn tính toán được khối dữ liệu đó trong khi tia điện tử còn đang quét, và sau đó nó đợi V-blank như thông thường.
Còn với CPU của Sufami thì tốc độ xử lý chỉ bằng một nửa Genesis, nên đến khi tia điện tử quét đến đường dưới cùng của màn hình, V-blank bắt đầu xảy ra thì nó vẫn chưa tính toán xong.
Chưa tính toán xong có nghĩa là sẽ không có hình ảnh mới nào được chuyển vào V-ram trong frame đó hết, hoặc chỉ chuyển một phần.
Nó phải đợi đến frame sau mới xử lý xong, và lúc này hình ảnh mới được chuyển vào V-ram ở kỳ V-blank của frame thứ 2.
Đó là khi lag xảy ra.
Rất nhiều game Sufami chạy ở tốc độ 30 fps trong khi cả Tivi và hệ máy đều có khả năng chạy 60 fps là vì lý do đó. Nó cần đến 2 frame để xử lý hết khối lượng tính toán.

Và đôi khi tình hình còn tệ hơn. Khi nhiều hình ảnh, nhiều quân địch xuất hiện cùng lúc trên màn hình thì CPU cần tới 3, 4 hoặc 5 frame để xử lý dữ liệu. Điều này có nghĩa là phải mất tới 3, 4 hoặc 5 frame để một hình ảnh xuất hiện trên màn hình thay vì xuất hiện từ frame. Đó chính là hiện tượng mà ta gọi là "lag".

Và đó cũng chính là lý do tại sao tốc độ CPU càng cao thì càng cho hình ảnh mượt mà hơn. Tốc độ CPU càng cao thì nó xử lý dữ liệu càng nhanh, xác suất để gửi hình ảnh sau xử lý vào V-ram ngay trong frame đó càng cao.
Khi tốc độ CPU càng chậm thì nó cần càng nhiều frame để xử lý dữ liệu hình ảnh trước khi gửi chúng vào V-ram.

1780703185614.png
 
Back
Top