Dành cho game thủ – NVIDIA GeForce PhysX – Phần 2

Trong phần 1, chúng ta đã có dịp quan sát những điểm mạnh do công nghệ PhysX mang lại. Ở phần 2 này, tôi sẽ bàn chi tiết về mặt thuật toán do PhysX hỗ trợ đối với bài toán mô phỏng động học thể rắn trong game (rigid body dynamics).

Thật ra có rất nhiều dạng vật lý trong game, mà chúng ta có thể liệt kê những dạng chính gồm:
– Mô phỏng các nhân vật kiểu có khớp nối
– Mô phỏng xe cộ
– Mô phỏng vải vóc
– Mô phỏng các vật thể có thể biến đổi hình dạng
– Mô phỏng dòng chảy
– Mô phỏng động học thể rắn

Trong số các dạng mô phỏng vật lý kể trên, mô phỏng động học thể rắn giữ vai trò quan trọng nhất trong các trò chơi hiện đại. Cùng với mô phỏng các vật thể có thể biến đổi hình dạng (non-rigid or deformable body dynamics, như trong phần demo “Great Kulu” đã giới thiệu ở phần 1), nó tạo nên sự sinh động cho các đối tượng trong game, đặc biệt là động vật và các kiểu đồ đạc, hay cảnh có tác động của gió, bom đạn chẳng hạn.

Nói một cách dễ hiểu, mô phỏng động học thể rắn quan tâm đến cách thể hiện các đối tượng có hình dạng cố định di chuyển trong môi trường có trọng lực và tuân theo các qui luật chuyển động vật lý của Newton. Sơ đồ thực hiện việc mô phỏng này thông thường gồm có 3 bước:

Bước 1: Kết hợp (Integration)

  • Ở bước này vận tốc của các đối tượng sẽ được cập nhật dựa trên các lực vật lý được áp dụng trên chúng (bao gồm trọng lực, gió, sự tương tác tạo bởi người chơi).
  • Sau khi cập nhật vận tốc cho các đối tượng, vị trí mới của chúng cũng sẽ được cập nhật.

Bước 2: Dò đụng độ (Collision detection) 

  • Đây là bước tiêu tốn nhiều tài nguyên tính toán nhất trong toàn bộ sơ đồ mô phỏng.
  • Ở bước này, động cơ mô phỏng cần phải xác định xem những đối tượng nào có khả năng xảy ra đụng độ, dựa trên kết quả cập nhật đã thực hiện ở Bước 1. Thông tin đụng độ được cho bởi các điểm tiếp xúc giữa các đối tượng có đụng độ. Về nguyên tắc, việc xác định này đòi hỏi chúng ta phải tiến hành so sánh từng đối tượng có trong cảnh quan hiện tại của game với các đối tượng khác. Giả sử chúng ta có N đối tượng thì phí tổn cho tác vụ này là cỡ \mathbf{O(N^2)}, hết sức tốn kém về mặt tính toán. Trong thực tế, người ta chia bước này thành 2 bước con gọi là pha rộng và pha hẹp như sau:

Pha rộng: Chỉ so sánh biểu diễn đơn giản hóa của các đối tượng (kiểu hộp bao quanh chúng) để nhanh chóng xác định các cặp đối tượng có khả năng đụng độ.

Pha hẹp: Xác định chính xác những đối tượng thật sự đụng độ, để cho ra các thông tin như điểm tiếp xúc, vectơ chuẩn của mặt tiếp xúc, và độ xuyên sâu.

Bạn nào muốn tìm hiểu chi tiết hơn về bước này, có thể tham khảo bài báo sau.

P. M. Hubbard, “Collision detection for interactive graphics applications”, IEEE Transaction on Visualization and Computer Graphics, Vol. 1, N. 3, pp. 218-230, 1995.

Bước 3: Phân giải đụng độ (Collision resolution)

  • Ở bước này, chúng ta cần áp dụng các lực truyền tức thời (instant transitory forces) cho các cặp đối tượng có đụng độ đã dò ra ở Bước 2 để giúp chúng di chuyển rời nhau ra đúng theo các luật vật lý về va chạm và đàn hồi.

Để cài đặt cả 3 bước nêu trên, do những ràng buộc hết sức ngặt nghèo về yếu tố đáp ứng kiểu thời gian thực trong game, các hệ vật lý trong game cho đến nay đều thường là sử dụng các bộ giải (solver) kiểu lặp (cải tiến dần kết quả) thay vì chọn cài đặt bộ giải kiểu ma trận vốn rất phổ biến trong các công trình nghiên cứu lý thuyết. Bằng cách này, các hệ đó có thể điều chỉnh giữa độ chính xác – hiệu năng của hệ thống bằng cách thay đổi số lần lặp cần thiết.

