Làm thế nào để các công cụ trò chơi thương mại tổ chức bộ đệm chỉ mục / đỉnh?


8

Lời nói đầu: Câu hỏi này sẽ đến từ quan điểm Direct3D, bởi vì đó là những gì tôi quen thuộc.

Rõ ràng là chúng ta phải chịu một chi phí nhỏ mỗi khi chúng ta thay đổi bộ đệm đỉnh hoặc chỉ mục trong Direct3D (nghĩa là với IASetIndexBuffer ). Nhưng tôi cho rằng nếu chúng ta phân bổ một bộ đệm chỉ mục / đỉnh khổng lồ thì cuối cùng chúng ta sẽ phải quản lý bộ nhớ và kết thúc bằng một vấn đề phân mảnh (hoặc tạm dừng trong khi chúng ta trao đổi tất cả dữ liệu xung quanh).

Vậy làm thế nào để động cơ thương mại tải / dỡ dữ liệu? Tôi đang nghiêng về cách tiếp cận dựa trên 'gói', do đó, một 'gói' các mô hình có bộ đệm đỉnh / chỉ mục riêng mà chúng ta có thể tải / dỡ tải vì gói không còn cần thiết nữa; và sau đó cố gắng vẽ tất cả các trường hợp từ cùng một gói.

Nhưng tôi rất muốn nghe cách xử lý được chấp nhận / tiêu chuẩn này là gì?


1
Đây là một câu hỏi hay và nó cũng áp dụng cho OpenGL.
glampert

Câu trả lời:


13

Có một số kỹ thuật khác nhau để tổ chức dữ liệu và nhiều trò chơi sử dụng kết hợp chúng.

Đối với hình học tĩnh, tốt nhất là có ít IB và VB riêng lẻ hơn.

Các trò chơi truyền thống dựa trên 'cấp độ', có nghĩa là tài sản cho một phần chơi được tải và sau đó trò chơi bắt đầu. Để giảm thiểu thời gian tải, thông tin được tổ chức lý tưởng để hỗ trợ điều này (tức là tải mọi thứ cho cấp độ nhanh nhất có thể mà không cần tìm kiếm trên phương tiện / đĩa), có thể sao chép thông tin giữa các cấp. Theo cách tiếp cận này, một sơ đồ là có một VB và IB lớn cho một mô hình hoặc một loạt các mô hình, sau đó gửi các tập con từ đó để vẽ.

Đối với thế hệ Xbox 360 / PS 3, dung lượng RAM khá nhỏ so với kích thước của các trò chơi, do đó, các công cụ đã được định hướng 'truyền phát', nghĩa là chúng tải nội dung một cách linh hoạt khi người chơi di chuyển qua chúng. Đây cũng được gọi là phương pháp 'thế giới mở'. Trong phương pháp này, thách thức là 'phân chia' hình học thành các bit bạn có thể tải dựa trên các gợi ý về không gian. Một thách thức khác đặc biệt đối với các nền tảng 32 bit là đảm bảo rằng bộ nhớ không bị phân mảnh (hoặc thậm chí phân mảnh không gian địa chỉ ảo) trong một khoảng thời gian dài - các trò chơi dựa trên cấp độ thường đặt lại bộ nhớ giữa các cấp, điều mà các công cụ phát trực tuyến không thể làm được càng dễ dàng Do đó, đóng gói thành một kích thước cố định hoặc tập hợp các kích thước cố định cho các IB / VB được phân bổ và tái sử dụng như một nhóm là hữu ích.

Đối với thế hệ Xbox One / PS 4, có rất nhiều RAM để hoạt động so với các máy chơi game trước đó và rất nhiều lõi bổ sung, vì vậy nhiều trò chơi đang tích cực nén tài sản của họ và sau đó sử dụng lõi CPU "phụ" để giải nén chúng trong lý lịch. Với không gian địa chỉ ảo 64 bit, ít có mối quan tâm về sự phân mảnh không gian địa chỉ ảo. Cách tiếp cận này giữ thời gian tải thấp, đóng gói tài sản tốt để tải xuống kỹ thuật số và hỗ trợ kết xuất 'thế giới mở'. Ở đây phương pháp nhóm để quản lý IB / VB được sử dụng.

Ngoài ra còn có đệ trình hình học động thường được sử dụng cho các địa hình, mô hình biến dạng / phá hủy, v.v. Nó không hiệu quả về mặt băng thông bus GPU, vì vậy các trò chơi thường có sự kết hợp của cả hình học tĩnh và hình học động. Trong trường hợp này, mẫu cập nhật DISCARD Bản đồ Direct3D thường có nghĩa là bạn chỉ đang sử dụng một IB / VB duy nhất (hoặc cho các kịch bản kết xuất đa luồng, IB / VB kép mà bạn trao đổi điền / hiển thị từng khung).


Cảm ơn câu trả lời của bạn. Tôi có thể hỏi một số câu hỏi làm rõ? Mẫu DISCARD Bản đồ Direct3D là gì?
Xenoprimate

1
Mẫu được mô tả ở đây cho Direct3D 9 là Khóa DISCARD, nhưng mẫu đó được sử dụng với Direct3D 10.x / 11.x cũng như Map DISCARD cho các tài nguyên động. Bạn có thể xem một ví dụ về cách triển khai cho Direct3D 11 bằng cách xem lớp PrimitiveBatch của DirectX Tool Kit .
Chuck Walbourn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.