Tới danh sách bài viết

Tình Trạng Hệ Thống Xác Nhận Trúng Đạn

Chia sẻ:

Xin chào, tôi là Kevin Lee, kỹ sư phần mềm thuộc đội ngũ Hệ Thống Trò Chơi của VALORANT. Đội ngũ của chúng tôi chịu trách nhiệm phát triển rất nhiều hệ thống cốt lõi hỗ trợ cho lối chơi của VALORANT, bao gồm di chuyển, giao tranh và lệnh đầu vào. Trong bài viết này, tôi sẽ nói qua về một trong những hệ thống cốt lõi của lối chơi bắn súng góc nhìn thứ nhất: Xác Nhận Trúng Đạn.

Trong một trò chơi như VALORANT, xác nhận trúng đạn có thể nói là một trong những hệ thống quan trọng nhất vì chiến thắng và thất bại có thể chỉ phụ thuộc vào một pha headshot duy nhất. Là nhà phát triển, mục tiêu của chúng tôi là đảm bảo khi người chơi bắn một viên đạn, đích đến của viên đạn bắn ra phải rõ ràng, đúng với cảm giác khi bắn và trên hết là phải chính xác.

Đôi lúc chúng tôi đọc được những bài viết hay nhận được tin nhắn của người chơi cùng với những video ngắn cho thấy việc xác định trúng đạn có vẻ bị lỗi. Chúng tôi cực kỳ coi trọng những báo cáo này, và luôn xem kỹ từng khung hình của mỗi video để xác nhận rằng hệ thống đang hoạt động như mong đợi.

Tuy nhiên, chúng tôi nghĩ rằng xác nhận trúng đạn trong VALORANT hiện đang hoạt động khá tốt. Đúng, có thể vẫn còn những lỗi hiếm gặp và chúng tôi sẽ luôn cân nhắc nghiêm túc về những vấn đề như vậy. Chúng tôi vẫn liên tục cải thiện chất lượng và độ rõ ràng trong tất cả các hệ thống.

ĐỘ CHÍNH XÁC VÀ ĐỘ RÕ RÀNG

Trong phiên bản cập nhật beta 0.50, chúng tôi thấy đột nhiên có một loạt những báo cáo về các vấn đề liên quan đến xác nhận trúng đạn. Sau khi xem xét những báo cáo, video của người chơi và thử nghiệm nội bộ mở rộng, chúng tôi đã xác định được một số lỗi hiếm gặp đối với xác nhận trúng đạn, nhưng không có lỗi nào đủ nghiêm trọng để lý giải cho số lượng báo cáo mà chúng tôi nhận được. Khi xem xét kỹ càng hơn, phần lớn những đoạn video ngắn nêu lên những vấn đề không liên quan đến độ chính xác, mà là độ rõ ràng. Những viên đạn bắn ra được xử lý chính xác, nhưng phản hồi hình ảnh của viên đạn lại khiến cho người chơi hiểu nhầm kết quả. Điều này cho thấy sự khác biệt quan trọng giữa độ chính xác và độ rõ ràng.

Dù cả hai yếu tố đều quan trọng để đảm bảo "cảm giác" khi bắn...

  • Độ chính xác mô tả đích đến của viên đạn bắn ra bị sai (vd: đạn trúng vào đầu nhưng lại tính là trúng thân hay vị trí xuất hiện của người chơi phe địch khác trên client khác so với máy chủ)
  • Độ rõ ràng mô tả phần hình ảnh của viên đạn bắn ra khó nhìn (vd: đạn bắn vào vai, nhưng phản hồi hình ảnh lại khiến cho tình huống nhìn giống như đạn bắn vào đầu)
  • Lỗi về độ chính xác tệ hơn lỗi về độ rõ ràng rất nhiều

Chúng tôi mong rằng bài viết này sẽ giúp làm sáng tỏ hơn về hệ thống để mọi người có thể nhìn nhận chính xác và hiểu rõ những gì đang xảy ra trên màn hình, cụ thể là về những viên đạn bắn ra. Tôi sẽ nói về cách hệ thống hoạt động ở bậc cao, và giải thích điều gì sẽ xảy ra từ khoảnh khắc bạn nhấp nút bắn, cho đến khi cú headshot được hiển thị.

Để đi sâu và chi tiết hơn về mặt kỹ thuật, hãy đọc bài viết này về mã mạng của VALORANT trên Riot Tech Blog.

