Giải pháp tìm đường thích hợp nhất cho môi trường tạo thủ tục rất lớn là gì?


7

Tôi đã đọc khá nhiều để đưa ra lựa chọn sau: giải pháp tìm đường nào nên thực hiện trong một trò chơi nơi thế giới thủ tục được tạo ra, có kích thước thực sự lớn?

Đây là cách tôi thấy các giải pháp chính và ưu / nhược điểm của chúng:

1) tìm đường dẫn dựa trên lưới - đây là tùy chọn duy nhất không yêu cầu bất kỳ quá trình tiền xử lý nào, rất phù hợp. Tuy nhiên, khi thế giới mở rộng, bộ nhớ được sử dụng tăng theo cấp số nhân lên đến mức điên rồ. Điều này có thể được xử lý theo các đường dẫn xử lý, các giải pháp máng như thuật toán Block A * hoặc Subgoal A *. Tuy nhiên, việc sử dụng bộ nhớ là vấn đề khó phá vỡ;

2) navmesh - điều này sẽ rất đáng yêu, do độ chính xác, tính toán đường dẫn nhanh và sử dụng bộ nhớ thấp. Tuy nhiên, nó có thể mất một thời gian tiền xử lý tục tĩu.

3) biểu đồ khả năng hiển thị - tùy chọn này cũng cần thời gian tiền xử lý cao, mặc dù có thể giảm bớt bằng cách sử dụng các thuật toán tiền xử lý nhanh. Sau đó, tính toán đường dẫn nói chung cũng nhanh. Nhưng việc sử dụng bộ nhớ có thể còn điên rồ hơn cả dựa trên lưới tùy thuộc vào cấu hình của thế giới thủ tục.

Vì vậy, điều gì sẽ là cách tiếp cận tốt nhất (những người khác không có trong danh sách này cũng được hoan nghênh) cho tình huống như vậy? Có kỹ thuật hoặc thủ thuật nào có thể được sử dụng để xử lý các thế giới giống như vô hạn về thủ tục không?

Đề xuất, ý tưởng và tài liệu tham khảo đều được chào đón.

BIÊN TẬP:

Chỉ cần cung cấp thêm chi tiết, người ta sẽ thấy ứng dụng mà tôi đang nói đến như một cấp độ văn phòng rất lớn, nơi các phòng được tạo ra sản phẩm. Thuật toán hoạt động như sau. Đầu tiên, các phòng được đặt. Tiếp theo, bức tường. Sau đó là các cánh cửa và sau đó là đồ đạc / chướng ngại vật đi trong mỗi phòng. Vì vậy, môi trường có thể trở nên rất lớn và có rất nhiều đối tượng, vì các phòng mới được tạo ra khi người chơi tiếp cận ranh giới của khu vực đã được tạo. Nó có nghĩa là sẽ không có khu vực mở lớn mà không có chướng ngại vật.


5
Bạn có thể mô tả nhu cầu của bạn hơn nữa? Bất kỳ trong số này có thể phù hợp tùy thuộc vào trò chơi của bạn và bản chất của thế hệ thủ tục.
Anko

Là các ranh giới của các tính năng có thể đi bộ của bạn được căn chỉnh theo lưới, hoặc đó là một thế giới mở, v.v.?
Steven

Ngoài ra còn có một đường dẫn dựa trên Quadtree, nằm ở đâu đó giữa các cách tiếp cận của Grid và Navmesh. Nó nên hoạt động cho cả thế giới ngoài trời và kiểu ngục tối (bạn không chỉ định cái nào bạn muốn hoặc cả hai). Để có ý tưởng: youtube.com/watch?v=sn6P7xCTvvc
Igor S.

Cảm ơn tin nhắn của bạn, Anko và @Steven. Xin hãy nghĩ về nó như một văn phòng khổng lồ tạo ra thủ tục, với rất nhiều phòng và đồ vật ở giữa đường. Vì vậy, nó không giống như tôi có các khu vực mở lớn mà không gặp trở ngại. Ngoài ra, cho đến nay nó không dựa trên lưới (tôi có thể làm cho nó chỉ vì mục đích tìm đường và đó là một phần của sự nghi ngờ của tôi).
Andy Astro

