Vai trò của các hệ thống trên mạng trong một kiến ​​trúc thực thể dựa trên thành phần là gì?


177

Tôi đã đọc rất nhiều về các thành phần và hệ thống thực thể và đã nghĩ rằng ý tưởng về một thực thể chỉ là một ID khá thú vị.

Tuy nhiên tôi không biết làm thế nào điều này hoàn toàn hoạt động với khía cạnh thành phần hoặc khía cạnh hệ thống. Một thành phần chỉ là một đối tượng dữ liệu được quản lý bởi một số hệ thống có liên quan. Một hệ thống va chạm sử dụng một số BoundComponent cùng với cấu trúc dữ liệu không gian để xác định xem có xảy ra va chạm hay không.

Tất cả đều tốt cho đến nay, nhưng nếu nhiều hệ thống cần truy cập vào cùng một thành phần thì sao? Dữ liệu nên sống ở đâu? Một hệ thống đầu vào có thể sửa đổi một thực thể BoundComponent, nhưng (các) hệ thống vật lý cần truy cập vào cùng một thành phần như một số hệ thống kết xuất.

Ngoài ra, các thực thể được xây dựng như thế nào? Một trong những lợi thế tôi đã đọc rất nhiều là sự linh hoạt trong xây dựng thực thể. Là các hệ thống thực chất gắn liền với một thành phần? Nếu tôi muốn giới thiệu một số thành phần mới, tôi cũng phải giới thiệu một hệ thống mới hoặc sửa đổi một hệ thống hiện có?

Một điều khác mà tôi thường đọc là 'loại' của một thực thể được suy luận bởi những thành phần mà nó có. Nếu thực thể của tôi chỉ là một id, làm sao tôi có thể biết rằng thực thể robot của tôi cần phải được di chuyển hoặc kết xuất và do đó được sửa đổi bởi một số hệ thống?

Xin lỗi vì bài viết dài (hoặc ít nhất là có vẻ như vậy từ màn hình điện thoại của tôi)!

Câu trả lời:


336

Có vô số cách để đại diện và thực hiện các hệ thống thành phần thực thể, nhưng đây là một lời giải thích về một cách. Hãy nhớ rằng không có định nghĩa cụ thể về kiến ​​trúc thực thể / thành phần / hệ thống, vì vậy đây chỉ là một triển khai.

Tôi sẽ giới thiệu một sự tương tự cho các kiến ​​trúc thực thể / thành phần / hệ thống có thể giúp ích. Hãy nghĩ về một thực thể như một chiếc chìa khóa.

Thực thể

Khóa thực thể

Chìa khóa cũng có răng (màu xanh đậm). Răng của khóa thực thể của chúng ta là các thành phần tạo nên nó. Bạn có thể phân biệt các thực thể bằng ID của chúng, ngay cả khi chúng có cùng răng. Vì vậy, những gì các phím phù hợp với? Khóa. Khóa là hệ thống của chúng tôi. Ví dụ, một hệ thống chuyển động.

Hệ thống

Khóa hệ thống chuyển động

Khóa chỉ hoạt động nếu khóa của chúng ta có răng cho cả vị trí và vận tốc. Hệ thống này chỉ xử lý các thực thể có vị trí và vận tốc. Có nhiều cách để thiết lập cách các hệ thống này nhận ra các thực thể cần xử lý, nhưng một cách là sử dụng a long. Mỗi bit được dành riêng cho một loại thành phần. Ví dụ của chúng tôi, giả sử loại 4 bit thay vì dài 64 bit. Thực thể ví dụ của chúng tôi sẽ có tất cả các thành phần có sẵn. Vì vậy, nó là chìa khóa 1111. Sau đó, hệ thống đang tìm kiếm bất kỳ thực thể nào có a 11--. (Đại -diện không quan tâm, bởi vì chuyển động không quan tâm nếu có sprite hoặc sức khỏe). Nó có thể kiểm tra một thực thể với một ANDhoạt động đơn giản . Vì vậy, thực thể của chúng tôi phù hợp nếu ((1111 & 1100) == 1100). Nếu tôi mất bạn ở đó, hãy kiểm tra thêm về các hoạt động bitwise .

Như bạn có thể thấy, các hệ thống có quyền truy cập vào các tài nguyên bên ngoài. Họ có thể truy cập thời gian, đồ họa, âm thanh và như vậy. Chúng chỉ đơn giản là các bộ xử lý nhỏ, mỗi lần lấy một khóa và xử lý dữ liệu. Bạn thấy rằng hệ thống chuyển động có vận tốc, thời gian và vị trí delta; sau đó thực hiện một số tính toán và lưu trữ kết quả trở lại vị trí.

Các khóa thực thể rất dễ tạo ra. Bạn có thể thêm hoặc loại bỏ chúng theo ý muốn. Thực thể không quan tâm, đó chỉ là một cách để nhóm và giữ các thành phần. Các thành phần không có sự phụ thuộc lẫn nhau. Các thành phần gần nhất có thể tương tác với nhau là khi một hệ thống hoạt động trên chúng và sử dụng dữ liệu từ cái này để cập nhật cái khác, như ví dụ chuyển động của chúng tôi.

Hãy xem xét một hệ thống khác để giúp củng cố ý tưởng:

Vẽ khóa hệ thống

