Làm thế nào để bạn quản lý tài nguyên trò chơi của bạn trong XNA?


7

Trong quá khứ tôi đã sử dụng Content.Load<type>("filename");khắp nơi. Điều này nhanh chóng trở thành một cơn ác mộng để quản lý và tệ hơn là bạn bắt đầu có nhiều bản sao của cùng một tài sản được tải ở nhiều nơi khác nhau.

Sau đó, tôi chuyển sang sử dụng một lớp Tài nguyên về cơ bản trông như sau:

public class Resources
{
    public static Texture2D particle01;
    ...
    public static Texture2D particle93;

    public static Effect shader01;
    ...
    public static Effect shader32;

    public static Load(ContentManager content, GraphicsDevice device)
    { //load all the resources }

    public static Unload()
    { //unload all the resources }
}

Sau đó, tôi chỉ có thể sử dụng Resources.particle01để có được một tham chiếu đến tài nguyên từ bất kỳ đâu trong cùng một không gian tên.

Đây là một cách tiếp cận tốt đẹp vì nó đã loại bỏ các bản sao mà tôi có trong quá khứ. Ngoài ra tất cả việc tải được thực hiện trong một lớp duy nhất, vì vậy thật dễ dàng để theo dõi các tài nguyên. Và cuối cùng, tôi có thể chỉ cần nhấp chuột phải, ví dụ, particle93và nhấp vào tìm tất cả các tham chiếu để tìm tất cả các địa điểm đã sử dụng kết cấu đó.

Tuy nhiên, có những vấn đề với phương pháp này và tôi muốn biết liệu có giải pháp nào tốt hơn không.

Câu trả lời:


8

Vâng, đối với người mới bắt đầu Trình quản lý nội dung của XNA không tải cùng một tài sản hai lần, nó sẽ chỉ trả về một tham chiếu nếu một cái gì đó đã được tải.

Đối với phương pháp tiếp cận tài nguyên của bạn, tôi không biết liệu đó có thực sự là hướng đi hay không vì về cơ bản bạn khó mã hóa tài sản nội dung của mình vào trò chơi.

Một giải pháp khả thi cho vấn đề của bạn sẽ là mô hình nhà máy. Giả sử bạn muốn tải một mức, được lưu trữ dưới dạng XML. Bạn tải tệp XML và tải mức bằng cách thực hiện LevelFactory.Construct (xml); Nhà máy này kiểm tra tệp XML và tải tất cả các tài sản được liên kết với cấp đó và đưa chúng vào thế giới. Các phần phụ của thế giới như NPC có thể được xây dựng bởi nhà máy cấp bằng cách gọi cho nhà máy NPC và chuyển một phần của tệp XML để nhà máy NPC biết tải các kết cấu và mô hình nào.

Sử dụng phương pháp này, bạn sẽ có được một loạt các chuỗi nhà máy được điều khiển tất cả dữ liệu để bạn có thể phân tách rõ ràng giữa nội dung (tệp XML và các tệp được tham chiếu bởi tệp XML) và mã (các nhà máy). Trong khi vẫn giữ mã tải nội dung ra khỏi mã khác. Bây giờ bạn không phải làm Player = new Player (textureA, textureB, textureC); nữa, bạn có thể yêu cầu nhà máy cho một người chơi mới và nó sẽ tìm ra phần còn lại.

Mẹo: bạn luôn có thể có một vài phương thức cho các đối tượng mặc định hoặc có dự phòng khi không có gì được chỉ định trong XML.

Hi vọng điêu nay co ich!


3

Tôi đã sử dụng FlatRedBall, có một khái niệm tuyệt vời về Màn hình. Thay vì lo lắng về việc tải / dỡ kết cấu, thay vào đó bạn viết mã như:

Sprite s = this.addSprite("spaceship");

Và nó sẽ xử lý vòng đời nội dung cho bạn. Tôi cũng sử dụng phương pháp này trong khuôn khổ của riêng tôi, Radiant Wbler. Tôi thấy rằng nó giữ cho quản lý ở mức tối thiểu và tránh xa bạn.

Mã để quản lý các sprite không phải là tầm thường (bạn cần một lớp sprite và lớp màn hình, cho người mới bắt đầu), vì vậy tôi khuyên bạn nên thử FRB hoặc RW . Bạn sẽ luôn được hưởng lợi từ việc học những cách mới để làm mọi thứ (đôi khi là những cách tốt hơn).


2

Điều này có vẻ không thuận lợi với một số người nhưng tôi có xu hướng giữ tài nguyên của mình ở địa phương cho GameState cần chúng và mỗi GameState có một ResourcePool gồm nhiều loại. Đây là một cách hay để tách biệt các tài sản cấp vì tôi không thực sự cần nền menu, lớp Tài nguyên của bạn sẽ được phục vụ tốt hơn dưới dạng cấu trúc và GameState sẽ chịu trách nhiệm Tải và Hủy tải.

Một số quản lý tài nguyên trong XNA được xác định một phần bằng cách bạn nhập nội dung của mình ở vị trí đầu tiên. Nhiều người liên kết kết cấu và hiệu ứng với các mô hình của họ trong giai đoạn xử lý nội dung của bản dựng - khiến họ chỉ quản lý các mắt lưới và phần còn lại đã được tham chiếu bên trong.

Bạn dường như thực hiện cách tiếp cận "trộn và kết hợp" cổ điển hơn để linh hoạt hơn, vì vậy bạn cần một cách tiếp cận hộp đen công việc cơ bản và cắt mã bạn phải viết trong thời gian dài. Tôi chưa sử dụng FlatRedBall, nhưng từ những gì tôi có thể nói từ mô tả ngắn được viết ở đây, nó có vẻ giống như mẫu Lazy Loading . Đây là một khái niệm đáng để xem xét nếu bạn muốn làm cho cuộc sống của mình dễ dàng hơn với việc quản lý nhiều tài nguyên.


Nhận xét nhỏ, một cấu trúc có tham chiếu đến các loại không giá trị không được sử dụng nhiều.
Roy T.

1

Tôi sử dụng một lớp tĩnh công khai gọi là Tài sản. Nó chứa từ điển của từng loại tài sản, mô hình, hiệu ứng, spritefonts, v.v., nó có chức năng tải trong thư mục nội dung cho các thư mục như "Hoạ tiết", "Mô hình", v.v. và tải tất cả các tài sản. Sau đó, khi tôi muốn gọi một Tài sản, tôi chỉ cần sử dụng một cái gì đó như Assets.Textures ["SpriteSheetX"];

Tôi không biết nếu đây là thực hành xấu nhưng nó rất dễ dàng. Tôi chủ yếu chỉ chuyển qua các chuỗi của tên tệp và sâu bên trong lõi nó sẽ tải tài sản từ Tài sản.

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.