1
Bạn sẽ không giữ tất cả các đồ thị điều hướng trong bộ nhớ. Điều đó sẽ hoàn toàn phi logic nếu chỉ có một khu vực nhất định thực sự tồn tại trong bộ nhớ tại bất kỳ thời điểm nào. Nếu bạn cần điều hướng trên toàn thế giới, điều bạn muốn làm là lưu trữ một biểu đồ kề kề đa cấp. Khu vực nào kết nối với khu vực nào, Xếp hàng lên các khu vực đó. Sau đó, đối với khu vực hiện tại nhân vật của bạn đang ở, bạn điều hướng qua đó đến các cạnh kết nối với khu vực tiếp theo. Sau đó, tiếp theo, và cho đến khi đích đến được đáp ứng.
moonshineTheleocat

Câu trả lời:


3

Cho rằng các phòng được xây dựng theo thủ tục, cổng được tạo và sau đó được điền, tôi có một vài ý tưởng.

A * hoạt động thực sự tốt trên các lưới điều hướng và cũng hoạt động theo cấp bậc. Tôi sẽ xem xét việc xây dựng một hệ thống tìm đường hoạt động ở hai cấp độ - thứ nhất, phòng theo cấp độ phòng và thứ hai trong mỗi phòng, từ cổng thông tin đến cổng thông tin. Tôi nghĩ bạn có thể làm điều này trong suốt thế hệ với mức giá phải chăng. Bạn chỉ cần chuyển từ phòng này sang phòng khác một khi bạn vào nó, vì vậy nó rất phải chăng với chi phí bộ nhớ / cpu.

Mức A * cao có thể được thực hiện bằng cách tạo một biểu đồ của mỗi cổng và phòng - một phòng là nút và 'đường dẫn' hoặc cạnh là cổng vào phòng khác. Chi phí của traversal có một số tùy chọn - ví dụ, có thể từ điểm trung tâm của phòng đến điểm trung tâm của phòng khác. Hoặc bạn có thể muốn tạo các cạnh cụ thể từ cổng này sang cổng khác với khoảng cách thực, điều này hữu ích hơn, tôi nghi ngờ. Điều này cho phép bạn thực hiện tìm đường dẫn cấp cao từ phòng A đến phòng B. Cửa có thể được mở và đóng, cho phép hoặc vô hiệu hóa các đường dẫn cụ thể, phù hợp với một số loại trò chơi nhất định. Bởi vì nó dựa trên phòng / cổng nên khá dễ dàng và giá cả phải chăng để tính toán - chỉ cần tính toán khoảng cách và giữ sổ sách.

Phần khó hơn sẽ là mức A * thấp vì nó phải là lưới điều hướng đa giác. Nếu mỗi phòng là hình vuông, bạn có thể bắt đầu với một đa giác. Khi bạn đặt chướng ngại vật, trừ đi diện tích chiếm từ đa giác, tạo lỗ trên đó. Khi hoàn tất, bạn sẽ muốn chuyển nó thành hình tam giác một lần nữa, xây dựng biểu đồ. Tôi không nghĩ rằng điều này chậm như bạn nghĩ. Phần khó khăn là thực hiện cắt lỗ đa giác, đòi hỏi một lượng sách tốt để giữ loại đó, nhưng nó được ghi lại trong các cấu trúc nửa cạnh và thành lập sách đồ họa khoa học máy tính. Bạn cũng có thể thực hiện thế hệ này một cách lười biếng, trong một biểu đồ nền, vì thực tế bạn không cần kết quả A * của cấp độ này cho đến khi có người ở trong phòng - cấp cao đảm nhiệm việc lập kế hoạch đường đi cơ bản cho bạn.

