Cách thanh lịch để mô phỏng số lượng lớn các thực thể trong một thế giới trò chơi


33

Giả sử bạn có một trò chơi trong đó có nhiều (nhiều) thực thể phục vụ một số chức năng, không phải tất cả chúng đều cần thiết hoặc cần được xem xét trong mọi khung. Vấn đề cụ thể mà tôi đang làm việc trong đó vấn đề này hiện diện là một mô phỏng chi tiết của một cơ thể bao gồm các cơ quan của nó.

Trong trò chơi, mỗi sinh vật có cơ thể riêng biệt được tách thành các bộ phận nhỏ hơn (thân, chân, v.v.) và đôi khi những bộ phận này chứa các cơ quan, phục vụ một chức năng cụ thể trong cơ thể. Việc một cơ quan hiện đang phục vụ một mục đích hay đang hoạt động không bao giờ thực sự rõ ràng. Rốt cuộc, một con vật có thể có một dạ dày trống rỗng, do đó không cần phải tiêu hóa bất cứ thứ gì. Sẽ là khá vô lý khi kiểm tra hoặc mô phỏng mọi đối tượng trong mỗi khung hình và rất tốn kém ngay khi bạn có nhiều sinh vật trên thế giới. Vì vậy, tôi đã suy nghĩ về một cách để phân biệt thông minh giữa các đối tượng cần được cập nhật và những đối tượng không cần cập nhật.

Những gì tôi nghĩ ra có vẻ như là một giải pháp ít nhất là ok. Nó tạo ra một hàng đợi / ngăn xếp đơn giản (điều cần thiết là mỗi phần tử sẽ bị xóa ngay khi đọc; thứ tự không liên quan) được gọi là "ngăn xếp chú ý" nơi các đối tượng cần được mô phỏng cư trú. Các đối tượng cần chú ý chỉ đơn giản là tự đặt chúng lên ngăn xếp hoặc được đặt ở đó bởi các đối tượng khác. Những đối tượng này có thể sẽ thực hiện một giao diện đơn giản với hàm mô phỏng () -.

Áp dụng cho ví dụ tiêu hóa trước đây của tôi điều này có nghĩa là:

Người chơi chọn thứ gì đó để ăn (giả sử đó là bánh mì) từ kho đồ và đặt nó vào miệng nhân vật của mình và miệng được đặt vào ngăn xếp chú ý. Trong khung tiếp theo, miệng được lấy từ ngăn xếp và hàm mô phỏng () - của nó được gọi. Vì nó là một cái miệng nên sẽ rất hợp lý khi mô phỏng việc nhai ở đây. Điều này có thể diễn ra trong một vài khung hình trong đó miệng cứ tự đặt lên chồng cho đến khi nó quyết định thức ăn đã sẵn sàng để nuốt. Trong trường hợp này, miệng đặt bánh mì nhai vào dạ dày (tôi biết nó không trực tiếp đến đó, nhưng thực quản bị bỏ lại để đơn giản hóa), sau đó cũng được đưa vào ngăn xếp chú ý. Trong khung tiếp theo, mô phỏng quá trình tiêu hóa được bắt đầu. Và như vậy cho phần còn lại của các cơ quan cần thiết.

Một vấn đề có thể thấy trước với điều này là các đối tượng không hoạt động. Một con vật đang ngủ là một ví dụ tốt về điều này. Nó có thể được thực hiện như mô tả trước đây bằng cách giữ con vật đang ngủ trên đống và kiểm tra mỗi lần nếu nó cần thức dậy, nhưng điều đó có vẻ lãng phí vì đó là điều duy nhất được thực hiện. Để làm cho các đối tượng chạy không hiệu quả hơn, tôi đã lên kế hoạch thêm một loại lịch trình lưu trữ các công việc sẽ được thực hiện tại một thời điểm cụ thể. Nếu một con vật đi ngủ, nó sẽ đặt một công việc theo lịch trình đó sẽ được sắp xếp trong một khoảng thời gian nhất định sau khi con vật đi ngủ. Công việc này sau đó sẽ đảm nhiệm việc đưa con vật đang ngủ lên đống chú ý một lần nữa. Bây giờ, bạn có thể nói rằng một con vật đang ngủ không nằm trong nhóm chú ý có thể bỏ lỡ việc bị tấn công bởi thứ gì đó vì AI của nó không được mô phỏng,

Bây giờ, tôi thực sự không biết liệu điều này thậm chí có gần với một giải pháp tao nhã cho vấn đề này do thiếu kinh nghiệm hay không. Tôi có gần với một cái gì đó có thể sử dụng? Làm thế nào điều này thường được thực hiện hoặc có ai có bất kỳ đề xuất hoặc giải pháp tốt hơn?

