Dữ liệu nào nên được lưu trong bộ nhớ cache trong máy chủ nhiều người chơi, liên quan đến AI và người chơi?


8

Ở một nơi ảo, được điều khiển mạng hoàn toàn, với số lượng người chơi tùy ý và số lượng kẻ thù tùy ý, dữ liệu nào sẽ được lưu trong bộ nhớ máy chủ, để tối ưu hóa mô phỏng AI trơn tru?

Cố gắng giải thích, giả sử người chơi A thấy người chơi B đến E và kẻ thù A đến G. Mỗi người chơi đó, thấy người chơi A, nhưng không nhất thiết phải là nhau. Áp dụng tương tự cho kẻ thù. Hãy nghĩ về câu hỏi này từ góc độ topdown xin vui lòng.

Ví dụ, trong nhiều trường hợp, khi người chơi bắn súng, máy chủ sẽ xử lý âm thanh dưới dạng "tín hiệu" xuyên tâm mà mọi thực thể khác trong tầm với "nghe" và phản ứng lại.

Thực hiện các tìm kiếm này mọi lúc cho toàn bộ khu vực, có thể chứa rất nhiều người chơi và kẻ thù không liên quan, dường như là một vấn đề, khi ngân sách cho mỗi tác nhân AI quá nhỏ.

Có phải mọi thực thể lưu trữ bất cứ thứ gì vào và ra khỏi bán kính nhận thức của nó? Có một cách tuyệt vời để theo dõi các thực thể gần mà không làm ngập bộ nhớ với bộ nhớ như vậy?

Còn những vấn đề liên quan đến AI khác có thể phát sinh, sau khi giả sử cái trước hoạt động tốt thì sao? Chúng ta đang nói về môi trường với hàng trăm kẻ thù, một bầy.


Nó phụ thuộc khá nhiều vào số lượng người chơi và AI và như vậy trong trò chơi. Chẳng hạn, các MMO sử dụng những thứ như đồ thị cảnh để tìm kiếm nhanh, gần với những thứ như bạn đề cập ở trên trong khi một trò chơi FPS chỉ theo dõi có thể có tổng cộng 30 thứ, có thể là quá mức cần thiết và chỉ có một danh sách liên kết gồm 30 thực thể đủ. Bạn có thể cụ thể hơn một chút trong cài đặt của bạn? Chỉ với 5 người chơi và 7 AI, tôi sẽ nói rằng bạn không cần phải làm gì đặc biệt ngoài việc có tất cả 13 thực thể được tải vào bộ nhớ như bình thường.
James

Một trường hợp hoàn toàn trung bình của thế giới trò chơi là như vậy: hơn 20 khu vực, như trong thành phố cộng với môi trường xung quanh. Mỗi khu vực là những gì chúng tôi đang xem xét ở đây và nó được chia theo cách đệ quy theo các khu vực, theo kiểu đồ thị cảnh như bạn đã nói. Một khu vực vẫn có thể lớn hơn nhận thức của thực thể và hoàn toàn có thể chứa 100 kẻ thù trở lên và BẤT K number số lượng người chơi. Chắc chắn có những khu vực trống, nhưng cũng có những khu vực quá đông đúc
Grimshaw

1
Tôi khá quan tâm bởi những phản hồi về câu hỏi này.
Coyote

Câu trả lời:


7

Có nhiều cách để làm điều này, nhưng chúng phụ thuộc vào bất cứ nơi nào bạn sẽ có một lượng lớn tương tác hoặc dân số rất dày đặc.

Thật không may nếu bạn muốn mô phỏng của mình giữ được độ chính xác tốt, bạn sẽ cần xử lý hầu hết các sự kiện được tạo bởi tất cả các diễn viên và tìm tất cả / hầu hết các diễn viên cần thông báo.

Va chạm khu vực giá rẻ

Liên quan đến vấn đề với các khu vực nhận thức, bạn có thể giải quyết nó bằng cách phát hiện va chạm đơn giản.

Trong một thế giới 2d, việc phát hiện va chạm trên các vòng tròn là "rẻ". Ví dụ: thao tác để phát hiện nếu một điểm nằm trong vòng tròn chỉ mất 2 phép trừ, 2 phép nhân và phép cộng. Bạn không cần phải làm căn bậc hai vì bạn có thể lưu trữ và so sánh bán kính vuông của khu vực của bạn với khoảng cách vuông trực tiếp.

Nếu bạn sử dụng vòng tròn 2d trong thế giới 3d, về cơ bản nó sẽ hoạt động như một hình trụ. Nó có thể là một cách thuận tiện để tạo ra các khu vực nếu chiều cao không quan trọng lắm.

Bán kính định hướng sự kiện

