Lưu trữ các đối tượng trò chơi trong nhiều container


7

Trong ánh sáng của DRY , có vẻ như chỉ mong muốn lưu trữ một bộ sưu tập các đối tượng trò chơi liên quan trong một container. Tuy nhiên, người ta có thể cần các bộ sưu tập phụ của các đối tượng này trong các bối cảnh khác nhau. Có thể lưu trữ hợp lý các bộ phụ cụ thể này trong các thùng chứa phù hợp hơn. Điều này làm tăng nỗ lực theo dõi các đối tượng trên các container, ví dụ như khi các đối tượng bị xóa khỏi thế giới trò chơi.

Các khả năng để đơn giản hóa một thiết kế như vậy là gì và sự đánh đổi điển hình là gì?

Để minh họa:

Trong trò chơi nhập vai nhiều người chơi, máy chủ có thể chứa một bộ sưu tập các nhân vật trong bản đồ phù hợp để tra cứu theo id.

world
    map<id, Character> allCharacters

Một nhân vật cũng có thể cư trú ở một cấp độ trò chơi nhất định. Để xác định tất cả các nhân vật có mặt ở một cấp độ, có vẻ phù hợp để giới thiệu một thùng chứa cho mỗi cấp độ chứa các ký tự hiện có trên đó. Bằng cách này bạn có thể thực thi logic chung cho tất cả các ký tự ở cấp độ đó.

world
    map<id, Character> allCharacters

    [levels]
        level1
           vector<Character> charactersOnPlayfield
        level2
           vector<Character> charactersOnPlayfield
        ...

Đi xa hơn nữa, khi một nhân vật tương tác với các thông điệp thế giới chỉ nên được chuyển đến các nhân vật trong phạm vi. Việc quản lý sở thích này có thể đạt được bằng cách chia mỗi cấp thành một lưới các ô, mỗi ô lần lượt lưu trữ các ký tự hiện đang đứng trên đó.

world
    map<id, Character> allCharacters

    [levels]
        level1
           vector<Character> charactersOnPlayfield
           [cells]
               cell1
                   vector<Character> charactersOnCell
               cell2
                   vector<Character> charactersOnCell
               ...
        level2
           vector<Character> charactersOnPlayfield
           [cells]
               cell1
                   vector<Character> charactersOnCell
               cell2
                   vector<Character> charactersOnCell
               ...
        ...

Các đối tượng Nhân vật ở các mức độ trừu tượng khác nhau đưa ra nhu cầu suy nghĩ cẩn thận về quyền sở hữu đối tượng và thời gian sống.

Lưu ý rằng các đối tượng Ký tự được lưu trữ trong các thùng chứa sẽ tự nhiên là các tham chiếu, không phải là bản sao. Ngoài ra, tôi giả định rằng không có bộ sưu tập rác tại chỗ.

Câu trả lời:


6

Tôi sẽ khuyên bạn không nên thực sự có nhiều danh sách như vậy và thay vào đó hãy sử dụng một số loại thư viện tín hiệu / khe cắm thay thế (về cơ bản là mẫu quan sát) để làm cho việc "gọi một hàm trên tất cả các đối tượng trong vùng / vùng này" dễ dàng hơn.

Các đối tượng có thể quản lý tín hiệu nào họ kết nối với chính mình khá dễ dàng, tức là mỗi khi họ di chuyển, họ ngắt kết nối với tín hiệu đại diện cho khe cũ của họ và kết nối với tín hiệu mới, nếu bạn sẽ trở thành hạt mịn đó.


Điều đó, hoặc bằng cách xây dựng các bộ sưu tập chỉ có thể quan sát / được lọc mà dựa vào nội dung của chúng từ bộ sưu tập khác. Ngoài ra, bạn có thể xây dựng các bộ sưu tập được phân vùng có thể được xem theo các bộ sưu tập con (một bộ đại diện cho mỗi 'phân vùng') hoặc toàn bộ bộ sưu tập (tổng hợp). Tôi thường đi theo một trong những cách tiếp cận đó trừ khi có một số lý do thuyết phục để một đối tượng có tư cách thành viên riêng biệt trong các bộ sưu tập riêng biệt (thông thường, không có). Trong cả hai trường hợp, bạn cần xem xét truy cập đồng thời và có thể bạn sẽ muốn khả năng chụp nhanh / phiên bản.
Mike Strobel

3