Câu trả lời:


10

Đây chính xác là cách chúng tôi giải quyết vấn đề này trong Stendhal . Trong trường hợp của chúng tôi, có rất nhiều điều xảy ra theo định kỳ, nhưng không phải mỗi lượt: Phép thuật chữa bệnh, cây mọc xa hơn một chút, xác chết thoái hóa, vật phẩm trên mặt đất hết hạn.

Chúng tôi có một số lượt được tăng lên trong mỗi lượt. Và chúng tôi duy trì một bản đồ các số lần lượt trong tương lai chỉ vào một tập hợp các đối tượng cần được thông báo trong lượt đó.


Điều gì xảy ra nếu một cái gì đó tương tác với đối tượng trong khi đó? Ví dụ, động vật đang ngủ có thể bị đánh thức bởi một hòn đá. Bạn có nên loại bỏ lịch trình của động vật trong trường hợp đó?
Emiliano

Điều đó phụ thuộc vào tình huống: Nếu hành động được thực hiện là vô hại (như thức dậy trong khi đã thức) chúng ta chỉ để nó xảy ra. Nhưng nếu hành động sử dụng hết một số tài nguyên, chúng tôi sẽ tìm kiếm trong hàng đợi chờ và loại bỏ nó.
Hendrik Brummermann

14

Nghe có vẻ giống như một vấn đề tương tự như đầu vào: bạn có hơn 100 phím trên bàn phím nhưng không muốn kiểm tra từng phím riêng lẻ trên mỗi khung, vậy bạn phải làm gì?

Hai câu trả lời: bỏ phiếu hoặc tin nhắn hệ thống.

Bỏ phiếu = tại bất kỳ thời điểm nào khi nó thực sự quan trọng trong trò chơi, hãy truy vấn trạng thái của các phím trên bàn phím (hoặc các đối tượng, trong trường hợp của bạn). Thời gian còn lại, bỏ qua chúng.

Tin nhắn = có mỗi phím bàn phím (đối tượng) đặt một thứ gì đó vào hàng đợi tin nhắn khi nó được nhấn hoặc nhả ra (khi cần chú ý). Trên mỗi lần lặp của vòng lặp trò chơi, nó nhìn qua hàng đợi và giải quyết tất cả các tin nhắn trước khi tiếp tục.


10

Vì vậy, tôi sẽ lùi một bước để thực hiện và xem xét câu hỏi từ góc độ thiết kế. Bạn có kế hoạch chắc chắn để hiển thị tất cả các chi tiết bạn muốn đưa vào mô phỏng này không?

Ví dụ:

  • Người chơi có thể cho biết sự khác biệt giữa một con vật với cái bụng trống rỗng và một con vật có đầy đủ không?
  • Thông tin này có quan trọng với họ theo bất kỳ cách nào, khi họ đang đưa ra lựa chọn tương tác trong trò chơi của bạn không?
  • Người chơi có thể theo dõi con vật một cách nhất quán có thể dự đoán kết quả của các sự kiện mô phỏng của bạn không, hoặc liệu một con số ngẫu nhiên có đủ không?

Về cơ bản quy tắc chung là không làm cho mô phỏng của bạn phức tạp hơn đầu ra của nó. Vào cuối ngày nếu hoạt hình duy nhất bạn có cho cừu là gặm cỏ, ngủ, chạy trốn. Sau đó, thực sự không quan trọng có bao nhiêu yếu tố đi vào quyết định chọn trạng thái nào. Tất cả những người chơi sẽ thấy là những con cừu ngủ vào ban đêm, chạy khỏi nguy hiểm và ăn vào ban ngày.

Mô phỏng hành vi là một tấn thú vị để làm việc, nhưng luôn luôn ghi nhớ trải nghiệm của người dùng cuối.


Vâng, người chơi sẽ có thể nhận ra sự khác biệt và có một vài hiệu ứng này có trong trò chơi, nhưng nó giống như một 'mánh lới quảng cáo' để giải trí vào lúc này. Giống như hệ thống vết thương trong Pháo đài Lùn, cũng rất chi tiết nhưng không đáng kể. Nhưng như bạn đã đề cập, có rất nhiều niềm vui để làm việc và đó là trọng tâm chính của tôi ngay bây giờ.
Marc Müller

9

