Làm thế nào một người sẽ lưu trữ dữ liệu bối cảnh toàn cầu trong một hệ thống thành phần thực thể?


10

Câu hỏi của tôi là:

Làm thế nào một người sẽ lưu trữ dữ liệu bối cảnh toàn cầu, tức là. thông tin dữ liệu thế giới, thời gian thế giới hiện tại, vv trong một hệ thống thành phần thực thể?

Tôi nghĩ đến việc xây dựng một trò chơi mô phỏng thế giới kết thúc mở theo kiểu Pháo đài Lùn trong C ++. Tôi đã xây dựng một công cụ trò chơi theo phong cách thành phần thực thể chỉ để giải trí và hiện tôi đang cố gắng tìm ra cách tôi sẽ làm việc trong tất cả các tính năng tôi muốn. Ngoài việc chơi trò chơi tiêu chuẩn (kết xuất, vật lý, dữ liệu thành phần cụ thể, v.v.), tôi cũng muốn có một số dữ liệu theo ngữ cảnh toàn cầu mà tất cả các hệ thống có liên quan sẽ có quyền truy cập (ví dụ: dữ liệu thế giới như năm nay , cho dù sự nóng lên toàn cầu đang xảy ra, Bất kỳ loại điều nào có liên quan đến việc mô phỏng một thế giới). Ban đầu tôi đã nghĩ đến việc tạo ra một thành phần "thế giới", nhưng điều này dường như vô nghĩa và khó khăn nếu rất nhiều hệ thống khác nhau cần truy cập vào dữ liệu "toàn cầu" logic này.

Sẽ có ý nghĩa khi có một thành phần "thế giới" hay tôi nên lưu trữ dữ liệu này theo cách khác?

Tôi cũng đã nghĩ đơn giản là làm cho dữ liệu này trở nên toàn cầu, do đó cho phép truy cập vào bất kỳ hệ thống nào muốn sử dụng nó; Nó có vẻ như vi phạm các nguyên tắc thành phần thực thể nói chung, và có thể lộn xộn vì những lý do khác, nhưng tôi nghĩ rằng nó có thể thực sự hoạt động.

Một điều khác tôi nghĩ sẽ là thực sự nhúng dữ liệu bối cảnh thế giới có liên quan trực tiếp vào chính các hệ thống. Ví dụ: nếu tôi có một AgeSystem"tuổi" tất cả các thực thể có getsWeakerAsTimePassesthành phần hoặc không có gì, thì có lẽ hệ thống này có thể lưu trữ dữ liệu thời gian có liên quan cho thế giới dưới dạng dữ liệu thành viên mà nó sẽ sử dụng để tính thời gian trôi qua và bao nhiêu tuổi tác và những người yếu đuối, v.v. Lựa chọn thứ ba này là thứ tôi thích nhất, nhưng điều gì đó đã xảy ra với tôi trong việc động não.

Ai có thể tư vấn?


3
Cơ sở lý luận cho downvote là lịch sự và hữu ích cho không chỉ OP, mà cả những người dùng khác.
MichaelHouse

2
Bạn đã xây dựng một cái búa và bây giờ mọi thứ trông giống như một cái đinh. Tôi cho phép bạn sử dụng nhiều hơn chỉ ECS để giữ và thao tác dữ liệu trong chương trình của bạn vì không phải mọi thứ đều là đinh.
Patrick Hughes

Câu trả lời:


10

Bất kỳ cách nào hoạt động là một cách làm việc. Nghe có vẻ khụt khịt, nhưng thực sự, trò chơi của bạn quan trọng hơn 1000 lần so với kiến ​​trúc của bạn. Chọn bất kỳ phương pháp nào bạn thích và thấy dễ sử dụng.

Những trò chơi tôi đã thấy trong các trò chơi vận chuyển thực tế (sử dụng thiết kế dựa trên thành phần, không phải ECS cụ thể; Tôi chưa bao giờ thấy ECS thuần túy "trong tự nhiên", mặc dù nhiều thiết kế thành phần có các yếu tố giống ECS ​​với chúng) bao gồm:

  • Người độc thân
  • Các đối tượng "Bối cảnh" được chuyển đến các thành phần / hệ thống có chứa các tham chiếu đến tất cả các hệ thống khác có liên quan
  • Các nhà máy linh kiện vượt qua các hệ thống xử lý cho các thành phần riêng lẻ
  • Các thành phần lưu trữ các tham chiếu đến các hệ thống trong thư mục gốc của hệ thống phân cấp đối tượng (chỉ trong một số trò chơi Unity lẻ bóng)
  • Các đối tượng "Động cơ" đơn lẻ được chuyển đến các hệ thống hoặc thành phần chứa tham chiếu đến tất cả các hệ thống khác
  • Các hệ thống tra cứu tài nguyên dựa trên chuỗi (cho phép bạn trong C ++ thực hiện một cái gì đó như handle<PhysicsSystem> = GetResource<PhysicsSystem>("/systems/physics"), vâng, thực sự)
  • Các đống dữ liệu toàn cầu và các hàm miễn phí kiểu C hoạt động trên chúng
  • Không gian / không gian convideo đi kèm

Tất cả đều hoạt động. Tôi nắm bắt được một số cách tiếp cận và yêu thích rõ ràng, nhưng tất cả chúng đều được sử dụng để vận chuyển các trò chơi AAA. Đôi khi nhiều cách tiếp cận trong một dự án duy nhất (40 - 100 nhóm kỹ sư có xu hướng tạo mã trùng lặp, than ôi).


2
Tôi tò mò muốn biết đó là yêu thích rõ ràng của bạn.
tro999

Các liên kết tôi cung cấp là cho các slide của tôi và một video về tôi nói chuyện về chủ đề này, nếu đó là bất kỳ gợi ý nào. :)
Sean Middleditch

Ah, vậy yêu thích của bạn là không gian / không gian con rồi. :)
tro999

Câu trả lời chính xác. Tôi nghĩ rằng tôi đã có một cái gì đó được giải quyết, và tôi thực sự đã đi trước và kết hợp khái niệm "không gian / không gian con" vào giao diện của tôi.
Awesomania
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.