Thu thập dữ liệu khuôn mặt Voxel (Đơn giản hóa lưới, có thể sử dụng tham lam)


9

Chỉnh sửa: Đây chỉ là kinh nghiệm học tập của riêng tôi, nó KHÔNG phải vì lý do hiệu suất mà tôi đặt câu hỏi này.

Điều này liên quan đến một động cơ địa hình giống như Minecraft. Tôi lưu trữ các khối trong khối (khối 16x256x16 trong một khối). Khi tôi tạo ra một đoạn, tôi sử dụng nhiều kỹ thuật thủ tục để đặt địa hình và đặt các đối tượng. Trong khi tạo, tôi giữ một mảng 1D cho toàn bộ khối (rắn hoặc không) và một mảng khối 1D riêng biệt.

Sau thế hệ, tôi lặp lại qua các khối rắn kiểm tra hàng xóm của họ để tôi chỉ tạo các mặt khối không có hàng xóm rắn. Tôi lưu trữ khuôn mặt nào sẽ tạo trong danh sách của riêng họ (đó là 6 danh sách, mỗi khuôn mặt có thể / bình thường). Khi kết xuất một đoạn, tôi kết xuất tất cả các danh sách trong đoạn hiện tại của máy ảnh và chỉ các danh sách đối diện với máy ảnh trong tất cả các đoạn khác. Tôi làm điều này bằng cách lưu trữ tất cả 6 danh sách trong một bộ đệm, sau đó tôi chỉ cần thay đổi phạm vi tôi vẽ.

Sử dụng một 2D atlas với này lừa shader chút Andrew Russell đề nghị, tôi muốn kết hợp khuôn mặt tương tự nhau hoàn toàn. Đó là, nếu chúng nằm trong cùng một danh sách (giống nhau bình thường), liền kề nhau, có cùng mức độ ánh sáng, v.v ... Tôi biết tôi vẫn sẽ kết thúc với hình chữ nhật, nhưng nó sẽ dễ dàng giảm 50% số đỉnh của tôi hoặc tốt hơn nếu ước tính của tôi là chính xác.

Giả định của tôi sẽ có mỗi danh sách trong số 6 danh sách được sắp xếp theo trục mà chúng nằm trên, sau đó theo hai trục còn lại (danh sách cho đỉnh của một khối sẽ được sắp xếp theo giá trị Y, sau đó là X, sau đó là Z).

Chỉ với điều này, tôi có thể dễ dàng hợp nhất các dải khuôn mặt, nhưng tôi đang tìm cách hợp nhất nhiều hơn là chỉ các dải với nhau khi có thể. Tôi đã đọc về thuật toán chia lưới tham lam này , nhưng tôi gặp nhiều khó khăn để hiểu nó.

Vì vậy, câu hỏi của tôi: Để thực hiện hợp nhất các khuôn mặt như được mô tả (bỏ qua liệu đó có phải là một ý tưởng tồi cho địa hình / ánh sáng động), có lẽ có một thuật toán đơn giản hơn để thực hiện không? Tôi cũng sẽ khá vui vẻ chấp nhận một câu trả lời đưa tôi qua thuật toán tham lam theo cách đơn giản hơn nhiều (một liên kết hoặc giải thích).

Tôi không ngại giảm hiệu suất một chút nếu nó dễ thực hiện hơn hoặc thậm chí nếu nó chỉ tốt hơn một chút so với chỉ thực hiện các dải. Tôi lo lắng rằng hầu hết các thuật toán tập trung vào hình tam giác chứ không phải hình tứ giác và sử dụng tập bản đồ 2D theo cách của tôi, tôi không biết rằng tôi có thể thực hiện một hình tam giác nào đó dựa trên các kỹ năng hiện tại của mình.

PS: Tôi đã cullull cull mỗi chunk và như được mô tả, tôi cũng cull mặt giữa các khối rắn. Tôi không tắc nghẽn cull chưa và có thể không bao giờ.

* Chỉnh sửa: Tôi đã thực hiện kỹ thuật nhỏ của riêng mình, có thể có tên, nhưng tôi chỉ cần xem qua 6 danh sách được sắp xếp theo các trục mà chúng nằm trên, theo sau là loại khối và sau đó là mức độ chiếu sáng. Tôi lặp lại qua chúng, tạo ra các hình chữ nhật mới khi tôi đi và phát triển chúng đồng thời (với sự thiên vị nặng nề đối với một trục nhất định). Nó chắc chắn là không tối ưu, nhưng nó thực sự khá nhanh và nó làm giảm trung bình đỉnh của tôi xuống gần 50%. Nhận xét của Byte56 là tủ quần áo tôi nghĩ đến một câu trả lời thực sự, nhưng tôi không thể chọn nó cho câu trả lời / tiền thưởng.

