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.