Lợi ích của việc sử dụng hệ thống ID thực thể là gì?


12

Tôi hiện đang đọc cuốn sách Lập trình trò chơi AI bằng ví dụ.

Cuốn sách đề cập đến việc gán số ID duy nhất cho mỗi thực thể trong trò chơi. Thông thường khi thực thể A cần liên hệ với thực thể B , A nhận được tham chiếu đến B bằng cách gửi số ID của B đến một lớp EntityDatabase . Lớp này nhận số ID và trả về các tham chiếu đến các thực thể.

Số ID của một số thực thể cũng có thể được tìm nạp từ một tệp chứa ID của một số thực thể (các nhân vật trong trò chơi chính).

Câu hỏi của tôi là: Tại sao tôi sẽ làm điều này? Tại sao tôi không thể làm việc trực tiếp với tài liệu tham khảo? Có đôi khi khó khăn để có được một tài liệu tham khảo trực tiếp? Là sử dụng một hệ thống ID là một cách tiếp cận phổ biến? Có những trò chơi không sử dụng ID?

Tôi mới phát triển trò chơi. Vui lòng giải thích lợi ích của việc làm việc với hệ thống ID thực thể. Những ưu điểm và nhược điểm. Ví dụ cụ thể sẽ là tuyệt vời. Cảm ơn

Câu trả lời:


18

Tài liệu tham khảo hoạt động tốt cho nhiều tình huống. Tuy nhiên, có ba tình huống quan trọng trong đó tài liệu tham khảo sẽ không hoạt động tốt:

  • Mạng . Khi gửi thông tin về việc đồng bộ hóa trạng thái của các thực thể qua mạng, các tham chiếu không thể được sử dụng. Bạn sẽ cần xác định thực thể theo một cách nào đó để các máy từ xa biết bạn đang nói về ai.
  • Lưu / tải . Khi lưu trạng thái trò chơi của bạn vào đĩa, các tham chiếu đối tượng không thể đi cùng với nó. Điều đó có nghĩa là khi bạn đang tải trạng thái, Thực thể A có Thực thể B được nhắm mục tiêu bởi một tham chiếu không còn biết nhắm mục tiêu vào ai. Các vị trí bộ nhớ là khác nhau, các đối tượng là khác nhau.

  • Quản lý bộ nhớ . Có một vị trí trung tâm để lưu trữ các tham chiếu có nghĩa là khi xóa một thực thể, bạn không phải đi qua tất cả các thực thể của mình và xóa các tham chiếu đến nó để bộ nhớ được dọn sạch. Tài liệu tham khảo chỉ nên được sử dụng khi cần thiết, sau đó loại bỏ trong bất kỳ thực thể nào khác. Giảm số lượng tham chiếu đảm bảo bạn không có các thực thể zombie chỉ được tham chiếu bởi điều cuối cùng mà chúng tương tác với hoặc một số thực thể khác. Điều này cũng giúp tránh các tham chiếu null với cách kiểm tra chuẩn hóa nếu một thực thể vẫn tồn tại.


2
đoạn cuối nên là một gạch đầu dòng của chính nó (quản lý bộ nhớ). Có những tình huống trong đó một lớp cần một tham chiếu đến một thực thể khác trong một thời gian, nhưng tham chiếu thực thể có thể trở nên không hợp lệ (tức là thực thể đích của mục tiêu đã chết). Bằng cách trả về NULL khi yêu cầu một thực thể bằng ID, mỗi lớp chịu trách nhiệm thực hiện đúng (thay vì sụp đổ) khi tham chiếu thực thể trở nên không hợp lệ.
Tìm hiểuCocos2D

Cảm ơn đã trả lời. Một câu hỏi để làm rõ. Nói chung: Trong trường hợp thực thể A cần tham chiếu đến thực thể B (để tấn công nó, hãy gửi tin nhắn, kiểm tra xung đột với nó hoặc bất kỳ lý do nào khác) - Tôi có nên sử dụng hệ thống ID để có được nó, hoặc đôi khi nó có thể được tham khảo trực tiếp? Ý nghĩa: Có nên thực thể A luôn nhận được tham chiếu từ EntityManager bằng cách gửi ID của thực thể B (tham chiếu chéo các tham chiếu thực thể và số ID), và sau đó chỉ liên hệ với thực thể B bằng cách sử dụng tham chiếu từ EntityManager? Tôi có nên luôn luôn sử dụng hệ thống ID?
Aviv Cohn

Hoặc đôi khi có được để có được tài liệu tham khảo trực tiếp? Nói cách khác, khi nào thực thể A tôi nên sử dụng EntityManager để có được tham chiếu được lưu trữ bên trong nó và khi nào thực thể A có thể tìm nạp một tham chiếu đến B bằng bất kỳ phương tiện nào?
Aviv Cohn

Không có câu trả lời chính xác cho điều đó. Cá nhân, tôi sẽ thiết kế hệ thống thực thể độc lập với logic trò chơi. Điều đó có nghĩa là logic trò chơi thậm chí không có quyền truy cập vào các tham chiếu thực thể trực tiếp. Về cơ bản, tôi sẽ tránh duy trì bất kỳ tham chiếu nào đến một thực thể nằm ngoài phạm vi cục bộ của phương thức hiện tại. Điều đó có nghĩa là sử dụng EntityManager mỗi lần trước khi vận hành trên các thành phần của thực thể.
MichaelHouse

Tôi hiểu rồi. Hãy để tôi sử dụng một ví dụ để xem nếu tôi hiểu ý của bạn. Giả sử tôi đang sử dụng lưới đồng nhất để phát hiện va chạm. Lưới là một mảng 2d. Mỗi thực thể chỉ được kiểm tra xung đột với các thực thể trong cùng một 'ô' trong lưới. Sử dụng phương pháp "thông thường", mỗi ô sẽ chứa các tham chiếu đến các đối tượng GameEntity trong khu vực mà nó đại diện. Sử dụng phương pháp "hệ thống ID", mỗi ô sẽ chứa số ID của các thực thể. Những số này sẽ được gửi đến EntityManager để nhận các tài liệu tham khảo cụ thể để thực hiện phát hiện va chạm. Đây có phải là một sự hiểu biết tốt?
Aviv Cohn

2

Một điều cuối cùng là nếu bạn đang sử dụng mẫu Object Pool và một thực thể được đặt lại vì sinh vật đã chết (chẳng hạn) và được trả lời ở một nơi khác, một tham chiếu vẫn sẽ trỏ đến cùng một thực thể (lỗi) và ID sẽ không còn tồn tại có hiệu lực.

ID 5067 điểm để xử lý 0x8765 sinh vật chết và một ID sinh vật mới sinh ra được đặt lại thành 7073 Ai đó kiểm tra ID 5067, nó trỏ đến 0x8765 nhưng sinh vật đó hiện đã được đăng ký với ID 7073 nên cơ sở dữ liệu ID thực thể biết bạn đã sử dụng ID lỗi thời và thông báo cho bạn, sinh vật bạn đã cố gắng tiếp cận không còn hoạt động.

Đó và tất cả những lý do tuyệt vời mà Byte56 đề cập là lý do tại sao nó là một thiết kế tốt để tránh sử dụng tài liệu tham khảo trực tiếp.

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.