Đây là cách nhanh chóng và đơn giản của tôi Tôi đang xử lý vấn đề này SAU khi tạo ra địa hình ban đầu đầy đủ mà không có bất kỳ tối ưu hóa nào. Giả sử tất cả các hình vuông được đưa ra là cùng một hình ảnh, mức độ ánh sáng, bình thường, v.v. mỗi màu là một hình tứ giác khác nhau tôi sẽ đưa ra. Với danh sách của tôi được sắp xếp theo cách của họ, đây là một cách tiếp cận rất dễ dàng / nhanh chóng.


Sau tất cả các tối ưu hóa của bạn, bạn vẫn đang gặp vấn đề về hiệu suất? Bạn đã thử cấu hình mã xem các vấn đề đang ở đâu chưa?
MichaelHouse

@ Byte56 Ồ, hiện tại chắc chắn đây không phải là vấn đề về hiệu năng. Nó có thể là một trong tương lai khi tôi cố gắng đưa những gì tôi đang học để sử dụng cho một trò chơi thực sự. Bây giờ mặc dù, tôi chỉ đơn giản là muốn học. Tôi đã không nói rõ điều đó bởi vì tôi dường như nhận được ít sự giúp đỡ hơn nếu tôi chỉ muốn học những thứ đơn giản là học chúng.
Thần thoại

Tôi cảm thấy như tôi cũng nên nói rằng nếu tôi thực sự cố gắng thực hiện một trò chơi thích hợp với điều này, tôi sẽ muốn thế giới hữu hình trở nên TUYỆT VỜI. Tôi không muốn nhân vật cao 2 khối và rộng 1 khối như Minecraft và nhiều người khác, nhưng giống như 3 khối rộng / dài và cao 6-9. Có lẽ địa hình tĩnh mặc dù.
Thần thoại

1
À, được rồi Tim. Cảm ơn đã giải thích. Tôi đã thực hiện một số nghiên cứu về điều này khi tôi chế tạo động cơ cho trò chơi của mình. Vì phong cảnh của tôi rất năng động, tôi không nghĩ nó sẽ có giá trị hiệu suất mỗi khi có gì đó thay đổi. Tuy nhiên, bạn có thể tìm thấy một số sử dụng từ này bài viết về vấn đề hình chữ nhật tối đa. Về cơ bản, đó là thuật toán mà bạn đang nói về việc hợp nhất các khuôn mặt tương tự (có thể không tham lam, nhưng tối ưu). Chúc may mắn!
MichaelHouse

@ Byte56 Cảm ơn, tôi đánh giá rất cao nó. Điều đó chắc chắn trông gần hơn với loại thuật toán mà tôi đang tìm kiếm, nếu không phát hiện ra. Tôi sẽ phải sửa lại nó một chút để xem liệu tôi có thể có được tất cả các hình chữ nhật tối đa chỉ với một lần chạy không. Tôi có thể đưa ra một khoản tiền thưởng cho điều này cũng như một chút vì tôi nghĩ cả câu hỏi và câu trả lời chi tiết có thể giúp nhiều người khác trong tương lai.
Thần thoại

Câu trả lời:


4

Bạn chỉ muốn làm các dải, hoặc ở các hình chữ nhật tốt nhất. Không có hình dạng khác sẽ có thể giải được hoặc hữu ích cho bạn.

Tôi cũng muốn chỉ ra rằng bằng cách giữ 6 danh sách cho mỗi đoạn, rằng tại bất kỳ thời điểm nào, bạn sẽ sử dụng 5 danh sách từ các khối theo hướng chính và ít nhất là 3 trong mỗi danh sách. Bạn đang lãng phí thời gian ở đây, khi không chỉ card màn hình có thể thực hiện việc tối ưu hóa này cho bạn, mà ngay cả khi bạn tự làm, bạn vẫn nên giữ tất cả các mặt ở một nơi và so sánh hướng bình thường với hướng máy ảnh (Nghiên cứu sản phẩm DOT của vectơ).

Các liên kết của CaptainRedMuff về chia lưới tham lam mà bạn đã thấy là câu trả lời cho vấn đề của bạn. Cũng cần phải rõ ràng rằng bạn sẽ kết thúc với các mắt lưới "Sọc", nhưng chúng hoàn toàn hiệu quả, và đi kèm với một cái gì đó tối ưu hơn sẽ phức tạp hơn, và bạn đã bày tỏ rằng lưới tham lam đã quá phức tạp.

Nếu bạn gặp vấn đề về hiệu suất với một đoạn đơn, điều đó khiến tôi nghĩ rằng điều gì đó khác là rất sai.

Dự đoán đầu tiên của tôi sẽ là bạn đang gọi một cách hoạt động vẽ quá thường xuyên. Bạn chỉ có thể yêu cầu card đồ họa vẽ từ 50 đến 400 ~ lần mỗi giây, tùy thuộc vào phần cứng. Có bao nhiêu cuộc gọi đến .setData hoặc .draw ____ Bạn đang thực hiện?