Tôi cũng sẽ nói về một số trường hợp hay gặp khi nhận những báo cáo về "lỗi xác nhận trúng đạn" và giải thích nguyên nhân cũng như những điều chúng tôi sẽ làm để cải thiện độ rõ ràng trong những tình huống như vậy.

TỪ NHẤP CHUỘT CHO ĐẾN HEADSHOT

Trước khi nói về điều gì sẽ xảy ra khi đạn được bắn ra, điều quan trọng bạn cần phải hiểu là cách trò chơi mô phỏng những gì đang xảy ra. Kiểu chơi của VALORANT được mô phỏng hai lần: một lần trên máy chủ (có quyền quyết định mô phỏng sẽ diễn ra như thế nào) và một lần trên client của bạn (dự đoán kết quả của máy chủ để khiến trò chơi có cảm giác phản hồi tốt hơn).

Bước mô phỏng trò chơi này bao gồm tất cả mọi thứ tạo nên trò chơi như vị trí của tất cả người chơi, bất kỳ kỹ năng nào bay trên không, và bất kỳ đám khói nào ở trên chiến trường. Vào mỗi khung hình, trò chơi chụp lại mô phỏng và sử dụng nó để kết xuất đồ họa một khung hình trên màn hình của bạn. Máy chủ cũng làm điều này đối với mỗi khung hình (bỏ qua bước kết xuất đồ họa vì không có ai cần nhìn màn hình máy chủ cả).

Ví dụ nhé, có một đối thủ lấp ló nhìn từ góc tường, và với kỹ năng định vị tầm ngắm siêu hạng của bạn, bạn đã đặt được hồng tâm lên đầu họ, vậy nên bạn nhấn chuột trái để bắn— Điều gì sẽ xảy ra?

hit_reg_flow.jpg

Vào lúc bạn nhấn một nút bấm, tín hiệu đầu vào được gửi đến hệ thống đầu vào của chúng tôi (có độ trễ phần cứng/hệ điều hành đôi chút). Với mỗi khung hình của trò chơi, hệ thống đầu vào sẽ xử lý tất cả tín hiệu đầu vào nhận được kể từ khung hình trước. Khi bạn bắn một viên đạn, tín hiệu đầu vào "bắn" được gửi cho máy chủ cùng với mốc thời gian đánh dấu viên đạn được bắn ra vào khung hình nào trong mô phỏng.

Điều quan trọng cần lưu ý ở đây là mốc thời gian này phụ thuộc vào những gì được kết xuất đồ họa trên màn hình của bạn vào thời điểm VALORANT nhận tín hiệu đầu vào. Giờ đây chúng tôi phải theo dõi viên đạn trên hai phiên bản mô phỏng khác nhau: trên client và trên máy chủ.

Hãy bắt đầu từ client nhé, gọi cách khác là máy tính nội bộ của bạn. Ngay sau khi pha nổ súng được gửi đến máy chủ, client bắt đầu hoạt động để hiển thị hiệu ứng chớp đạn và vệt đạn bắn ra. Điều này sẽ xảy ra sớm nhất là một khung hình sau khi bạn đưa ra tín hiệu đầu vào vì trò chơi cần phải kết xuất hình ảnh một khung hình mới cho màn hình của bạn. Điều này rất quan trọng vì nó đồng nghĩa với việc khung hình mà viên đạn được xử lý KHÔNG phải khung hình mà vệt được hiển thị mà thực ra là trước đó một khung hình.

Đôi khi điều này có thể khiến cho độ rõ ràng của viên đạn không được hiển thị đúng. Cách phổ biến để giải quyết lỗi không khớp này là làm cho viên đạn bay trễ. Chúng tôi không làm điều này bởi vì làm đạn bay trễ cũng làm tăng thêm độ trễ đầu vào, một điều mà chúng tôi muốn hạn chế tối đa trong VALORANT. Về xác nhận trúng đạn, client sẽ chờ cho đến lúc nhận phản hồi từ máy chủ về kết quả trước khi hiển thị xác nhận trúng đạn. Để đảm bảo tính đồng nhất giữa tất cả các người chơi và ngăn chặn những kẻ gian lận hack vào client và thay đổi đích đến của phát bắn, kết quả đạn bắn ra hoàn toàn được quyết định bởi máy chủ.

Trong khi đó, máy chủ cũng sẽ nhận được thông báo từ client rằng đã có đạn được bắn ra. Do độ trễ mạng, sẽ có một khoảng thời gian trôi qua kể từ khi đạn được bắn ra. Để đảm bảo viên đạn bắn ra đồng nhất với mô phỏng được hiển thị đối với người chơi, máy chủ sẽ tua lại mô phỏng tại mốc thời gian do client đưa ra trước khi đánh giá xác nhận trúng đạn. Bước này bao gồm tua lại của vị trí người chơi và hoạt ảnh. Sau đó máy chủ gửi lại kết quả của phát bắn về cho client. Trong ví dụ này, giả sử ta vừa có một cú headshot đi!

Client sẽ nhận thông báo từ máy chủ với kết quả của viên đạn và sau đó hiển thị hiệu ứng hình ảnh và âm thanh phù hợp. Trong trường này thì chúng là sẽ là hiệu ứng hình ảnh và âm thanh headshot. Vì client phải chờ máy chủ gửi kết quả của viên đạn, sẽ có độ trễ giữa đường hiển thị vệt đạn bắn và hiệu ứng trúng đạn bằng với thời gian chuyển nhận dữ liệu kết nối của bạn (vd: 40 mili giây đến máy chủ = độ trễ 80 mili giây giữa đường hiển thị vệt đạn bắn và hiệu ứng hình ảnh trúng đạn), cộng thêm một khoảng thời gian xử lý nhỏ. Với độ trễ cao hơn, bạn có thể dễ nhận thấy thời gian trì hoãn này trong thời gian thật.

Đây là một vấn đề chúng tôi đã và đang cố gắng cải thiện từ góc nhìn về độ rõ ràng.

VÍ DỤ THỰC TẾ ĐIỂN HÌNH 1: Bắn mục tiêu đang di chuyển

Case_Study_1.gif


Trong phần lớn báo cáo về xác nhận chúng đạn, chúng tôi thấy rằng mục tiêu mà đạn bắn tới đang chạy. Giờ ta sẽ đi sâu hơn vào phần hình ảnh hiển thị khi viên đạn bắn trúng một mục tiêu đang chạy. Chúng ta thấy rằng người chơi đã bắn headshot thành công vào đối thủ đang chạy. Để mô tả dễ dàng hơn về vấn đề này trong ví dụ đưa ra, client hiện đang chạy 60 khung hình một giây. Bạn có thể thấy rằng trong khung hình trước khi đường hiển thị vệt đạn bắn xuất hiện, tâm ngắm đang đặt vào đầu của đối thủ.

case-study-1_frame-1.jpgcase-study-1_frame-2.jpg

Tuy nhiên, khung hình lúc đường hiển thị vệt đạn bắn xuất hiện, điều đó không còn đúng nữa.

case_study_1_part_2.gif

Đoạn video ngắn thứ hai cho thấy tình huống tương tự, nhưng viên đạn bắn ra chỉ lệch mục tiêu có một chút thôi. Khi bạn xem từng khung hình của video, bạn có thể thấy kết quả ngược lại mới đúng: tâm của súng lệch khỏi đầu vào khung hình trước đường hiển thị vệt đạn bắn, nhưng đặt trúng đầu vào khung hình đường hiển thị vệt đạn bắn. Khi nhìn qua, bạn có thể sẽ chỉ vào khung hình có đường hiển thị vệt đạn bắn và nói rằng "Thấy chưa, rõ ràng là headshot mà!" Khi xem xét video hay những đoạn phát lại, chúng tôi thực sự cần phải nhìn vào khung hình trước khi đường hiển thị vệt đạn bắn xuất hiện để có thể lấy được hình ảnh chính xác của thời điểm viên đạn được bắn ra.

case-study-1_part2_frame-1.jpgcase-study-1_part2_frame-2.jpg
case-study-1_part2_no-hit-vfx.jpg

Hãy quay lại ví dụ khi viên đạn bắn trúng mục tiêu và theo dõi khung hình mà hiệu ứng hình ảnh trúng đạn được kết xuất. Có một khoảng trống rõ ràng giữa vị trí hiện tại của người chơi và vị trí của hiệu ứng hình ảnh trúng đạn bởi thời gian trì hoãn do độ trễ mạng gây ra. Điều này có thể khiến bạn nhầm lẫn khi cố tìm hiểu điều gì đã điều gì đã xảy ra với viên đạn của mình, vì khả năng cao là bạn sẽ tập trung vào vị trí hiện tại của đối thủ, không phải vị trí của họ vào thời điểm bắn đạn. Điều này cũng có thể gây nhầm lẫn trong những tình huống ngồi/đảo hướng (mà chúng ta có thể theo dõi trong Ví Dụ Thực Tế Điển Hình 2).

case-study-1_part2_frame-where-hit-vfx-rendered.jpg

Ví dụ thực tế điển hình này chỉ ra độ thiếu rõ ràng của hệ thống xác nhận trúng đạn hiện tại. Lý tưởng nhất thì bạn sẽ không cần phải hiểu rõ tất cả những thông tin nền này để có thể nhận biết tình huống một cách chính xác. Là nhà phát triển, chúng tôi ghi nhận điều này và đang khảo sát những phương pháp để cải thiện độ rõ ràng trong những trường hợp như vậy.

VÍ DỤ THỰC TẾ ĐIỂN HÌNH 2: Hiệu ứng hình ảnh ngồi và bị bắn

Bạn vừa bước vào một cuộc đấu súng ở tầm xa. Do không phán đoán rõ ràng, bạn giữ chuột trái và sấy súng. Thế nào cũng phải có một viên headshot nhỉ? Nhưng không, bạn cầm khẩu Vandal bắn trúng 3 viên vào người, gây 117 sát thương, trước khi ăn một viên headshot đáp trả.

Vì tức giận nên bạn xem lại đoạn ghi hình sau trận đấu, chắc chắn rằng lý do là vì xác nhận trúng đạn tệ. Bạn thấy đối thủ liên tiếp nhấn nút ngồi để né đạn của bạn. Và bạn ngạc nhiên khi thấy hiệu ứng hình ảnh trúng đạn xuất hiện trên đầu của người chơi đang ngồi. Nhưng báo cáo giao tranh của bạn thì chỉ hiển thị bắn trúng người! Tại sao lại như vậy??

Đây là đường dẫn đến bài viết có thật trên reddit có tựa đề “Không ghi nhận headshot khi người chơi ngồi” liên quan đến tình huống giả định này.

Khi đội ngũ của chúng tôi điều tra báo cáo về xác nhận trúng đạn tệ, những tình huống như trên là một trong những nguyên nhân thường gặp nhất đối với vấn đề có vẻ là xác nhận trúng đạn không chính xác. Thực tế thì xác nhận trúng đạn vẫn hoạt động đúng—đạn được bắn vào vị trí mà bạn ngắm bắn (bỏ qua lỗi di chuyển hay giãn hồng tâm) khi bạn nhấn nút bắn, và viên đạn đó được xác nhận chính xác ở trên máy chủ

Tuy nhiên, có một số yếu tố khiến cho trường hợp cụ thể này gây nhầm lẫn về mặt hình ảnh:

  1. Hiệu ứng hình ảnh trúng đạn bị trì hoãn do độ trễ mạng
  2. Hiệu ứng hình ảnh trúng đạn được hiển thị ở vị trí đạn bắn vào ban đầu
  3. Mục tiêu đang di chuyển (và thường là đang ngồi)
Case_Study_2.gif

Một ví dụ khác, giả sử có một người chơi với 50 ping. Người chơi này bắn trúng vai của đối thủ. Vì chúng tôi cần phải đợi máy chủ xác nhận trúng đạn, 100 mili giây sau hiệu ứng hình ảnh trúng đạn mới bắt đầu hiển thị trên vị trí bắn trúng người. Nhưng trong 100 mili giây đó, đối thủ đã bắt đầu ngồi, di chuyển đầu của họ ra ngay phía sau hiệu ứng hình ảnh trúng đạn mới được tạo ra. Ở tầm xa và khi đang đấu súng căng thẳng, bạn có thể nhầm lẫn giữa hiệu ứng hình ảnh trúng người và hiệu ứng hình ảnh trúng đầu.

case-study-2_cursor-on-body.jpg case-study-2_hit-VFX-on-body-correctly.jpg case-study-2_player-crouches-into-vfx.jpg