Nhằm cải tiến hơn nữa các mô phỏng vật lý trong game, cách đây 3 năm (2005), Havok, một trong nhưng công ty hàng đầu về mô phỏng vật lý, đã quyết định tiến hành một nghiên cứu mới với mục tiêu giúp tạo ra các hệ mô phỏng mới có khả năng thể hiện hàng ngàn đối tượng thể rắn trên các bộ xử lý song song. Một trong những bộ xử lý được để ý đến chính là GPU, chip đồ họa thường có trong các máy tính của game thủ. Lý do chính cho sự chọn lựa này là các thuật toán thực hiện mô phỏng thường chiếm hơn 10% thời gian của CPU, do vậy nếu giao được phần việc nặng nề này cho GPU, CPU sẽ rảnh tay để phục vụ nhiều yêu cầu khác nữa trong một trò chơi kiểu mới. Ngoài ra, nếu việc tính toán mô phỏng được thực hiện từ GPU, chương trình sẽ không tốn thời gian chuyển dữ liệu về vị trí và hướng của hàng nghìn đến hàng triệu đối tượng từ CPU qua GPU để hiển thị lên màn hình. Kết quả tính toán giờ đây sẽ được lấy trực tiếp từ bộ nhớ đồ họa có trên GPU.

Kết quả của nghiên cứu tại Havok từ năm 2005 mà tôi vừa đề cập chính là Havok FX, một hệ thống mô phỏng lai, tận dụng tất cả các điểm mạnh của cả hai loại bộ xử lý là CPU và GPU. Các tác vụ trên Havok FX được phân chia giữa CPU và GPU như sau:

  • Trên GPU: Thực hiện việc lưu trữ trạng thái đầy đủ của các đối tượng (như vị trí, hướng, vận tốc tuyến tính và vận tốc quay) cùng với thông tin về hình dạng của chúng (được biểu diễn thông qua một kiểu texture do Havok tạo ra). Cách biểu diễn hình dạng này là mấu chốt cho việc xử lý các đụng độ kiểu lồi – lõm một cách hết sức nhanh chóng, dù là kém chính xác hơn so với các thuật toán dựa trên phép giao đa diện vô cùng tốn kém. Dựa trên các thông tin được lưu trữ hiệu quả này, GPU sẽ tiến hành thực hiện các bước kết hợp và dò đụng độ pha hẹp bằng một bộ dò Euler đơn giản với bước lặp có thời gian cố định.
  • Trên CPU: Thực hiện giai đoạn pha rộng trong bước dò đụng độ bằng cách
    Với mỗi hình (frame) của từng cảnh trong game: CPU đọc thông tin về các hộp bao canh theo trục của các đối tượng ở dạng nén từ GPU.
    CPU sau đó thực hiện các thuật toán so sánh đối tượng kiểu sắp xếp – quét đã được tối ưu hóa.
    CPU sẽ trả về cho GPU danh sách các cặp đối tượng có khả năng đụng độ.
    Việc trao đổi dữ liệu giữa CPU và GPU là khá nhỏ, chỉ vào khoảng vài trăm kí lô byte, nên với băng thông hiện tại (từ 2GB/giây đến 5GB/giây với giao diện PCI Express), bài toán cổ chai sẽ ít xảy ra.

Kết quả cài đặt cụ thể cho thấy, nếu chỉ với một CPU cỡ đơn lõi kiểu Intel 2.9GHz Core 2 Duo, tốc độ xử lý và hiển thị vào khoảng 6.2 hình/giây. Nếu dùng phiên bản lai với GPU là NVIDIA GeForce 8800 GTX, tốc độ đạt được vào khoảng 64.5 hình/giây (nhanh hơn khoảng 10 lần), mở rộng được cho các GPU thế hệ đi sau (như GTX 280 chẳng hạn), và còn có thể dùng nhiều GPU, một cho tính toán vật lý, và một dùng để hiển thị hình ảnh.

Bạn nào quan tâm đến việc thử nghiệm Havok FX trên máy PC của mình có thể download ở đây:

http://tryhavok.intel.com/

Nếu so sánh với kết quả cài đặt PhysX trên chip GeForce mới nhất của NVIDIA, chúng ta sẽ có bảng số liệu sau:

Kết quả th�� nghiệm NVIDIA PhysX từ HotHardware

Kết quả thử nghiệm NVIDIA PhysX từ HotHardware

 Nhìn vào bảng số liệu này, chúng ta có thể thấy điểm khác biệt về mặt phần cứng giữa chip Intel Core 2 Quad và NVIDIA GeForce GTX 280 là ở số lõi tính toán. Con số này trên GTX 280 lớn gấp 60 lần so với Core 2 Quad, phần nào giải thích được cho khả năng tính toán vượt trội của nó với 930 GFLOPS, gấp 10 lần so với CPU. Ngoài phần mô phỏng động học thể rắn đã đề cập ở trên, chúng ta cũng có thể quan sát thấy nhiều cải tiến quan trọng trong việc mô phỏng dòng chảy, mô phỏng các vật thể mềm, hay còn gọi là các vật thể có hình dạng thay đổi, và cả mô phỏng các chất liệu vải (ví dụ như vải bay trước gió, vải trước tác động của nhiều loại ngoại lực chẳng hạn).