首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我们能卸载一个特定的纹理吗?MonoGame

我们能卸载一个特定的纹理吗?MonoGame
EN

Stack Overflow用户
提问于 2015-11-20 22:57:00
回答 2查看 1.8K关注 0票数 1

我知道您可以卸载一个单名项目中的所有内容,但我想知道是否有可能卸载特定的纹理,例如,在一个级别之后。

我有一个使用.GetData和.SetData修改的纹理,并且在其他级别以及播放机死亡时重复使用这个纹理,但是当我在另一个重复级别中使用它时,或者当我重新启动当前级别时,纹理仍然处于其修改状态,而不是原始状态。如果我卸载所有的内容,那么纹理会被修改,并在级别的开始重置,但是我失去了一些其他的内容。

所以真正的问题是,你能在不卸载所有内容的情况下卸载特定的纹理吗?

如能提供任何帮助,将不胜感激:)

EN

回答 2

Stack Overflow用户

发布于 2015-11-25 16:29:20

简单地处理对象的问题是,您的代码的其他部分无法知道对象是否已被释放。ContentManager只提供Unload()方法,该方法卸载和处理所有资源,您不能简单地创建自己的派生实现,因为它的可支配资产的内部列表是private (而不是protected)。如果您实现了您自己的Unload(string asset)方法,这个私有列表仍将保存对您的资产的引用,然后在释放ContentManager时再次尝试释放它(如果资源类正确地实现了该方法,则应进行两次处理,但如果没有其他任何方法,则阻止GC回收此内存)。

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

普通方法稍微容易一些:只需使用多个ContentManager实例,即Game类中的共享ContentManager实例,在每个GameScreen中使用一个单独的私有ContentManager实例(或用于组织游戏的任何东西),只要切换场景,就会对其进行处理。

对于异步内容加载,我还为我的应用程序实现了一个自定义的异步内容管理器,它在第一次访问时将加载任务排队到一个单独的线程中,并在随后的调用中返回null,直到资源完全加载。

票数 2
EN

Stack Overflow用户

发布于 2015-11-20 23:52:43

要回答您的问题,而不是处理整个内容管理器,您可以释放纹理对象本身。

代码语言:javascript
运行
复制
Texture2D MyTexture = Content.Load<Texture2D>("Texture.png");

您的内容管理器( " content“)现在加载了这个纹理。

代码语言:javascript
运行
复制
MyTexture.Dispose();

通过配置纹理对象而不是整个内容管理器,只有指定的纹理才会被“释放”。虽然纹理将只被卸载,但内容管理器中的引用将不会被删除。

正如工艺游戏所指出的,对纹理对象的引用将保留在内容管理器中,这意味着它不能使用Content.Load<>()重新加载。

我认为您要寻找的方法不是处理纹理,而是在级别重置时覆盖它。当级别重置时,您只需再次调用同一纹理对象上的Content.Load方法。这将加载默认纹理回覆盖您修改的一个。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33837436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档