Tôi đã gặp một vấn đề tương tự trên một trò chơi mà tôi đã làm việc vài năm trước - việc mô phỏng các vật thể rất phức tạp và thực sự không thể thực hiện chi tiết trên mọi đối tượng trên thế giới.

Giải pháp là sử dụng khái niệm LOD để mô phỏng. Các đối tượng trong tầm nhìn của người chơi sẽ chạy mô phỏng đầy đủ. Các đối tượng ở xa người chơi đã chạy một mô phỏng rất đơn giản theo định kỳ. Khi các đối tượng xuất hiện trong tầm nhìn của người chơi, họ sẽ chuyển từ khóa học, cập nhật mô phỏng định kỳ sang các cập nhật thường xuyên, chi tiết.


2

Giải pháp với một lịch trình là tốt. Lưu ý rằng mọi thực thể nên có một danh sách các con trỏ tới các hành động trong tương lai của nó, điều này cho phép khả năng vô hiệu hóa các hành động trong tương lai nếu cần thiết. I E. động vật đang ngủ thức dậy ngay lập tức khi bị tấn công, vì vậy bạn phải vô hiệu hóa hành động đánh thức của nó trong tương lai.


1

Có một mẫu thiết kế cho việc này. Tôi nghĩ nó được gọi là Đối tượng cơ sở dữ liệu?

Về cơ bản, bạn giữ một con cừu "mẫu" có thể đại diện cho tất cả những con cừu không đặc biệt trong thế giới trò chơi, vẽ chúng theo cùng một cách, giữ dữ liệu duy nhất trong đối tượng mẫu, nói như một bảng về vị trí và / hoặc thời gian của cừu -Since-cắt. Sau đó, bất cứ khi nào bạn cần làm cho một con cừu trở nên độc đáo, bạn có thể tạo một ví dụ cụ thể để theo dõi con cừu độc đáo đó.

Điều tương tự cũng xảy ra với hình ảnh động. Nếu đó là một hoạt hình nhàn rỗi hoặc sự kiện phổ biến cho mọi trường hợp, có thể nằm trong thể hiện mẫu, trong đó các hoạt ảnh cụ thể hơn có thể được lên lịch riêng.

Cách đây rất lâu, tôi đã viết một trò chơi cho một cuộc thi lập trình mà vòng lặp chính chỉ gọi là animate () trên toàn bộ cảnh. Nó đã sử dụng các con trỏ hàm để thay thế các hình động nhàn rỗi bằng các hình khác theo yêu cầu và sử dụng kỹ thuật này để hỗ trợ hoạt hình được kế thừa (ví dụ: quay một nhân vật đứng trên đĩa quay).

Về bản chất, nó tương tự như sử dụng một đại biểu cho hoạt hình.


3
Mô hình bay bổng, ý bạn là gì?
topright

0

Một máy nhà nước sẽ làm việc? Con vật ở trạng thái ngủ, trạng thái ăn, trạng thái chạy, v.v ... Đối với mỗi trạng thái bạn liên kết một danh sách các cơ quan hoạt động. Vì vậy, mỗi khung hình bạn truy cập từng con vật, bật trạng thái, tra cứu danh sách các cơ quan cho trạng thái đó và thực hiện cập nhật trên từng cơ quan.


Tôi nghĩ rằng điều đó sẽ làm phức tạp mọi thứ bởi vì nó có thể xảy ra với nhiều thứ xảy ra trong động vật. Chẳng hạn, chỉ vì dạ dày đang tiêu hóa một thứ gì đó không có nghĩa là tim ngừng đập hoặc con vật ngừng đi lại. Chắc chắn, bạn có thể định nghĩa một tập hợp các trạng thái, mỗi trạng thái sẽ xem xét một số chức năng nhất định, nhưng số lượng trạng thái sẽ cực kỳ lớn.
Marc Müller

Nhiều điều có thể xảy ra cho mỗi trạng thái, bởi vì bạn lưu trữ tất cả các cơ quan hoạt động trên một trạng thái và thực hiện từng cơ quan từng khung. Mặc dù vậy, rất nhiều điều xảy ra trong mô phỏng của bạn có vẻ phù hợp với chuyển trạng thái. Ví dụ: Nhai -> Tiêu hóa. Nhưng tôi đoán bạn đúng rằng một con vật không thể chỉ có một trạng thái. Có những chuyển trạng thái xảy ra nói với các chi không liên quan đến chuyển trạng thái xảy ra trong hệ thống tiêu hóa. Nhưng có lẽ nó chỉ phức tạp hơn những gì bạn có. Chỉ cần nghĩ rằng nó có thể là một cái gì đó để xem xét.
Erik Engheim
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.