Nếu khối lượng sự kiện (cứu hỏa, di chuyển ...) thấp, bạn có thể thử phát hiện từng diễn viên bị ảnh hưởng bởi mỗi sự kiện. Các sự kiện của bạn sẽ tạo ra các khu vực (nơi chúng có thể được nghe).

Đây là phương pháp đơn giản nhất để thực hiện, nó cũng linh hoạt nhất khi bạn có thể đón các tác động đạn / đạn có nguồn gốc từ các tác nhân bên ngoài khu vực nhận thức.

Mặt khác, khi khối lượng sự kiện tăng lên, bạn có thể phải giảm số lần quét kích hoạt sự kiện hoặc giảm số lượng diễn viên được quét trên mỗi sự kiện.

-> Bạn cũng có thể tạo các vùng (sự kiện) nhỏ trong đó tất cả các sự kiện được đăng ký cùng nhau và được xử lý trong các khối (nghĩa là 2 tác động viên đạn và bước chân xảy ra trong một vùng sẽ chỉ sử dụng một lần quét và được gửi đến tất cả các thực thể bị ảnh hưởng). <-

Khu vực định hướng diễn viên

Bạn có thể sử dụng nguyên tắc "khu vực nhận thức". IE nếu một diễn viên va chạm với vùng nhận thức (vòng tròn) của một diễn viên khác, bạn chỉ cần thêm diễn viên va chạm vào danh sách các diễn viên có khả năng tương tác. Tùy thuộc vào cách công cụ của bạn được xây dựng, sau đó bạn có thể đăng ký tin nhắn âm thanh và các sự kiện khác có nguồn gốc từ các diễn viên trong danh sách.

Để kiểm tra liên hệ trực quan, bạn cũng có thể thực hiện quét hình ảnh của mình chỉ trong danh sách các diễn viên đã đăng ký.

Bạn không phải kiểm tra thay đổi khu vực nhận thức mỗi lần đánh dấu. Bạn có thể làm điều đó theo thời gian, cứ sau 5 đến 30 tích tắc.

Nếu danh sách bắt đầu phát triển, bạn có thể giới hạn chúng ở kích thước tối đa. Nhưng sau đó, bạn sẽ phải ưu tiên các diễn viên để thêm / trao đổi trong danh sách.

Cách tiếp cận hỗn hợp

Bạn có thể kết hợp cả hai cách tiếp cận. Bạn có thể đăng ký diễn viên trong các khu vực nhận thức cho các sự kiện như bước chân, mũi động cơ, v.v ... Và các sự kiện khác (tác động của đạn, vụ nổ, v.v.) có thể kích hoạt quét dựa trên tầm quan trọng của chúng. Có nhiều khả năng ai đó sẽ nghe thấy tiếng nổ lựu đạn hơn là tiếng đạn, vì vậy vụ nổ lựu đạn sẽ kích hoạt một cuộc quét rộng hơn so với vụ bắn đạn.

Tôi khuyên bạn nên bắt đầu thực hiện bán kính sự kiện trước. Khi cái này hoạt động và bạn có thể giảm / tăng độ chính xác của phương pháp này, bạn có thể bắt đầu thực hiện các khu vực nhận thức về diễn viên. Bằng cách này, bạn sẽ có thể bắt đầu di chuyển một số sự kiện sang hệ thống thứ hai.

Nhóm ngữ cảnh

Không phải tất cả các diễn viên cần phải được thông báo về tất cả các sự kiện. Ví dụ, một tháp pháo phòng không không cần phải được thông báo về tác động của đạn và bước chân xung quanh nó, thậm chí có thể bỏ qua sự hiện diện của các đơn vị mặt đất đối với một số đơn vị.

Nếu bạn tìm thấy nhiều trường hợp đặc biệt như vậy, bạn có thể tạo ra các khu vực nhận thức khác nhau. Một diễn viên có thể làm cho khu vực nhận thức của mình hoạt động trong nhiều hồ bơi. Ví dụ, bạn có thể muốn các đơn vị mặt đất của mình chỉ phản ứng với các đơn vị mặt đất trong khi một số đơn vị trang bị tên lửa và laser cũng có thể phản ứng với các đơn vị không quân. Máy bay không bao giờ cần phải được thông báo về các tác động mặt đất khác ngoài vụ nổ ...

Tất nhiên bạn không cần tạo nhiều "danh sách" cho các nhóm. Bạn có thể chỉ cần sử dụng một mặt nạ bit và đặt mặt nạ phù hợp cho từng diễn viên / khu vực. Bằng cách này bạn có thể lọc đơn giản hoặc trước khi kiểm tra khoảng cách.

Tập hợp

