Cách tốt để xử lý AI ngoài màn hình?


16

Ví dụ:

  • Giả sử có 10 phòng trên thế giới.
  • Và giả sử thế giới có 10 thực thể sinh sống.
  • Và mỗi thực thể có "thói quen hàng ngày" của riêng mình, nơi nó thực hiện một số hành động nhất định trong phòng và cũng có thể điều hướng giữa các phòng.

Cho rằng người chơi chỉ có thể ở trong một phòng tại một thời điểm, cách tốt nhất để theo dõi các hành động mà các thực thể khác đang thực hiện trong các phòng khác ngoài màn hình là gì?

  1. Tùy chọn đơn giản nhất là kiểm tra từng trong số 10 thực thể trên mỗi khung hình, kiểm tra vị trí / trạng thái của chúng và xác định xem thực thể đó có nên ở trong phòng nơi người chơi được đặt tại bất kỳ thời điểm nào không. (Tuy nhiên, điều này cảm thấy tài nguyên thực sự nặng nề đặc biệt là khi số lượng phòng / thực thể được tăng lên.)
  2. Một lựa chọn khác là theo dõi thời gian đã trôi qua kể từ khi bắt đầu trò chơi, sau đó mỗi thực thể kiểm tra xem mô hình của nó có giao nhau với phòng mà người chơi đang bật hay không và liệu nó có kiểm tra theo thời gian hay không Thực thể được cho là ở cùng một phòng vào thời điểm đặc biệt này, các thực thể có mô hình không giao nhau với phòng hiện tại mà người chơi không ở trong đó cho đến khi người chơi vào một căn phòng mà mô hình của họ giao nhau và chỉ tại thời điểm đó mới tính được hay không họ nên kết xuất. (Nhưng nếu họ tương tác với phòng, thì họ sẽ phải luôn kiểm tra trạng thái của các phòng giao nhau với tuyến đường của mình để xác định vị trí của họ tại thời điểm đó, điều đó không tuyệt lắm.)

  3. Tùy chọn thứ ba mà tôi đã đến trước hết là chỉ nhìn vào các tuyến đường giao nhau giữa vị trí người chơi (như được mô tả trước đó), thứ hai khi vào phòng, kiểm tra xem người chơi có ở trong phòng đó không, nếu không thì chỉ kiểm tra tình trạng của căn phòng và mất bao lâu để tiến tới phòng tiếp theo. Ví dụ, một người gác cổng NPC vào phòng, kiểm tra trạng thái của căn phòng, thấy rằng có một sự cố tràn do người chơi tạo ra, tính toán sẽ mất bao nhiêu thời gian để dọn dẹp và thời gian đi đường sẽ mất bao lâu. Và cho đến khi được đề cập Thời gian là để vào phòng tiếp theo, chúng tôi chỉ kiểm tra xem người chơi có ở trong phòng không. Vị trí chính xác của NPC cho mục đích kết xuất sẽ chỉ được tính khi người chơi vào phòng.

Sau khi động não một lúc tôi đến lựa chọn thứ ba, nhưng tôi tự hỏi liệu có lẽ có cách nào tốt hơn hoặc tốt hơn để xử lý những thứ như thế này không?


1
Câu hỏi này làm tôi nhớ đến một blog dev mà tôi đã đọc cho một trò chơi có tên Project Zomboid.
Sumurai8

Câu trả lời:


12

Một cách tiếp cận rất đơn giản là sử dụng "Mức độ chi tiết của AI". Roughly, điều này có nghĩa là bạn cập nhật AI thường xuyên hơn khi càng gần máy nghe nhạc / máy ảnh. Bạn cũng có thể giảm độ phức tạp của các tính toán AI ở xa hơn, đặc biệt. để tìm đường. Rốt cuộc, nếu người chơi không thể nhìn rõ nhân vật hay chút nào, sẽ không có nỗ lực nào để mô phỏng nhân vật với độ chính xác cao nhất.

Trong ví dụ của bạn, phòng người chơi đang ở có thể có độ chính xác cao nhất (AI cập nhật mọi khung hình, độ phân giải đầy đủ). Các phòng liền kề có thể có độ chính xác cao nhất tiếp theo (cập nhật cứ sau 10 tích tắc, loại bỏ làm mịn đường dẫn và hình động). Tất cả các phòng khác có thể có độ chính xác thấp nhất (cập nhật mỗi giây, tìm đường dẫn có độ phân giải thấp, loại bỏ các tương tác NPC-NPC không thiết yếu).

Các trò chơi lớn hơn và phức tạp hơn có thể (và đã) sử dụng các cách tiếp cận tương tự. Họ có thể đơn giản hóa các tính toán chiến đấu, dịch chuyển nhân vật thay vì tìm đường khi họ cần di chuyển, v.v.

Nếu trò chơi của bạn đủ lớn để bạn không thể giữ toàn bộ bộ nhớ mọi lúc, thì một giải pháp tốt là lưu trữ thời gian cập nhật cuối cùng trong dữ liệu đã lưu của phòng và phát lại màn hình mô phỏng của nó (ở độ phân giải thấp nhất) khi nó được tải lại.

Nếu bạn mong muốn AI di chuyển vào các khu vực "sống" từ các khu vực "ngủ" không tải theo lịch trình, bạn sẽ muốn tạo dữ liệu độ trung thực siêu thấp cho các khu vực đó để giữ bộ nhớ mọi lúc (ví dụ: chỉ là thô nhất mức độ chi tiết của navmesh và các vị trí đối tượng / nhân vật chính) hoặc bạn sẽ muốn định kỳ xoay vòng các khu vực đó trong (ví dụ: giữ các khu vực "ngủ" trong bộ nhớ và mô phỏng ở độ trung thực thấp với các cập nhật không thường xuyên và sau đó quay vòng chúng qua tất cả " các khu vực ngủ "có các NPC hoạt động chính trong đó, dỡ và tải các khu vực như bạn làm như vậy).


1

Tôi sẽ lưu trữ các thực thể hiện đang ở trong một phòng trong trường hợp đó, đối tượng phòng cũng sẽ theo dõi khi nào các thực thể cần được cập nhật (ví dụ: đi đến phòng khác hoặc thay đổi một cái gì đó trong phòng đó, v.v.). Và tôi cũng sẽ cập nhật một (hoặc nhiều) phòng mỗi giây (có thể trong một chủ đề khác).

Khi bạn cập nhật phòng, các vị trí NPC sẽ được cập nhật và tất cả các hành động họ đã thực hiện tương tác với phòng vì bản cập nhật cuối cùng cũng sẽ được xử lý, cuối cùng phải kiểm tra / cập nhật thời gian của bản cập nhật cần thiết tiếp theo .

Nếu một thực thể di chuyển từ phòng này sang phòng khác, thì cá thể đó sẽ được lưu trữ trong phòng khác và bản cập nhật tiếp theo của thực thể cũng sẽ được cập nhật.

Bằng cách này, bạn chỉ phải cập nhật phòng hiện tại và các phòng có cập nhật theo lịch trình tại thời điểm đó, cập nhật các phòng khác chỉ là tùy chọn (nhưng được khuyến nghị nếu bạn có AI cập nhật bất cứ khi nào người chơi di chuyển hoặc làm gì đó) .

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.