1. Hai kiểu phản ứng
Hẳn là nhiều người chơi game từng để ý đến một điểm thú vị khi nhấn nút bấm trên tay cầm của các loại máy chơi game. Đó là trong cùng một game, khi nhấn rồi giữ yên những nút bấm khác nhau thì phản ứng của nhân vật (hình ảnh nhân vật trên màn hình) cũng sẽ khác nhau. Chẳng hạn như khi ta nhấn rồi giữ yên các nút chữ thập thì nhân vật sẽ di chuyển liên tục, nhưng khi nhấn rồi giữ yên nút nhảy thì nhân vật cũng chỉ nhảy một lần duy nhất ngay sau khi nhấn. Hoặc là với cùng một nút bấm nhưng ở những game khác nhau thì phản ứng của nhân vật cũng khác nhau khi ta nhấn giữ yên nút. Chẳng hạn như trong game Contra Spirit trên máy Super Famicom, khi nhấn giữ yên nút Y thì nhân vật sẽ bắn đạn liên tục. Nhưng khi ta nhấn rồi giữ nút Y này trong game Ninja Warriors thì nhân vật chỉ tung một đòn đánh duy nhất rồi chuyển sang đỡ đòn chứ không đánh liên tục. Nếu muốn ra đòn liên tục trong Ninja Gaiden thì chỉ có một cách duy nhất là nhấp nút Y (nhấp nút là thao tác lặp lại các bước nhấn rồi thả nút).
Cùng một kiểu nhấn với cùng một nút nhưng ở hai game khác nhau thì cho phản ứng khác nhau
Hiện tượng này xảy ra với mọi game, mọi loại tay cầm trên mọi loại máy chơi game, kể cả PC.
Tại sao với cùng một kiểu nhấn rồi giữ yên nút mà lại có tới hai kiểu phản ứng khác nhau? Và làm thế nào để máy phân biệt được khi nào thì nhấn giữ yên sẽ cho phản ứng liên tục (như di chuyển liên tục, tấn công liên tục) còn khi nào thì nhấn giữ yên nút chỉ co phản ứng một lần duy nhất ( như nhảy, tấn công)? Câu trả lời nằm ở hai loại phép tính luận lý (logic) mà nhà sản xuất sử dụng để đọc tín hiệu từ nút bấm.
Phần bên dưới giải thích chi tiết về hai loại luận lý này, nhưng trước hết cần nói về lưu trình đọc tín hiệu nút bấm của tay cầm.
2. Đọc tín hiệu nút bấm
Tất cả chúng ta đều biết, khi nhấn nút bấm thì hình ảnh trên màn hình sẽ phản ứng. Khi nhấn phím trên bàn phím máy tính thì chữ sẽ xuất hiện trên màn hình. Khi chạm vào màn hình cảm ứng của điện thoại thì màn hình sẽ sáng,.... Điều này chứng tỏ rằng các thiết bị này luôn "rình mò" để đọc tín hiệu nhấn nút/chạm cảm ứng từ người dùng. Nếu thiết bị luôn canh xem chúng ta có nhấn nút hay không thì chúng xử lý những việc khác vào thời điểm nào?
Thật ra, chuyện "canh me" người chơi có nhấn nút hay không chỉ là một trong số rất nhiều tác vụ mà máy thực hiện trong một chu kỳ (một frame). Vì tốc độ thực hiện mỗi tác vụ của nó rất nhanh nên chúng ta có cảm giác là máy không làm gì khác ngoài mỗi chuyện rình rập người dùng. Chẳng hạn như máy Super Famicom/SNES có tốc độ thực thi 60 chu kỳ trong một giây, nghĩa là trong mỗi giây thì CPU có thể đọc tín hiệu nút bấm trên tay cầm 60 lần. Bên dưới là lưu đồ xử lý mỗi frame của máy Super Famicom/SNES, nhưng nó cũng đúng với nhiều hệ máy khác.
Trong mỗi giây, máy Super Famicom có thể thực thi 60 lần chu trình này, tức là nó có thể đọc tín hiệu nhấn nút của người dùng tới 60 lần/giây
Mỗi khi người dùng nhấn một nút nào đó trên tay cầm thì thiết bị sẽ sinh ra tín hiệu 1 ở một Register tương ứng với nút bấm đó. Còn khi người dùng không nhấn nút thì tín hiệu là 0. Register là một phần memory được tích hợp trong mạch phần cứng và đóng vai trò quan trọng trong việc điều khiển thiết bị. Trong mỗi chu kỳ, CPU đọc tín hiệu từ tay cầm, nếu tín hiệu này là 1 thì nó sẽ xử lý tiếp, ra lệnh chuyển dữ liệu đồ họa (hình ảnh) tương ứng với hành động của nút bấm vào Vram, từ đó hình ảnh được cập nhật trên màn hình.
Nếu vậy thì khi nhấn rồi giữ nút liên tục thì tín hiệu 1 luôn được sinh ra, nhưng tại sao ở một số tình huống, chẳng hạn như khi nhấn giữ nút nhảy thì hình ảnh nhân vật trên màn hình chỉ nhảy một lần duy nhất? Hình ảnh chỉ được cập nhật một lần duy nhất có nghĩa là máy chỉ nhận được tín hiệu 1 một lần duy nhất, trong khi ta vẫn liên tục giữ nút và tín hiệu 1 liên tục được sinh ra.
Điều này xảy ra là bởi nhà sản xuất không để CPU xử lý tín hiệu (mà nó đã đọc được) một cách trực tiếp, nó chỉ xử lý tín hiệu đã qua một bước xử lý trung gian bằng các phép luận lý AND và XOR như bên dưới.
3. Hai phép luận lý
Phép luận lý tích (AND) và phép luận lý hòa mang tính bài tha (Exclusive OR, viết tắt là XOR/EOR) là hai phép luận lý được dùng khá nhiều trong lập trình nhằm mục đích thay đổi giá trị của các bit.
Đối với phép luận lý tích (AND), khi cả hai toáng hạng đều có giá trị là 1 thì kết quả sẽ có giá trị 1. Chỉ cần một trong hai toán hạng có giá trị là 0 thì kết quả sẽ là 0.
Đối với phép luận lý hòa mang tính bài tha (XOR/EOR), khi hai toán hạng có giá trị khác nhau (một toán hạng có giá trị 0, toán hạng còn lại có giá trị 1) thì kết quả có giá trị 1. Khi hai toán hạng có cùng giá trị (đều là 0 hoặc 1) thì kết quả sẽ có giá trị 0.
Khi người chơi nhấn nút, mạch nút bấm được kết nối, tạo ra tín hiệu 1. Dù người chơi nhấn rồi thả nút ra ngay lập tức nhưng thực ra khoảng thời gian mạch được kết nối trải qua khá nhiều chu kỳ (frame), vì tay người không thể phản xạ nhanh như tốc độ đọc/xử lý của CPU. Dĩ nhiên, khi ta nhấn rồi giữ yên một nút thì vô số frame đã trải qua kể từ khi nhấn, nhưng ta có thể chia những frame này thành hai loại: frame hiện tại và frame ngay trước đó (frame cũ). Frame hiện tại cũng sẽ trở thành frame cũ ngay khoảnh khắc sau đó.
4. Tình huống #1: nhấn giữ nút, cập nhật hình ảnh liên tục
Khi muốn hình ảnh liên tục được cập nhật khi nhấn giữ nút thì chỉ cần cho CPU thực hiện phép luận lý AND giữa frame hiện tại với frame ngay trước đó là được.
Giả dụ, nếu trước đó người chơi không nhấn nút thì tín hiệu ở frame cũ là 0, và rồi đến khi người chơi nhấn nút thì tín hiệu ở frame hiện tại có giá trị là 1. Kết quả phép AND giữa hai frame này là 0, hình ảnh vẫn chưa được cập nhật ngay. Nhưng ngay sau đó, tín hiệu của frame cũ và frame hiện tại đều là 1 nên kết quả phép AND giữa hai giá trị của hai frame này sẽ là 1, CPU nhận tín hiệu này để cập nhật hình ảnh.
Khi ta nhấn giữ nút liên tục thì giá trị của frame cũ và frame hiện tại đều là 1, và kết quả của phép AND giữa hai frame này cũng là 1 nên hình ảnh được cập nhật liên tục. Đây là lý do khiến hình ảnh liên tục được cập nhật khi người chơi bấm giữ nút.
Còn khi ta vừa thả nút ra thì giá trị của frame hiện tại là 0, trong khi giá trị của frame cũ là 1, kết quả của phép AND này là 0, nên hình ảnh không còn được cập nhật.
Toàn bộ quá trình này diễn ra như hình minh họa bên dưới.
Chừng nào người chơi còn nhấn nút thì nhân vật còn chuyển động
5. Tình huống #2: nhấn giữ nút, cập nhật hình ảnh một lần
Tình huống này phức tạp hơn trước một chút, khi cần tới hai bước luận lý. Đầu tiên, giá trị tín hiệu của frame hiện tại được XOR với giá trị tín hiệu của frame cũ, sau đó kết quả này được AND với giá trị của frame hiện tại.
Ngay khi ta vừa nhấn nút thì tín hiệu của frame hiện tại là 1, còn tín hiệu của frame cũ là 0, nên kết quả trung gian của phép XOR này là 1. Kết quả này được AND với giá trị tín hiệu của frame hiện tại là 1 nên kết cuối cùng là 1, khiến hình ảnh được cập nhật. Trong vô số những khoảnh khắc nối tiếp nhau, chừng nào người chơi còn nhấn giữ nút thì giá trị tín hiệu của frame cũ lẫn frame hiện tại đều là 1, nên kết quả trung gian của phép XOR sẽ là 0. Kết quả trung gian này được AND với giá trị tín hiệu của frame hiện tại là 1, dẫn tới kết quả cuối cùng là 0, hình ảnh không được cập nhật.
Đó là lý do khiến khi ta nhấn giữ nút liên tục thì hình ảnh chỉ được cập nhật một lần duy nhất.
Khi ta thả nút thì giá trị tín hiệu của frame hiện tại là 0, trong khi tín hiệu của frame cũ vẫn là 1, và kết quả trung gian của phép XOR giữa hai frame này là 1. Kết quả trung gian này được AND với giá trị tín hiệu của frame hiện tại là 0, nên kết quả cuối cùng là 0, khiến hình ảnh không còn được cập nhật.
Toàn bộ quá trình này diễn ra như hình minh họa bên dưới.
Nhấn giữ nút không làm nhân vật di chuyển liên tục, mà cần phải nhấp nhả nút liên tục
Giả sử không có bước AND cuối cùng mà chỉ có bước XOR thì sẽ dẫn tới hiện tượng phi lý là ngay khi người chơi vừa thả nút bắn thì đạn vẫn được nhả ra. Điều này xảy ra bởi vì ngay khi nhả nút thì tín hiệu của frame hiện tại là 0, nhưng tín hiệu của frame cũ vẫn là 1 nên kết quả XOR giữa chúng cho ra 1, nên hình ảnh vẫn tiếp tục được cập nhật.