Nếu bạn thấy các danh sách trong từng khu vực nhận thức tăng lên và trí nhớ khan hiếm, bạn có thể tổng hợp các khu vực nhận thức cho các nhóm kẻ thù (đội, đội, trung đội, đàn, bầy đàn ...) miễn là chúng vẫn ở gần nhau. Bằng cách này, toàn bộ đội có thể đăng ký các sự kiện hoặc các diễn viên / nhóm khác bước vào khu vực nhận thức của nó.

Về cơ bản, thực thể nhóm trở thành một thay thế / proxy cho tất cả các lần quét trong khi tất cả các thành viên của nhóm được xóa khỏi nhóm.

Nguyên tắc này cũng có thể được áp dụng cho tất cả các đơn vị bên trong một chiếc xe.

Kích hoạt tiệm cận

Nếu máy chủ thực sự quá đông với các bot (và bạn thực sự cần giữ cho tất cả chúng tồn tại), thì bạn chỉ có thể kích hoạt nhận thức / AI trên những người trong một "khu vực kích hoạt đặc biệt xung quanh mỗi người chơi". Bằng cách này, các bot (hoặc nhóm) bên trong một hoặc nhiều khu vực kích hoạt sẽ giữ cho chính chúng và khu vực nhận thức của chúng được kích hoạt (trong nhóm va chạm). Mặt khác, khu vực nhận thức của họ bị xóa khỏi (các) nhóm hoạt động.

Tần suất mà các "khu vực kích hoạt" đó quét "khu vực nhận thức" có thể thay đổi tùy thuộc vào tốc độ của người chơi. Một người chơi di chuyển với tốc độ cao hơn sẽ kích hoạt nhiều kích hoạt hơn một người chơi cắm trại một khu vực (ít nhất là cần thiết để kích hoạt các bot chuyển vùng và hủy kích hoạt các bot rời khỏi khu vực).

Ngoài ra, bạn có thể hủy kích hoạt khu vực kích hoạt của người chơi nếu anh ta lên xe và chỉ định khu vực kích hoạt cho xe nếu không có. Bằng cách này, 10 người chơi đi trên cùng một phương tiện không cần phải có 10 khu vực kích hoạt.

Phái đoàn

Nếu bạn không sợ những kẻ gian lận và những người gây rắc rối khác, bạn có thể ủy thác một số phát hiện sự kiện cho ứng dụng khách.

Máy chủ có thể định kỳ gửi danh sách các diễn viên gần đó (bot và người chơi) sẽ được thông báo bởi các ứng dụng khách. Ứng dụng khách sẽ phải thực hiện quét và phát hiện sự kiện cho tất cả các sự kiện do trình phát tạo ra. Ví dụ, nó có thể gửi danh sách các diễn viên để thông báo về một phát bắn, tác động của viên đạn hoặc bước chân.

Đây là một tùy chọn, nó có thể hợp lệ tùy thuộc vào loại trò chơi bạn đang làm. Đây là một ý tưởng lý thuyết và tôi không khuyên bạn nên làm điều này cho đến khi bạn có toàn quyền kiểm soát các máy khách được ủy quyền (máy chủ bot hoặc máy khách được bảo mật).


Tôi hi vọng cái này giúp được.


Câu trả lời của bạn dường như xác định hầu hết các phương pháp hiện có, thật tuyệt vời! Kết hợp tất cả có vẻ là một lựa chọn tốt, đối với một ứng dụng quan trọng về hiệu năng như vậy, mọi thứ nên được thực hiện chi tiết, tránh làm quá mức ở đây và đó. Ngoài ra, tôi thực sự nghĩ rằng nếu khách hàng có thẩm quyền trên BẤT CỨ THỨ NÀO, nó có thể và sẽ bị lừa: P
Grimshaw

Vâng ... nhưng nếu bạn có thể ủy thác một số nội dung cho máy khách ngay bây giờ, bạn sẽ có thể ủy quyền cho các máy chủ thứ cấp sau này nếu bạn muốn, chỉ giới hạn ủy quyền cho các máy chủ và vô hiệu hóa nó trên máy khách. Chỉ là một ý tưởng thôi :)
Coyote

Đó là một ý tưởng tốt, nhưng người chơi sẽ luôn khai thác khi cạnh tranh ... Tôi thích sử dụng sức mạnh xử lý của khách hàng hơn cho kẹo mắt và các công cụ để nâng cao trải nghiệm, âm thanh, đồ họa, v.v. Máy chủ không cần theo dõi mọi thứ, một số những điều khách hàng có thể thừa nhận mà không cho phép gian lận. Dù sao, cảm ơn rất nhiều cho câu trả lời, một lần nữa, nó sẽ giúp cân bằng mọi thứ!
Grimshaw
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.