簡體   English   中英

我們可以卸載特定的紋理嗎? 單機游戲

[英]Can we unload a specific texture? MonoGame

我知道您可以卸載 monogame 項目中的所有內容,但我想知道是否可以卸載特定紋理,例如,在關卡之后。

我有一個我使用 .GetData 和 .SetData 修改的紋理,我在其他級別以及玩家死亡時重復使用該紋理,但是當我在另一個重復級別中使用它時,或者當我重新啟動當前級別時,紋理保留其修改后的 state,而不是其原始版本。 如果我卸載所有內容,那么紋理會在關卡開始時被修改和重置,但是我會丟失一些其他內容。

所以真正的問題是,您可以在不卸載所有內容的情況下卸載特定紋理嗎?

任何幫助,將不勝感激:)

簡單地放置對象的問題在於,代碼的其他部分無法知道對象是否已被放置。 ContentManager僅提供Unload()方法,該方法可以卸載和處置所有資源,並且您不能簡單地創建自己的派生實現,因為其內部可處置資產列表是private (不受protected )。 如果您實現了自己的Unload(string asset)方法,則此私有列表仍將保留對您資產的引用,然后在處理ContentManager時嘗試再次對其進行處置(如果資源類正確實施了兩次處置,則應該可以進行處置,但是如果沒有其他說明,則表示您正在阻止GC回收此內存)。

因此,實現ContentManager.Unload(string assetName)方法的唯一方法是直接更改MonoGame源。

通用方法稍微容易一些:只需使用多個ContentManager實例,即Game類中的一個共享ContentManager實例,以及每個GameScreen (或用於組織游戲的任何東西)中的一個單獨的私有ContentManager實例, GameScreen在切換場景時使用該實例。

對於異步內容加載,我還為我的應用程序實現了一個自定義異步內容管理器,該管理器將首次訪問時的加載作業排隊到單獨的線程中,並在后續調用中返回null ,直到資源完全加載為止。

要回答您的問題,而不是處置整個內容管理器,您可以處置紋理對象本身。

Texture2D MyTexture = Content.Load<Texture2D>("Texture.png");

您的內容管理器(“內容”)現在已加載此紋理。

MyTexture.Dispose();

通過設置紋理對象而不是整個內容管理器,僅“指定”了指定的紋理。 盡管紋理將僅被卸載,但是內容管理器中的引用將不會被刪除。

正如Craftworkgames指出的那樣,對紋理對象的引用將保留在內容管理器中,這意味着無法使用Content.Load <>()重新加載該對象。

我認為您正在尋找的方法不是處理紋理,而是在重置級別時將其覆蓋。 重置級別時,只需再次在同一紋理對象上調用Content.Load方法。 這將重新加載默認紋理,以覆蓋已修改的紋理。

我相信從 2023 年開始(不知道這已經持續了多久)您可以通過調用 Texture.Dispose() 並向您的自定義內容管理器添加 Unload(string name) 方法來卸載指定的資源,如下所示:

internal void Unload(string name)
    {
        LoadedAssets.Remove(name);
    }

至少這適用於我的項目並允許重新加載紋理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM