Hệ thống thành phần thực thể - Làm thế nào để thực hiện Biến đổi của một đối tượng?


11

Khi thiết kế một hệ thống thành phần thực thể cho động cơ của tôi, tôi đã gặp một chút trở ngại trong cách lưu trữ và truy xuất một loại thành phần cụ thể.

Trước tiên, hãy để tôi thiết lập một chút thuật ngữ tôi sẽ sử dụng trong câu hỏi này:

  • Tôi gọi " Thành phần " là cấu trúc dữ liệu lưu trữ dữ liệu liên quan cho một hệ thống cụ thể.
  • Tôi gọi " Hệ thống " là tổng hợp các phương thức và cấu trúc dữ liệu sử dụng Thành phần để cập nhật trạng thái / giao diện trò chơi với người dùng.
  • " Thực thể " về cơ bản chỉ là một ID được sử dụng để truy xuất các thành phần cụ thể và sửa đổi dữ liệu của chúng trong logic trò chơi.

Mỗi hệ thống sở hữu một mảng (ánh xạ ID) thuộc loại Thành phần (Ví dụ: Vật lý-> Vật lý, AI-> AIComponent, Rendering-> RenderingComponent), để nó có thể lặp lại hiệu quả trên dữ liệu.

Tuy nhiên, không phải tất cả các thành phần được sở hữu đặc biệt bởi một hệ thống. Ví dụ, thành phần Transform lưu trữ vị trí, góc quay và tỷ lệ của đối tượng. Đây là một trong những phần quan trọng nhất của một thực thể (Unity làm cho nó bắt buộc, thậm chí), vì nó được sử dụng bởi rất nhiều hệ thống, ví dụ: Vật lý, AI, Kết xuất, v.v.

Đây là vấn đề tôi gặp phải. Do Transform được sử dụng bởi rất nhiều hệ thống khác, tôi nên lấy về một hệ thống để sử dụng cho từng Thành phần như thế nào? Một giải pháp khả thi tôi thấy là làm cho mỗi Thành phần lưu trữ ID thực thể của riêng mình. Thật dễ dàng để lấy bất kỳ thành phần nào như thế này, nhưng nó sẽ không hiệu quả và nó cũng đi ngược lại khái niệm Thành phần như một gói dữ liệu độc lập và độc lập, không biết đến bất kỳ thành phần nào khác.

Có một cách thích hợp để giải quyết vấn đề này? Biến đổi thậm chí có nên là một thành phần?


3
+1 cho "Đầu tiên, hãy để tôi thiết lập một chút thuật ngữ tôi sẽ sử dụng trong câu hỏi này:"
Vaillancourt

Tôi rất thích xem loại câu hỏi này nhiều hơn trong trang web này. +1
S. Tarık Çetin

Chỉ cần lưu trữ tất cả các thành phần dưới dạng các biến toàn cục
Miles Rout

Câu trả lời:


2

Đây là một câu hỏi khá rộng, câu trả lời, phụ thuộc rất nhiều vào kiến ​​trúc của bạn. Tuy nhiên, tôi sẽ cố gắng cung cấp cho bạn một câu trả lời chung chung.

Hệ thống vật lý và kết xuất của bạn chắc chắn sẽ yêu cầu chuyển đổi, tuy nhiên, hệ thống AI sẽ không. Do đó, việc đóng gói biến đổi thành lớp thành phần của riêng nó là điều hợp lý. Tất cả các hệ thống quan tâm như vậy sẽ sử dụng cùng một dữ liệu, do đó, thật hợp lý khi thực thể có một con trỏ tới đối tượng biến đổi hoặc id cho một đối tượng biến đổi được lưu trữ ở nơi khác.

Nếu bạn chọn giải pháp sau, thì mỗi hệ thống quan tâm đến một biến đổi sẽ yêu cầu quyền truy cập vào bất cứ nơi nào đối tượng biến đổi được lưu trữ.

Nếu bạn chọn cái trước, thì tất cả mỗi hệ thống cần làm là truy cập vào chính thực thể đó và yêu cầu biến đổi.

Trong trường hợp trước, vấn đề trở thành làm thế nào để cấp quyền truy cập vào bộ lưu trữ cho các biến đổi cho từng hệ thống, mà không vi phạm các quy tắc OOP, nếu bạn quan tâm đến những điều đó.

Trường hợp sau không có vấn đề như vậy, nhưng yêu cầu thay đổi thiết kế đối tượng thực thể của bạn để lưu trữ con trỏ vào các đối tượng thay vì id của các đối tượng thành phần.

Sở thích cá nhân của tôi là thiết kế lớp thực thể để lưu trữ các con trỏ tới các đối tượng thành phần, vì nó đơn giản hóa nhiều vấn đề thiết kế. Theo cách này, mỗi hệ thống yêu cầu chuyển đổi có thể yêu cầu nó từ thực thể và bỏ qua nó nếu không có. Tuy nhiên, điều này không mang một chi phí tính toán vốn có cho con trỏ, đó là chi phí của bộ nhớ cache bị mất.

Hãy xem Tổng quan về ECS này để biết thêm thông tin về điều này.

Vào cuối ngày, tùy bạn quyết định cái nào quan trọng hơn với bạn: dễ phát triển hoặc hiệu suất.

Cuối cùng, tôi sẽ chỉ ra rằng câu hỏi của bạn là một ví dụ tuyệt vời cho các câu hỏi thiết kế mà những người đề xuất ECS nghĩ đến, và không có giải pháp viên đạn bạc dứt khoát nào.


Cảm ơn lời đề nghị của bạn. Tôi có một câu hỏi, mặc dù: tại sao hệ thống AI không cần vị trí của một đối tượng?
CRefice

Bạn đang nhầm lẫn vị trí (vectơ 3 phao) với một Bản dịch (ma trận biến đổi được xây dựng từ một vectơ vị trí). Một ma trận biến đổi được xây dựng từ các phép biến đổi dịch, xoay và tỷ lệ. Đây là thông tin nhiều hơn nhiều so với một hệ thống AI sẽ cần, mặc dù bạn chắc chắn có thể trích xuất vectơ vị trí từ nó. Cá nhân, tôi sẽ tách vị trí, định hướng và kích thước thành thành phần của riêng họ và sử dụng chúng để tạo và cập nhật Biến đổi.
Ian Young

@IanYoung Tách chúng có thể gây hại nhiều hơn lợi, có khả năng nếu bạn thấy bạn cần vị trí và định hướng cùng nhau thường xuyên hơn so với việc bạn định vị hoặc định hướng riêng biệt. Trong trường hợp đó, việc đặt các thuộc tính dữ liệu vị trí và định hướng trong một thành phần có thể cải thiện hiệu suất bộ đệm.
Naros

1
Sở thích của tôi là kết hợp cả ba, vị trí, định hướng và tỷ lệ thành một thành phần duy nhất và trong trường hợp một phân ngành cụ thể chỉ cần một vị trí hoặc định hướng, tôi sẽ ủng hộ sao chép dữ liệu và đồng bộ hóa chúng tại các điểm được xác định rõ ràng trong vòng lặp trò chơi .
Naros

@Naros vâng, đây là ý của tôi: Hai Thành phần, Biến đổi và (trong khung của tôi) SpatialData, chứa vị trí, vận tốc, định hướng và vận tốc góc. Vị trí và hướng được sử dụng để xây dựng và cập nhật Transform.
Ian Young
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.