Trong game bắn súng, đường đạn được mô phỏng như thế nào?

Thảo luận trong 'Công nghệ' bắt đầu bởi peacewalker215@yahoo.com, 11/7/20.

  1. Trong game bắn súng, đường đạn được mô phỏng như thế nào?

    Trong game bắn súng, đường đạn được mô phỏng như thế nào?

    LIÊN HỆ (274 Đọc / 0 Thích / 0 Bình luận)
    1. Thông tin chủ đề
    2. Tỉnh/TP: Toàn quốc
    3. Tình trạng hàng: N/A
    4. Nhu cầu: N/A
    1. Thông tin người đăng
    2. Tài khoản: peacewalker215@yahoo.com
    3. Ngày đăng: 11/7/20 lúc 11:26
    4. Số điện thoại:
  2. G

  3. FastEhome.com- Đăng kí mở Shop bán hàng miễn phí no-spam Về cơ bản trò chơi điện tử là một gói dữ liệu khổng lồ chứa mô hình vật thể và những dòng thuật toán mô phỏng đời thật cũng như ra lệnh cho từng mô hình cư xử theo cốt truyện định sẵn để đánh lừa anh em chơi game. Lấy ví dụ trong game bắn súng, các nhà phát triển sẽ phải gõ ra những dòng code để mô phỏng những món vũ khí, trang bị trong quá trình sử dụng. Vậy trong game bắn súng, làm thế nào game biết anh em đã bắn trúng đối thủ?
    Về cơ bản có hai cách để ghi nhận đường đạn trong game bắn súng, là hitscan và mô phỏng đạn đạo. Hitscan đơn giản hơn, xoay tâm và click chuột đúng lúc vào người đối thủ là game ghi nhận bắn trúng. Còn đối với mô phỏng đạn đạo (projectile ballistic), mỗi phát súng sẽ được CPU trong máy tính hay máy chơi game của anh em tính toán cụ thể tác động từ môi trường, từ hiệu ứng vật lý và những khả năng khác, thậm chí đôi khi là cả trọng lực của mặt đất trước khi xác định xem phát súng đó có trúng mục tiêu hay không.

    Hitscan


    Những ngày đầu của ngành phát triển game, rất nhiều trò chơi sử dụng một kỹ thuật gọi là raycasting, biến môi trường 2D trở thành bản đồ 2D góc nhìn từ trên xuống. Kỹ thuật này cho phép các nhà làm game xác định vật thể đầu tiên “đường ray” chạm vào, có thể tạm coi như vật thể gần nhất mà góc nhìn của người chơi nhìn thấy trong thế giới ảo. Đến lúc đấy các nhà làm game mới bắt đầu đưa ra câu hỏi, nếu áp dụng raycasting để xác định đường đạn trong game bắn súng thì sao? Với ý tưởng đó, hitscan ra đời.
    [​IMG]

    Trong hầu hết những game bắn súng sử dụng cơ chế hitscan để mô phỏng đường đạn, engine mô phỏng vật lý của game sẽ làm ba nhiệm vụ chính theo các bước sau:
    1. Xác định hướng vũ khí đang nhắm tới
    2. Tạo ra một đường ray 2D từ vị trí ngắm đến điểm đích được xác định sẵn, tạm gọi là điểm A đến điểm B
    3. Sử dụng raycasting để xác định xem đường ray này có đi qua vật thể trong màn chơi hay không



    [​IMG]

    Sau bước thứ 3, nếu đường đi của viên đạn từ điểm A đến điểm B có đi qua vật thể, engine vật lý sẽ gửi thông báo cho mã nguồn của game rằng viên đạn đã bắn trúng mục tiêu. Khi ấy những dòng code khác sẽ xác định vị trí viên đạn chạm đích như tay, chân, bụng, ngực hay đầu, rồi từ đó xác định sát thương mà phát súng ấy gây ra, từ đó hiển thị chính xác trên màn hình khi chơi game. Về cơ bản Hitscan rất đơn giản dễ hiểu, nhưng chỉ cần vài thay đổi trong thuật toán và cách mỗi món vũ khí hoạt động, nó trở nên đa dạng hơn nhiều. Lấy ví dụ đường raycasting từ vị trí ngắm đến điểm đích đủ xa sẽ hỗ trợ được nhiều thứ như:
    1. Một phát súng có thể trúng nhiều mục tiêu trong một đường thẳng, như khẩu railgun trong Quake
    2. Xóa điểm đích để tạo ra những món vũ khí laser với tầm bắn rất xa
    3. Lập trình những bề mặt phản xạ có thể khiến đạn bị dội ngược lại, như skill phản xạ của Genji trong Overwatch



    [​IMG]

    Ưu thế của raycasting là vì sự đơn giản của thuật toán, nó được CPU xử lý rất nhanh, không cần vẽ ra thuật toán mới sử dụng bộ nhớ và khả năng tính toán của chip xử lý để mô phỏng viên đạn, vốn là một vật thể cần mô phỏng vật lý độc lập. Nhưng điều này cũng đồng nghĩa với việc, trong những game bắn súng online sử dụng cơ chế hitscan để xác định mục tiêu có bị bắn trúng hay chưa, kỹ sư phát triển netcode cũng không mất quá nhiều thời gian để giữ tất cả client có mặt trong cùng một trận đấu đồng bộ hóa thời gian với nhau. Độ giật của súng thì đơn giản hơn nhiều, cứ tạo ra một đường spray pattern cố định rồi bắt vũ khí vận hành theo code có sẵn là xong.
    Chính vì sự đơn giản của nó nên hầu hết những game bắn súng đầu tiên đều dùng kỹ thuật hitscan để mô phỏng đường đạn, như Wolfenstein 3D, Doom chẳng hạn. Nhưng hiện giờ vẫn còn những game sử dụng hitscan để mô phỏng đường đạn như vài nhân vật trong Overwatch (Soldier 76, McCree hay Widowmaker) hay hầu hết các bản Call of Duty.

    Vì nó quá đơn giản nên cũng tạo ra những yếu điểm về tính chân thực trong mỗi tựa game. Thứ nhất, đường ray khi thực hiện raycasting có tốc độ gần như dương vô cùng, đồng nghĩa với việc bóp cò là đạn đã trúng mục tiêu. Ngoài đời thật đâu có như vậy, khi đạn bay với vận tốc âm thanh hoặc hơn (mỗi loại đạn có tốc độ đạn đạo khác nhau, trên tốc độ âm thanh là super sonic, dưới là sub sonic, cái này xứng đáng có 1 bài viết riêng), rất chậm nếu so với vận tốc ánh sáng khi CPU xử lý raycasting. Ngay cả khi đối thủ đứng ở vị trí rất xa, hitscan chính xác trong tích tắc khiến việc né đạn gần như là không thể xảy ra nếu người chơi ngắm trúng và click chuột đúng thời điểm.
    [​IMG]

    Yếu điểm thứ hai của hitscan về tính chân thực là đường raycasting thường thẳng băng, nghĩa là không thể mô phỏng thêm những hiệu ứng khác tác động lên viên đạn như gió, trọng lực và những yếu tố khác một khi viên đạn rời khỏi nòng súng. Lập trình viên có thể thêm thắt vài dòng code và mô phỏng chuyển động của vũ khí bị giật khi bắn, nhưng một khi đạn ra khỏi nòng, gần như không có cách nào thay đổi đường đi của viên đạn vì bản chất của kỹ thuật hitscan.
    Vì thế, khi muốn tạo ra một tựa game bắn súng có phần chân thực, những nhà làm game hiện đại thường lựa chọn cách thứ hai để mô phỏng đường đi của viên đạn.

    Mô phỏng đạn đạo (projectile ballistics)


    Nghe có vẻ phức tạp và khó hiểu, nhưng kỳ thực ý tưởng của cách mô phỏng đạn đạo trong game rất đơn giản, khi nổ súng, game sẽ tạo ra một viên đạn, coi nó là một vật thể tuân thủ quy tắc vật lý trong môi trường thế giới ảo. Viên đạn đó có trọng lượng, có vận tốc và hitbox riêng, engine của game sẽ phải theo dõi và tính toán vật thể này.
    [​IMG]

    Lợi thế lớn nhất của mô phỏng đạn đạo là sự chân thực, vốn được rất nhiều game đề cao. Vì mỗi viên đạn tồn tại độc lập, các nhà làm game khi ấy có thể thêm vào những thông số riêng ảnh hưởng đến đường đi của nó, như gió, ma sát không khí, trọng lực, nhiệt độ, tất cả những thông số ảnh hưởng đến viên đạn thật ở ngoài đời khi nó được bắn đi. Cũng nhờ việc có thể thay đổi quy tắc vật lý trong thế giới ảo, nên người chơi lúc này có thể dùng những món trang bị khác như lựu đạn hay súng cối phóng tên lửa.
    Với hệ thống mô phỏng đạn đạo, viên đạn sẽ không di chuyển với vận tốc ánh sáng như hitscan, nên các nhà phát triển cũng có thể mô phỏng những tính năng rất hay như:

    1. Bullet-time làm chậm thời gian như trong Max Payne, Sniper Elite hay Superhot
    2. Ghi nhận thời gian một viên đạn di chuyển, ví dụ như trong Battlefield, hạ gục mục tiêu từ xa còn phải cân nhắc cả yếu tố trọng lực để ngắm lên cao hơn so với mục tiêu, hay trong Sniper Elite còn phải tính cả gió nữa.
    3. Những món trang bị như lựu đạn có thể tính giờ kích nổ



    Projectile ballistics phức tạp hơn nhiều so với hitscan, nên máy tính và máy chủ cũng phải làm việc nhiều hơn. CPU sẽ phải tính toán cả những yếu tố tác động lên viên đạn, còn máy chủ của game online thì phải xử lý để tất cả người chơi cùng đồng bộ hóa thời gian với nhau, tất cả những bất đồng về logic của thuật toán sẽ phải được xử lý để không tạo ra sai khác trong quá trình hàng chục người chơi trong cùng một máy chủ.
    Có vài cách để tối ưu khả năng xử lý projectile ballistics, qua đó cho phép game xử lý những pha đấu súng hiệu quả nhất, thậm chí chân thực tới mức cả hai tay súng đều bị hạ gục từ đạn của nhau thay vì một bên ngừng bắn sau khi game xác định nhân vật đã hết máu. Nhưng mô phỏng ngần ấy viên đạn sẽ rất tốn tài nguyên xử lý. Một cách đơn giản khi tối ưu engine game là tạo ra một ổ dữ liệu con, tải trước khi bắt đầu chơi để mô phỏng từng loại đạn có trong game. Một khi viên đạn chạm mục tiêu (đối thủ hoặc bắn vào tường), ổ dữ liệu này sẽ ngừng theo dõi và mô phỏng đường đi của viên đạn đó, tiết kiệm tài nguyên xử lý cho viên đạn kế tiếp, về cơ bản là nó biến mất, không còn giá trị sử dụng trong màn chơi nữa.

    Đến lúc này, khái niệm “tick” được vận dụng vào game. Lấy ví dụ máy chủ Call of Duty vận hành ở tốc độ 20 tick, máy chủ CS:GO matchmaking là 64 tick, Valorant là 128 tick một giây, mỗi tick ghi nhận 1 chuyển động của nhân vật và đường đạn khi chơi game. Dĩ nhiên thông số tick càng cao thì máy chủ ghi nhận được nhiều chuyển động và thay đổi, từ đó mô tả thế giới ảo chính xác hơn.

    - Tick được đo độc lập với thuật toán render đồ họa game, đồng nghĩa với việc khi chơi game bắn súng, những pha đấu sẽ được mô tả chính xác hơn vì vật thể được đo độc lập với tốc độ truyền hình ảnh từ máy tính lên màn hình. Tick càng cao, thì thuật toán càng phức tạp vì phải đo được độ trễ từ khung hình đã render trước đó là bao nhiêu mili giây.
    - Mỗi khung hình của game cũng được đo đạc thông số tick, áp dụng thuật toán vật lý cho từng khung hình. Nếu anh em bật chế độ khóa khung hình hoặc máy tính không tải nổi game nặng, thuật toán sẽ sai lệch dẫn đến khựng giật khi bắn súng.


    Đấy cũng là lúc những lỗi của game diễn ra khi anh em tưởng rằng mình đã bắn trúng địch rồi nhưng vì tốc độ khung hình và tốc độ tick sai lệch dẫn đến việc máy chủ ghi nhận anh em bắn trượt. Cái này ai chơi CS:GO chắc cũng gặp vài lần.

    [​IMG]

    Nghe phức tạp như vậy, anh em có thể nghĩ projectile ballistics là một khái niệm mới chỉ tồn tại trong vòng khoảng hơn 2 chục năm gần đây đối với các nhà phát triển game. Kỳ thực không phải như vậy, vì ý tưởng mô phỏng đạn đạo thậm chí còn tồn tại trước cả hitscan nữa cơ! Những game bắn súng góc nhìn từ trên cao đầu tiên như Asteroids, Space Invaders hay Galaxian đều mô phỏng được đường đạn bay tà tà đến mục tiêu, mà đó đều là những trò chơi xuất hiện từ những năm 70 của thế kỷ trước, rất lâu rồi!
    Hệ thống hybrid


    Vậy có cách nào mô phỏng đường đạn trong game bắn súng theo cả hai cách kể trên không? Câu trả lời là có. Tuyệt đại đa số những game bắn súng hiện giờ đều hỗ trợ mô phỏng đường đạn theo cả hai cách mà mình đã đề cập ở trên, như Halo, GTA, Half-Life, mỗi món vũ khí lại vận hành theo cách riêng. Lấy ví dụ trong Halo, khẩu Assault Rifle sử dụng hitscan, còn khẩu Needler phải mô phỏng đạn đạo:
    [​IMG] [​IMG]

    Các nhà phát triển game cũng có thể pha trộn cả hai kỹ thuật mô phỏng đường đạn để giảm thiểu khuyết điểm của mỗi kỹ thuật, từ đó tạo ra trải nghiệm chân thực hơn trong game. Ví dụ để tránh tình trạng ngắm trúng nhưng bắn trượt vì lệch tick, mỗi viên đạn được mô phỏng projectile ballistics sẽ tự vẽ đường ray để thực hiện kỹ thuật hitscan mỗi tick, thậm chí cách này còn có thể tính toán được nếu hai viên đạn va chạm vào nhau trong quá trình bay nữa cơ.
    Cũng với hệ thống hybrid, nhiều tính năng hay ho trong game cũng được tạo ra. Một ví dụ đáng đè cập chính là Sniper Elite. Sau khi bóp cò súng, engine game dùng hitscan để xác định xem liệu rằng nó có trúng đích hay không. Nếu trúng, hiệu ứng làm chậm thời gian được anh em rất thích sẽ dược kích hoạt.

    [​IMG]

    Với những gì làm được, chắc chắn cả hai cách mô phỏng đường đạn này sẽ còn được áp dụng trong thời gian dài sau này, nhưng cùng lúc các hãng game cũng sẽ tạo ra được những cải tiến nho nhỏ trong từng kỹ thuật để khiến game trở nên chân thực hơn, ví dụ như tăng thông số tick mỗi giây khi CPU càng lúc càng khỏe để ghi nhận đường đạn chính xác hơn chẳng hạn.
     

    Bình Luận Bằng Facebook

Chia sẻ trang này