Mọi nhân vật nên, bằng cách này hay cách khác, biết tất cả các container chứa trong đó. Điều đó có thể rõ ràng (một danh sách thực tế của các container tham chiếu đến nó), có thể tính toán được (tọa độ ký tự được lưu trữ, từ đó các vectơ ô thực tế có thể được lấy ) hoặc không được nói ("các ký tự cũng có thể được lưu trữ trong bất kỳ danh sách nào trong sáu danh sách này và tôi sẽ không bận tâm theo dõi danh sách nào"). Hoặc bất kỳ sự kết hợp của ba. Phần quan trọng là thật dễ dàng và hiệu quả để tìm mọi vị trí nhìn vào một nhân vật.

Cũng cần có một bộ lưu trữ chính tắc lưu trữ mọi nhân vật trong trò chơi, chẳng hạn như bản đồ allChar character của bạn trên đó.

Một nhân vật còn sống nếu và chỉ khi nó chứa trong allChar character. Nếu bạn muốn xóa nó khỏi allChar character, bạn xóa nó khỏi mọi container chứa nó (mà theo đoạn đầu tiên, sẽ có hiệu quả hợp lý) và bạn đã thiết lập.

Điều này giả định rằng bạn không có bộ sưu tập rác - nếu bạn làm như vậy, bạn hầu như có thể thoát khỏi việc để cho GC chăm sóc nó. Nếu bạn kết thúc với rò rỉ, chỉ cần tạo một thùng chứa tham chiếu yếu chứa mọi thực thể và sử dụng nó để phân tích những thực thể nào bị rò rỉ.


Cảm ơn đó là hữu ích. Tôi giả sử không có bộ sưu tập rác, thêm nó vào câu hỏi của tôi.
jmp97

Tôi chưa bao giờ sử dụng một nền tảng mà tôi có thể dựa vào GC cho logic chơi trò chơi. Hầu hết các nền tảng đều có độ trễ - độ dài thay đổi, đối với các thế hệ GC - có thể dài hàng chục khung, trước khi chúng thực sự thu thập được thứ gì đó. Một số ngôn ngữ như Python đảm bảo hoàn thiện các tham chiếu không tuần hoàn ngay lập tức, nhưng rất hiếm khi không có chúng trong các trò chơi, đặc biệt là khi chết (A và B bắn nhau; một người chết).

@Joe, tôi không thực sự nói về việc sử dụng nó cho logic chơi trò chơi, nhưng bạn có thể dễ dàng sử dụng nó cho các phần khó khăn của bộ sưu tập cruft. Với giả thuyết của jmp97, bạn có thể có cờ "người chơi vẫn còn sống" và sau đó thêm một điều kiện đơn giản vào hệ thống "phát sóng tương tác" để đảm bảo người chơi còn sống trước khi gửi nội dung đến nó. (Hoặc nướng nó vào giao diện cấu trúc dữ liệu.) Tại thời điểm đó, logic trò chơi của bạn được tập trung trong lá cờ đơn giản đó và bạn cũng có thể dựa vào việc dọn dẹp bộ nhớ sau này.
ZorbaTHut

2

Khi trả lời câu hỏi của tôi từ kinh nghiệm tôi có cho đến nay, về cơ bản tôi thấy các tùy chọn sau:

Trích xuất bộ sưu tập đối tượng cụ thể hơn của bạn từ bộ sưu tập tổng quát hơn mỗi khi bạn cần

  • pro: kho đối tượng trung tâm
  • con: chi phí tính toán

Lưu trữ bộ sưu tập cụ thể hơn của bạn trong các thùng chứa chuyên dụng như được cung cấp trong ví dụ cho câu hỏi này

  • pro: tra cứu nhanh / dữ liệu được sắp xếp trước
  • con: theo dõi nhiều hơn các đối tượng

Sử dụng bộ nhớ đệm cho các phối cảnh nhất định trên / bộ phụ của các đối tượng trò chơi

  • pro: giữa mặt đất giữa 1 và 2
  • con: cần đưa ra chiến lược lưu trữ có thể làm phức tạp vấn đề

Các yếu tố để chọn một trong các tùy chọn này bao gồm

  • mức độ thường xuyên là bộ sưu tập các đối tượng cần thiết
  • chi phí để theo dõi các đối tượng trên nhiều container là bao nhiêu (có thể chỉ liên quan trong trường hợp loại bỏ đối tượng)

Mẫu quan sát có thể giúp truyền bá nhu cầu thay đổi các tập hợp con khác của các đối tượng.

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.