Làm thế nào để có được các khối mà người chơi nhìn thấy?


15

Tôi đang viết một trò chơi giống Minecraft bằng công cụ Ogre và tôi gặp vấn đề. Tôi phải tối ưu hóa trò chơi của mình, vì khi tôi thử vẽ 10000 khối, tôi có 2 FPS ... Vì vậy, tôi có ý tưởng rằng các khối hiển thị của máy bay và để ẩn các khối vô hình. Nhưng tôi có một vấn đề - làm thế nào để tôi biết những khối nào tại thời điểm mà người chơi có thể nhìn thấy?

Và - nếu bạn biết các phương pháp tối ưu hóa khác cho một trò chơi như vậy, hãy viết những gì và làm thế nào để sử dụng chúng trong Ogre.

Câu trả lời:


16

Chà, Ogre đã thực hiện việc loại bỏ sự bực bội (về cơ bản là không rút ra được bất cứ thứ gì không thể nhìn thấy từ máy ảnh) nhưng tôi nghĩ vấn đề của bạn là một vấn đề khác.

Bạn không nên thực sự hiển thị 10000 khối, những gì thường được thực hiện (hoặc ít nhất, trong một số minecraft dựa trên Ogre3d giống như bản sao tôi đã thấy (trong đó tôi cũng đang tạo một khối) và trong bản gốc) đang tạo lưới ( của một số vùng NxNxN của khối) có mặt ngoài của các hình khối được hiển thị. Đó là, khi bạn đặt 2 hình khối cạnh nhau, không thể nhìn thấy 2 khuôn mặt chạm nhau và do đó không cần phải vẽ.

Những khuôn mặt này cũng nên được vẽ trong một cái gì đó như thế này: http://www.ogre3d.org/tikiwiki/tiki-index.php?page=DocateGrowingBuffers vì các thẻ video hiện đại thích một lưới 100000 đa giác so với 1000 lưới 100 đa giác.


10

Có một vài khía cạnh của vấn đề này. Đầu tiên, bạn vẽ 10000 khối của mình như thế nào? Bạn có thực sự vẽ chúng như 10000 đối tượng riêng biệt? Nếu vậy thì đây gần như chắc chắn là cổ chai của bạn, không phải là sự loại bỏ tắc nghẽn. Bạn nên nhóm các khối này thành một số lượng lưới nhỏ hơn (có thể là vài nghìn mỗi lưới) để giảm các cuộc gọi rút thăm.

Đối với câu hỏi thực tế của bạn, có ba loại loại bỏ tắc mà mùa xuân đến tâm trí.

1) Khối bên ngoài xem bực bội. Điều này có nghĩa là các khối phía sau bạn hoặc hai bên. Ogre đã loại bỏ những thứ này thông qua việc loại bỏ sự thất vọng.

2) Các khối 'ngầm' hoặc được bao quanh hoàn toàn bởi các khối khác để chúng không bao giờ có thể được nhìn thấy từ mọi góc độ. Bạn có thể xác định những điều này bằng cách nhìn vào các khối lân cận siz. Nếu tất cả đều rắn, khối của bạn bị ẩn. GPU thậm chí không bao giờ nên nghe về các khối này - chúng nên được bỏ qua khi bạn xây dựng lưới đại diện cho bề mặt của bạn.

3) Các khối nằm trên bề mặt và có thể được nhìn thấy từ một số vị trí trong cấp độ, nhưng hiện đang bị ẩn bởi một ngọn đồi (hoặc một cái gì đó). Đây là trường hợp khó nhất mà tôi chưa tự giải quyết, nhưng rất có thể các truy vấn tắc phần cứng có thể được sử dụng cho trường hợp này.

Đó là một phích cắm không biết xấu hổ, nhưng tôi có một thư viện khá trưởng thành mà nhiều người đang sử dụng để phát triển bản sao Minecraft, bao gồm cả một số sử dụng Ogre. Bạn xác định nội dung của âm lượng và nó tạo ra lưới bề mặt mà sau đó bạn có thể kết xuất. Đây là trang chủ:

http://www.thermite3d.org/

Và đây là video về dự án của người khác đang sử dụng nó:

http://www.youtube.com/watch?v=Jju6WRPEK7o


4

Bạn có thể sử dụng loại bỏ backface để loại bỏ các đỉnh và các pixel liên quan của chúng mà không phải đối mặt với trình phát. Độ sâu đệm nên chăm sóc phần còn lại. Các khối 10k thực sự không nhiều, 5770 của tôi có thể hiển thị 100 nghìn câu ở tốc độ 1500fps. Tôi nghĩ rằng bạn đang làm một cái gì đó khá sai.


Tôi đồng ý. Đây là vấn đề có thể xảy ra với bất cứ điều gì khác.
Notabene

1

Nếu bạn có 10000 đối tượng riêng biệt, nút cổ chai có thể là số nguyên thủy, không phải là đỉnh, đa giác hoặc điền. Nướng các đối tượng của bạn thành số lượng nhỏ hơn các đối tượng đa giác cao hơn cho tốc độ.

Minecraft có một khái niệm về các khối hình khối, nhưng tôi không thể tìm thấy tài liệu tham khảo tại thời điểm này.

Đây cũng là thí nghiệm của tôi về việc vẽ hàng tấn hình khối với các kỹ thuật khác nhau. Không bao gồm nướng (chưa).


0

Những gì tôi làm, là sau khi tôi tạo mảng khối của mình, nhưng trước khi tôi tạo các đỉnh, tôi chạy một phụ có tên là UpdateBlockVisiblility.

Sub chỉ đơn giản là kiểm tra các hàng xóm vào khối và cập nhật boolean khối có thể chia được cho phù hợp.

#define BLOCKFACE_NORTH 0

#define BLOCKFACE_SOUTH 1 

etc etc etc

if(IsBlockAt(NorthOfBlock))
  Blocks[Whatever].facevisible[BLOCKFACE_NORTH] = false;

Sau đó, tôi chỉ tạo các đỉnh cho khuôn mặt nếu nó được nhìn thấy! Đơn giản :)

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.