Tôi biết tôi đã theo dõi thế hệ lưới điều hướng ở mức độ thấp, nhưng tôi nghĩ đó là một trong những điều bạn đặt tâm trí và giải quyết và thế là xong. Có rất nhiều thư viện ngoài kia như CGAL ( http://www.cgal.org ) và những thư viện khác có thể thực hiện công cụ này, nhưng thực sự để có được nó nhanh chóng, bạn có thể cần phải tự viết nó để bạn chỉ có những thứ bạn cần nhu cầu.

Ngoài ra, bạn có thể biến mỗi phòng thành một lưới và các chướng ngại vật lấp đầy các phần của lưới, sau đó thực hiện tất cả các thuật toán làm mịn lưới tiêu chuẩn, nhưng tôi thích dữ liệu điều hướng vì nó nhỏ và nhanh.

Hy vọng là nó có nghĩa.


cảm ơn rất nhiều vì câu trả lời sâu sắc Vì vậy, cách suy nghĩ của bạn tương tự như những gì tôi đã làm cho đến nay. Tôi đã chính xác làm việc với hệ thống phân cấp. Tôi đã tạo chính xác một biểu đồ trong đó các phòng là các điểm, vì vậy điều đầu tiên là tính toán cách các phòng máng. Sau đó, tìm đường trong phòng tìm cửa của căn phòng đó và đó là nó. Tôi đã thực hiện chính xác điều đó bằng cách làm cho mỗi phòng có lưới riêng được lưu trong một đối tượng mảng, với các chướng ngại vật lấp đầy các ô mà chúng chạm vào. Câu hỏi của tôi bắt đầu nảy sinh chính xác bởi vì tôi nhận ra rằng một khi thế giới phát triển, dữ liệu về bộ nhớ sẽ trở nên rất lớn (...)
Andy Astro

(...). Giống như, một phòng với 30x10 có 300 ô. Nhưng một ngàn phòng tăng lên 300 nghìn, v.v. Vì vậy, nếu tôi hiểu đúng đề xuất cấp thấp của bạn, tôi sẽ tạo một bộ điều hướng cho mỗi phòng, do đó sẽ không quá tốn kém về mặt CPU do có ít trở ngại hơn (vì vậy các đỉnh) để xử lý? Điều này có ý nghĩa và ngay bây giờ đã thực hiện điều đó, nhưng với các biểu đồ khả năng hiển thị thay vì navmesh. Trong khi các điều hướng sử dụng bộ nhớ lưu trữ ít hơn nhiều so với đồ thị, bạn có nghĩ rằng quá trình tiền xử lý của chúng có thể cạnh tranh với quá trình tiền xử lý của đồ thị trong toàn bộ trường hợp này không?
Andy Astro

1
Btw, hãy để tôi thừa nhận rằng trong khi tôi đã suy nghĩ giống bạn ở mức độ cao hơn, bạn đã cho tôi một ý tưởng nổi bật, mạnh mẽ như nó đơn giản: biến cánh cửa thành các nút của biểu đồ cấp cao thay vì các phòng . Tuyệt vời.
Andy Astro

1
Phải - bạn sẽ tạo ra một navmesh cho mỗi phòng. Đối với vấn đề lưới điện, bạn có cần tạo trước tất cả chúng hay bạn có thể tạo chúng khi cần - hoặc chỉ trong thời gian khi người chơi đến gần? 300k lưới dường như không quá lớn đối với tôi - nó có phù hợp với bạn không? Bạn đang xử lý nền tảng nào? Một bộ đệm âm thanh hoặc một kết cấu lớn hơn thổi giới hạn đó, vậy tại sao phải lo lắng về nó? Nếu lưới hoạt động, sử dụng chúng. Bạn có thể bắt đầu với điều đó và xem xét lại việc tạo ra navmesh sau, nếu cần.
Steven

Xin chào @Steven, cảm ơn vì nhận xét. Cuối cùng tôi đã có thời gian để kiểm tra điều đó và tôi thực sự sẽ phải thử điều hướng mỗi phòng. Việc sử dụng bộ nhớ có thể tăng hơn 300 nghìn sau một thời gian chạy ứng dụng và với điều hướng có lẽ tôi có thể giảm đáng kể. Như bạn đã đề cập lúc đầu, việc xử lý điều hướng cho mỗi phòng không nên quá chậm, vì các phòng không quá chi tiết về các chướng ngại vật. Ngoài ra, tôi không phải đối phó với độ dốc sàn hoặc với bản đồ chiều cao vì chúng không đổi. Trong kịch bản như vậy, bạn sẽ có bất kỳ thuật toán navmesh để đề xuất?
Andy Astro

4

Tôi sẽ thực hiện một cú đâm và đề xuất một thuật toán tìm đường phân cấp , chẳng hạn như HPA * . Mặc dù tôi không phải là chuyên gia về AI, tôi khá tự tin vào dự đoán này vì trình tạo của bạn nghe gần giống với trò chơi tôi đang làm việc , tức là tôi cũng đã nghĩ về vấn đề này một chút.

HPA * (Tìm đường dẫn phân cấp A *) là phương pháp tối ưu hóa A * thông thường bằng cách trước tiên phân cụm bản đồ thành các khu vực được kết nối với nhau, sau đó tạo ra một biểu đồ cấp cao của các cụm đó. Khi tìm đường, A * (hoặc bất kỳ thuật toán tìm đường nào) được chạy trên biểu đồ mức cao, sau đó trong mỗi cụm tạo thành đường dẫn cấp cao tốt nhất. Rõ ràng nó được sử dụng rộng rãi trong các trò chơi RTS, trong đó rất nhiều đơn vị sẽ cần điều hướng các đường dẫn duy nhất trên một bản đồ lớn trong thời gian thực, vì vậy điều này sẽ cho bạn ý tưởng về phương pháp này hiệu quả như thế nào.

Đây là một hình ảnh từ giấy của họ; bên trái là các cụm có các nút kết nối và bên phải là biểu đồ cấp cao:

HPA *

May mắn cho máy phát điện của bạn, nó rất phù hợp với thuật toán này, bởi vì các phòng bạn đặt: điều này cung cấp cho bạn một nửa phân cụm miễn phí. Biểu đồ cấp cao của bạn về cơ bản được tạo thành từ tất cả các cửa phòng của bạn. Vì vậy, những gì HPA * dành cho bạn là: tìm chuỗi phòng / cửa tôi cần đi qua và cách điều hướng mọi phòng theo trình tự đó.

Một số điều gọn gàng hơn về thuật toán này:

  • A * chậm vì phải tìm đường dẫn hoàn chỉnh trước khi trả về bất kỳ kết quả nào; với HPA *, bạn có thể tìm thấy đường dẫn cấp cao cộng với đường dẫn cho phòng đầu tiên, vì vậy bạn có thể đi theo nó ngay lập tức và trì hoãn các đường dẫn cho các phòng còn lại sau đó. Điều này làm cho thuật toán đáp ứng.
  • Bạn có thể lưu trữ kết quả tìm đường giữa các cặp cửa cho mỗi phòng, vì các đường dẫn đi qua nhưng không bắt đầu hoặc kết thúc trong phòng này được đảm bảo đi theo một đường dẫn như vậy.
  • Bạn có thể có nhiều cấp độ trong hệ thống phân cấp này, mặc dù điều này chỉ hữu ích cho các bản đồ thực sự khổng lồ.

Xin lưu ý rằng HPA * gần tối ưu. Bạn có thể dễ dàng thấy tại sao bằng cách tưởng tượng một căn phòng có quá nhiều chướng ngại vật mà phải mất một thời gian dài để vượt qua nó. Vì lý do tương tự, bạn nên coi chừng một căn phòng có đủ chướng ngại vật để phân chia nó một cách hiệu quả - đừng coi căn phòng này là một cụm trong biểu đồ cấp cao.

Đối với một số thuật toán có thể khác, bạn có thể thử câu hỏi này trên cstheory.SE , trong đó liệt kê một tấn trong số chúng.


Cảm ơn nhiều! Đó là một câu trả lời tuyệt vời. Như tôi đã nhận xét với Steven trong câu trả lời khác, điều đó rất gần với những gì tôi đã cố gắng làm. Tôi đã chính xác sử dụng mỗi phòng như một trong những "tế bào lớn" của hệ thống phân cấp. Nhưng câu trả lời của bạn đã giúp tôi nghĩ về phần cấp cao đó hiệu quả hơn. Cảm ơn. Bây giờ, đối với phần cấp thấp (trong phòng), giải pháp đó vẫn không khiến tôi sử dụng bộ nhớ lưu trữ lớn, do dù sao cũng phải lưu vào bộ nhớ tất cả các ô là một phần của bên trong phòng (nghĩa là ở cấp độ thấp)? Tôi nghĩ đó là một mối quan tâm công bằng khi số lượng phòng bắt đầu tăng lên
Andy Astro

Và btw, tôi đã rất quan tâm đến dự án của bạn. Tôi chắc chắn sẽ xem xét kỹ hơn các bài đăng khác mà bạn đã đặt ở đó trong quá khứ để bắt kịp với những gì bạn đã làm và thảo luận. Rất cám ơn đã chia sẻ nó.
Andy Astro

@AndyAstro không bị đánh lừa bởi sơ đồ, nó chỉ minh họa một triển khai có thể dựa trên biểu diễn lưới, nhưng bạn có thể làm điều đó tốt với navmesh, trên các phòng lớn hơn sẽ hiệu quả hơn lưới. Nhưng với việc tìm đường, nó thường tính toán thời gian là vấn đề lớn hơn, không phải bộ nhớ. Việc sử dụng bộ nhớ tỷ lệ thuận với kích thước bản đồ, nhưng bạn muốn tìm đường dẫn hiệu quả, đó là cách tiếp cận phân cấp này sẽ giúp ích.
congusbongus 7/10/2015
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.