Hình chữ nhật là những gì tôi muốn. Byte56 đã liên kết một thuật toán để theo dõi đơn giản hơn nhiều so với tham lam, nhưng tôi không thể chấp nhận một nhận xét như một câu trả lời. Tôi cho rằng anh ấy đã bình luận thay vì anh ấy chỉ liên kết với một thuật toán chứ không giải thích nó. Tôi không biết ý của bạn về danh sách của tôi. Tôi thường có 1-2 cuộc gọi rút thăm mỗi chunk. Danh sách của tôi được lưu trữ trong một bộ đệm cho mỗi đoạn. Tôi thay đổi phạm vi để vẽ trên mỗi khung. Tôi có thể sai, nhưng gửi dữ liệu không cần thiết đến GPU có vẻ phản tác dụng. Một trận hòa thêm hoặc hai cho mỗi đoạn có vẻ tốt hơn gửi nhiều dữ liệu hơn đến gpu và buộc nó cũng phải loại bỏ.
Thần thoại

Tôi không có vấn đề về hiệu suất. Tôi chỉ đơn giản là thích học những điều này. Tôi sẽ chỉnh sửa câu hỏi của mình để nói điều này, nhưng như tôi cũng đã nói với Byte56, tôi sẽ nhận được ít sự giúp đỡ hơn nếu những gì tôi đang cố gắng thực sự không giải quyết được vấn đề. Để trả lời câu hỏi của bạn, tôi hiện tối đa 200-260 khối trên mỗi khung hình. Đó là một DrawishedPrimitive 500ish khá phổ biến trên mỗi khung. Tôi thường xuyên nhận được 100-130 FPS mà không cần vsync, thực hiện 65.000 cuộc gọi mỗi giây. Tôi không cố tỏ ra thô lỗ, nhưng bạn nói nhỏ có ý nghĩa với tôi. Tôi có thể không hiểu, vì vậy xin vui lòng giải thích nếu tôi hiểu lầm. Có lẽ nó phải làm với XNA?
Thần thoại

Ah, xin lỗi, tôi muốn nói mỗi khung hình, không phải mỗi giây. Bạn đang tiến gần đến giới hạn trên ở đó và nếu bạn chỉ ở trên địa hình, bạn đã hết khá nhiều.
Phil

Tôi + 1 câu trả lời của bạn vì nó khiến tôi nghĩ về một vài cải tiến tôi có thể thực hiện, nhưng không liên quan gì đến câu hỏi. Ngoài ra, tôi nghĩ rằng tôi nên chia sẻ câu trả lời từ Nathan Reed trên liên kết
Thần thoại

Tôi sẽ phải tìm bài báo tôi đọc mà trích dẫn 400-500 là giới hạn. Google nhanh chóng không giúp tôi.
Phil

0

Bài viết mà bạn liên kết đến không thực sự đưa ra một thuật toán để tạo lưới; nó nêu một cách để đánh giá các giải pháp có thể.

Tuy nhiên, nói chung, bài viết đưa ra một bản tóm tắt tốt: 1) giải pháp ngây thơ là xấu, 2) có một giải pháp tối ưu, nhưng sẽ tốn cả thời gian để viết và chạy, 3) loại bỏ nhanh chóng cho kết quả tốt hơn nhiều ( và đây là tất cả những gì Minecraft tự làm) và cuối cùng là 4) có thể có một giải pháp thông minh hơn (thuật toán tham lam).

"Giải pháp" mà bạn ám chỉ trong hình ảnh trong câu hỏi của bạn thuật toán tham lam. Có vẻ như câu hỏi của bạn là "tôi đã thực hiện đúng giải pháp của anh ấy chưa?" mà tôi phải trả lời "anh ấy không đưa ra giải pháp; bạn chỉ tự mình giải quyết thôi."

Giải pháp của bạn có thể tốt hơn không? Meh. Chắc chắn rồi. Có lẽ không đáng. Tôi nghĩ rằng việc loại bỏ tắc nghẽn hoặc LOD sẽ là bước tiếp theo tốt hơn. Minecraft lãng phí một số lượng lớn các chu kỳ vẽ bề mặt ngay cả khi bạn ở dưới lòng đất, cũng như vẽ các mạng lưới hang động và hệ thống mỏ khổng lồ khi bạn ở trên bề mặt. Một khi bạn đã có một sự cố lưới tốt, vâng, loại bỏ các bề mặt bị che khuất có thể là một điều tốt - nhưng (ví dụ) nói chung là nhanh hơn để cho thẻ video của bạn loại bỏ backface hơn là làm điều đó trên CPU.

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.