Đây là hệ thống vẽ của chúng tôi. Nó tìm kiếm các thành phần phù hợp 1-1-. Thực thể này phù hợp bởi vì: ((1111 & 1010) == 1010)Ngoài ra, bạn có thể thấy hệ thống này xuất thông tin ra màn hình, bằng cách vẽ sprite thực thể ở vị trí của nó.

OK, một cái nữa. Chúng ta hãy nhìn vào một thực thể khác và xem làm thế nào nó có thể phù hợp với ví dụ của chúng ta cho đến nay.

Khóa thực thể không di chuyển

Như bạn có thể thấy, thực thể này có ít thành phần gắn liền với nó. Bằng cách nhìn vào các thành phần mà nó có, có vẻ như nó có thể là một vật tĩnh như đá. Nó chỉ có một vị trí và một sprite. Nó sẽ không di chuyển và nó sẽ không bị ảnh hưởng bởi bất kỳ thay đổi sức khỏe. Thực thể này sẽ tạo ra khóa 1010. Vậy hệ thống nào hoạt động trên thực thể này? Hãy kiểm tra:

Chống lại hệ thống phong trào của chúng tôi: ((1010 & 1100) != 1100)Không. Có vẻ như hệ thống chuyển động không quan tâm đến thực thể này, vì nó không có các thành phần cần thiết.

Chống lại hệ thống vẽ của chúng tôi: ((1010 & 1010) == 1010)Này, đó là một trận đấu. Thực thể này sẽ được vận hành trên hệ thống bản vẽ. Hệ thống vẽ sẽ vẽ sprite tại vị trí được xác định.


Hy vọng rằng bạn có thể thấy việc bây giờ dễ dàng như thế nào khi thêm một hệ thống khác sẽ lấy các thành phần của chúng tôi và vận hành trên chúng. Hãy để tôi đảm bảo tôi đã giải quyết các câu hỏi của bạn:

Điều gì xảy ra nếu nhiều hệ thống cần truy cập vào cùng một thành phần? Dữ liệu nên sống ở đâu?

Thông thường, các hệ thống hoạt động cái khác. Họ xử lý tất cả các thực thể phù hợp với yêu cầu của họ, sau đó hệ thống tiếp theo cũng làm như vậy và cứ thế. Các dữ liệu sống với thực thể. Không nên có bất cứ thứ gì được lưu trữ trong hệ thống, đó chỉ là một khóa được bật, chìa khóa là nơi thông tin lưu lại và chuyển từ khóa này sang khóa khác.

Các thực thể được xây dựng như thế nào? Là các hệ thống thực chất gắn liền với một thành phần? Nếu tôi muốn giới thiệu một số thành phần mới, tôi cũng phải giới thiệu một hệ thống mới hoặc sửa đổi một hệ thống hiện có?

Các thực thể chỉ là túi của các thành phần. Họ có một ID duy nhất và một danh sách các thành phần. Các hệ thống chỉ được gắn với các thành phần theo cách được mô tả ở trên. Bạn có thể có các thành phần mà không có hệ thống hoạt động trên chúng, nhưng điều đó khá vô nghĩa. Tương tự, bạn có thể có các hệ thống đang tìm kiếm các thành phần mà không có thực thể nào có. Điều đó ít vô nghĩa hơn, bởi vì họ có thể đang chờ đợi một thực thể được tạo ra phù hợp với khóa của họ. Vì vậy, vâng, nếu bạn giới thiệu một thành phần mới, bạn muốn tạo ra một hệ thống sử dụng thành phần đó. Nếu không, bạn chỉ cần thêm răng vào chìa khóa của bạn cho một khóa không tồn tại.

Nếu thực thể của tôi chỉ là một id, làm sao tôi có thể biết rằng thực thể robot của tôi cần phải được di chuyển hoặc kết xuất và do đó được sửa đổi bởi một số hệ thống?

Tôi nghĩ rằng tôi trả lời điều này với ý tưởng về một longkhóa xác định các thành phần có trong một thực thể. Bạn biết vì chìa khóa phù hợp với khóa.

Phù! Đó là một bài viết dài! (Hoặc ít nhất có vẻ như vậy từ màn hình lớn của tôi.)


23
Sự tương tự quan trọng này thực sự hữu ích để hiểu toàn bộ ý tưởng bây giờ. Ý tưởng tuyệt vời! Lol ở đoạn cuối của bạn :)
bio595

16
+1 Đối với lời giải thích tốt nhất và tốt nhất về hệ thống thành phần thực thể tôi từng thấy. : Ôi!
hiệp sĩ666

7
-1 từ tôi - không phải vì đây là một cách tiếp cận tồi, mà bởi vì nó được miêu tả là cách tiếp cận. Tuy nhiên, có nhiều hệ thống không có sự tách biệt giữa các thành phần và dịch vụ (ví dụ: trong Unity) và có những cách đơn giản hơn để các hệ thống biết thực thể nào sẽ xử lý (chỉ cần thêm chúng khi thực thể được tạo).
Kylotan

37
@Kylotan Tôi có nói " Có nhiều cách để thiết lập cách các hệ thống này nhận ra thực thể nào cần xử lý, nhưng một cách là sử dụng một long. " Ngoài ra, tôi thường dành phiếu bầu cho những câu trả lời không hữu ích (như văn bản di chuột nói). Tôi nghĩ rằng bạn sẽ dành nhiều thời gian để bỏ phiếu nếu bạn đã làm điều đó cho tất cả các câu trả lời không bao gồm 100% các chủ đề họ đang giải quyết.
MichaelHouse

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.