Điều này đặc biệt nghiêm trọng trong bản cập nhật beta 0.50 khi hiệu ứng máu vô tình bị vô hiệu hóa đối với tất cả người chơi, và hiệu ứng hình ảnh tia lửa không có đủ độ rõ ràng trong việc phân biệt giữa hiệu ứng hình ảnh trúng đầu và trúng người. Chúng tôi luôn có những hiệu ứng hình ảnh riêng để biểu thị bắn trúng người và headshot, nhưng chúng tôi nhận ra rằng những hiệu ứng này không phải lúc nào cũng được nhìn thấy rõ ràng trong giao tranh.

Đây là thất bại về độ rõ ràng của xác nhận trúng đạn và chúng tôi đang tích cực cải thiện. Một trong những điều mà chúng tôi đang thử nghiệm là liên kết hiệu ứng hình ảnh với phần cơ thể của nhân vật bị trúng đạn, để người chơi có thể thấy rõ sự liên quan—kể cả khi độ trễ cao.

Ảnh so sánh hiệu ứng hình ảnh trúng headshot so với hiệu ứng hình ảnh trúng người hiện tại:

headshot-VFX.jpgbody-shot-VFX.jpg

CẢI THIỆN ĐỘ RÕ RÀNG ĐÃ ĐƯỢC LÊN KẾ HOẠCH

Hai ví dụ thực tế điển hình làm nổi bật những mặt còn thiếu sót của hiệu ứng hình ảnh xác nhận trúng đạn hiện tại. Một trong những thay đổi mà chúng tôi đang thử nghiệm là hiển thị hiệu ứng tia lửa và máu ở vị trí hiện tại của nhân vật, tùy theo phần nào trên người bị bắn, và chuyển động theo nhân vật. Điều này khiến cho độ rõ ràng được tăng cường rõ rệt trong những tình huống đối thủ ngồi như ví dụ thực tế điển hình 2, vì hiệu ứng hình ảnh sẽ chuyển động cùng với cử động cơ thể của họ.

Một sự đánh đổi đối với cách tiếp cận này là hiệu ứng hình ảnh xác nhận trúng đạn có thể bị che khuất khi chuyển động cùng với nhân vật. Giả sử có một trường hợp người chơi với 100 mili giây ping bắn người chơi đang lấp ló ở góc tường. Nếu họ bắn trúng đối thủ và đối thủ ngay lập tức di chuyển lại vào chỗ che chắn trước khi xác nhận trúng đạn được trả lại từ máy chủ, người bắn có thể sẽ không nhìn thấy được hiệu ứng xác nhận trúng đạn xuất hiện.

Để giảm nhẹ vấn đề này, chúng tôi đã cân nhắc về việc thêm vào nhiều hiệu ứng hạt, một số theo sát nhân vật và một số khác xuất hiện ngay lập tức ở vị trí trúng đạn, dựa trên mô phỏng của client. Tuy nhiên, điều này có thể gây ra nhầm lẫn nếu mô phỏng giữa client và server không đồng thuận về đích đến của một viên đạn được bắn ra: Các hiệu ứng cần phải thể hiện rõ ràng để người chơi có thể dễ dàng thấy được đích đến của một viên đạn bắn ra.

Chúng tôi sẽ tiếp tục thử nghiệm điều này cùng những cải tiến khác đối với độ rõ ràng và mong rằng sẽ có thể sớm chia sẻ những cập nhật về độ rõ ràng trong bản cập nhật sắp tới.

HÃY TIẾP TỤC GỬI VIDEO

Mong rằng bài viết này đã giúp bạn hiểu rõ hơn về cách hoạt động của hệ thống xác nhận trúng đạn trong VALORANT và cách những viên đạn được xử lý ra sao. Hãy tiếp tục gửi video cho chúng tôi mỗi khi bạn nghĩ xác nhận trúng đạn hoạt động sai, chúng tôi sẽ cố gắng hết sức để kiểm tra tất cả các báo cáo.

Kể cả khi không có vấn đề gì, điều này cũng giúp chúng tôi tìm ra những lỗi về độ chính xác của xác nhận trúng đạn nhanh hơn là khi chúng thực sự xảy ra (tôi cũng giật thót tim mỗi lần thấy cụm từ "Xác Nhận Trúng Đạn" xuất hiện trong một bài đăng được đánh giá hàng đầu trên reddit).

Đường dẫn ví dụ của lỗi về độ chính xác của xác nhận trúng đạn qua reddit.

0