在 XNA 中,处理我不再需要的纹理的最佳方法是什么?

2023-11-29

我开始了一个项目,其概念是在整个游戏中连续重用相同的texture2d对象,定期重新加载新纹理。随着时间的推移,这被证明是一个坏主意,因为我遇到了:System.OutOfMemoryException

    bool loadImages(string image)
    {
        System.Diagnostics.Debug.WriteLine("beginning loading textures " + image);

        try
        {
            //image_a = null;
            //image_o = null;

            //image_o.Dispose();
            //image_a.Dispose();

            image_o = Content.Load<Texture2D>("images/"+image);
            image_a = Content.Load<Texture2D>("images/" + image+"_a");


            return true;
        }
        catch 
        { 
            System.Diagnostics.Debug.WriteLine("cannot load textures " + image);         
            image_a.Dispose(); 
            image_o.Dispose(); 
        }

        return false; //make sure the caller loads the subsequent image
    }

我猜测 XNA 在每次加载新内容时都会保留过去的纹理,因此我重写了程序,改为保存一个游戏对象列表,每个对象都有自己的texture2d 对象。浏览列表后,我将处理前一个列表项的纹理对象,并将下一个列表项的纹理加载到其纹理对象。该列表在整个游戏中只会遍历一次,我只是定期移动到下一个纹理集,并且我只会挑选 2 个纹理进行加载,因此理论上内存中始终只需要 2 个纹理。我仍然遇到内存错误。就好像我根本无法依靠 dispose 方法及时从内存中释放纹理一样。

我加载的纹理均不超过 125KB,我正在为 Windows Phone 7 构建此纹理

删除我不再需要的纹理的最佳方法是什么?参考代码:我应该创建新的texture2d对象,交换它们,然后处理原始对象吗?


好的,首先介绍一下背景:ContentManager缓存加载的对象。有更详细的描述here (or here)。但基本上每个ContentManager owns它加载的所有内容。你不应该打电话Dispose关于该内容。清理它的唯一方法是卸载缓存中的所有内容ContentManager.Unload (or Dispose).

我猜您遇到的问题是您尝试过Load您之前调用过的纹理Dispose打开 - 然后尝试使用该已处理的纹理。

虽然我想你也可能会耗尽内存,因为ContentManager正在存储所有这些(空的,已处理的)Texture2D对象,防止垃圾收集器回收它们(请参阅这个答案).

所以,如果你想走这条路,你需要修改缓存策略ContentManager。如何执行此操作在中进行了解释这篇博文。但基本上你继承自ContentManager, 覆盖Load,并致电ReadAsset当您想要从内容文件创建资产的新实例时。

最简单的方法是完全禁用缓存,该博客文章中有一个具体的示例。然后,您可以简单地手动管理内容管理器加载的所有内容的生命周期(即:调用Dispose自己做吧)。

如果您想要更复杂的东西,也许看看我提出的设计这个答案,在 GameDev 网站上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 XNA 中,处理我不再需要的纹理的最佳方法是什么? 的相关文章

  • XNA - Mouse.Left Button 在更新中执行多次

    我正在制作井字游戏 我需要检查玩家是否正在点击他们已经点击过的方块 问题是第一次单击本身会显示错误 我的更新代码是 MouseState mouse Mouse GetState int x y int go 0 if mouse Left
  • 需要 gem 是否会加载所有内容,包括我不使用的东西?

    Assume x是一颗宝石 包含两者Hello and Goodbye类 如果我写一个程序require x 但仅使用Hello班级 是个Goodbye类也加载了吗 您包含脚本或文件 而不是 gem With require x 你加载文件
  • glDeleteTextures在Windows上似乎没有释放纹理内存,有没有解决办法?

    我的 openGL 应用程序内存不足 遇到一些问题 我正在尝试找出我的问题 为此 我创建了一个小型测试程序 它基本上只是从调用 glDeleteTextures 的文件中加载一个巨大的纹理 然后再次加载它 如果我在 OSX 上运行这个测试程
  • 何时对向量进行归一化?

    我正在学习 XNA 并且在几乎所有的教育套件中都可以找到http creators xna com en US http creators xna com en US 我总是看到向量上对 Normalize 的调用 我知道归一化基本上将向量
  • 到底什么是“位填充”或“填充位”?

    我只是在互联网上找不到任何关于 位填充 真正含义的详细解释 并且在 Stack Overflow 上也没有找到与位填充相关的线程的任何答案 我还搜索了 ISO 9899 1990 其中提到了 位填充 但没有根据我的需要进行解释 我在网上找到
  • C:内存池库?

    我需要一些快速 线程安全的内存池库 我用谷歌搜索了很多 但是快速的解决方案没有线程安全 而其他的则非常大 有什么建议么 nedmalloc 和 ptmalloc 都是基于 C 的线程缓存内存管理器 基于 doug lea 的 malloc
  • C++ 中数组的正确分配和释放内存

    我正在处理动态数组 功能empty matrix 创建一个新数组 表示一个矩阵 delete matrix 释放为矩阵分配的所有内存 我的函数中是否出现内存泄漏example 如果我打电话add add a b c 函数中分配的内存会发生什
  • Python:当为变量分配新内容时,“旧”内存是否被释放?

    如果为变量分配了任何新内容 为 旧内容 分配的内存是否会 正确 释放 例如 在以下脚本中 在为 a 分配一些新内容后 变量 a 作为零数组的内存是否会被释放 import numpy a numpy zeros 1000 a a 1 我想象
  • 如何从内存转储中查找预加载系统绘图(位图)的 ID 或名称

    我正在分析我们应用程序的内存使用情况 发现很奇怪Drawables 它不断地 吃掉 几兆字节的堆 以下是一些截图MAT http www eclipse org mat Dominator tree with 2 pretty big bi
  • 跨 dll 边界的内存分配和释放

    我知道在一个 dll 中进行内存分配然后在另一个 dll 中释放内存可能会导致各种问题 尤其是与 CRT 相关的问题 当涉及到导出 STL 容器时 此类问题尤其成问题 我们之前遇到过此类问题 在编写与我们的库链接的自定义 Adob e 插件
  • 在 Swift 中,当使用“[weak self] in”时,当嵌套在另一个闭包中时我是否应该加倍它[重复]

    这个问题在这里已经有答案了 在 Swift 中 当使用 weak self in 当嵌套在另一个闭包中时 我应该将其加倍吗 Example override func viewDidLoad super viewDidLoad makeAP
  • 反序列化 XML 文件而不将其全部加载到内存中 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 假设您的应用程序使用 XmlSerializer 序列化对象 当应用程序的另一部分 例如外部服务或另一个组件 处理该 XML 文件时 会返回一个
  • 将值存储为变量或再次调用方法更好吗?

    最近 我开始学习一些Java 从我对 JVM 的了解来看 JIT 使其在需要 CPU 周期的操作 即调用方法 上变得非常快 但也使其对内存产生了饥饿感 因此 当我需要与以前相同的方法获得相同的输出时 将之前的输出存储在变量中并再次使用它 同
  • 如何测量Python中对象的内存使用情况?

    我有一个Python课程foo其中包含 数据 整数 浮点数 列表 整数 浮点数和其他对象的列表 字典 整数 浮点数 其他对象的 假设没有反向引用 循环 是否有一种简单的方法来测量一个进程的总内存使用量foo目的 本质上 我正在寻找一个递归版
  • XNA WorldMatrix 和 ViewMatrix

    我创建了一个 Camera 类 它允许我以第一人称在场景中移动 相机一直工作得很好 直到我决定将其用作向 3D 世界添加一些内容的位置 我想做的是当我按下鼠标按钮时向世界添加一个立方体 我希望立方体最终远离相机 但现在我只想在相机前面创建它
  • Forth 中 S" ..." 的生命周期是多少?

    我一直在尝试阅读此内容 但找不到任何提及 根据标准 创建的字符串S 无法修改 并且通过简单的实验Gforth http en wikipedia org wiki Gforth很明显 字符串的空间不是来自字典或填充区域 hex here 7
  • 从 Maya 导出时,DAE 文件图像纹理不会显示在 Aframe 中

    我已从 Maya 导出带有图像纹理的 dae 文件 但是 当该 dae 文件与 A Frame 一起使用时 图像纹理不会出现 您只能看到基础材质 我可以在 Maya 中使用什么导出器来解决此问题 下面是 PSD 和 Aframe 中的相同
  • 允许使用 SurfaceTexture 在 GLSurfaceView 渲染器中进行多通道渲染

    我正在显示视频GLSurfaceView使用需要连续应用多个着色器的自定义渲染器 目前 它可以成功地使用一个着色器 但我不确定如何扩展渲染管道以连续应用多个着色器 我知道有一些关于应用多个着色器的示例 使用FrameBuffers and
  • 如果内存是字节可寻址的,为什么我们需要对齐填充?

    既然我们可以单独寻址内存的每个字节 为什么编译器要格外小心以确保结构及其成员与内存中的 32 位边界对齐 我在这里可能是错的 但是在 32 位系统上 从 0x0800 开始获取 4 个字节是不是和从 0x0801 开始获取 4 个字节一样快
  • 线程缓存和 Java 内存模型

    我正在尝试了解 Java 内存模型和线程 据我了解 每个线程都有 主 内存的本地副本 因此 如果一个线程尝试更改int变量 例如某个对象的变量 它会缓存int变量 如果它更改它 其他线程可能看不到更改 但是如果线程缓存一些对象而不是 int

随机推荐

  • iphone 平铺图像

    我有一个 1280 x 1664 的图像 我想使用 Apple 提供的 ScrollViewSuite 示例 但我需要将此图像剪切到多个缩放级别 那么 有人知道如何在多个缩放级别上平铺图像吗 一定有一种简单的方法可以将图像填充到 256x2
  • 处理交易时虚拟机异常:气体耗尽

    我正在使用 testrpc web3 1 0 和 Solidity 构建一个简单的 Dapp 但我总是收到此错误 并且找不到问题所在 请帮忙 我的 JavaScript 文件 const Web3 require web3 const fs
  • 如何在 Kotlin Desktop Compose 中触发 PC 键盘输入

    我将使用 Kotlin Jetpack Compose 开发一个 POS 系统 我想知道如何在我的项目中触发键盘输入事件 在 Compose Desktop 中 您可以使用以下方式侦听关键事件onKeyEvent Window范围 Wind
  • Discord Bot + Google Cloud Run:“容器无法启动。”

    我正在尝试部署一个用 python 编写并通过 Docker 容器化到 Google Cloud Run 的简单 Discord 机器人 Dockerfile 非常简单 FROM python 3 9 WORKDIR app COPY re
  • 有没有简单的 3 列、纯 CSS 布局?

    不需要以下内容的一种 对图像的依赖 即 假柱 专门为 IE 添加的某种怪异或 hack 要求 IE 以怪异模式运行 没有像三个 DIV 之一与其他 DIV 重叠那样的奇怪现象 即 圣杯 边距设置为高负数 使它们远离视图屏幕 再次 圣杯 布局
  • ember.js #每个按属性排序

    我有一个数组Ember Object由 Handlebars 显示的 s each 我希望每次数组更改时都按这些对象的属性进行排序 所以像这样 var arr Ember Objects create position 0 label fo
  • EF 上的数据库连接错误

    我对实体框架非常陌生 我在编写基于 Web api 的网站 连接到 mssql 时遇到问题 我不断收到看似随机的错误 大部分似乎与数据库相关 这些错误最常在网站首次发布时发生 但有时也会在距上次发布数小时后发生 错误的选择 无效操作 连接已
  • 如何使用警报管理器重复我的服务?

    我做了一个基于位置的应用程序 现在我需要每 30 分钟运行一次定位服务 为此 我尝试使用警报管理器 但它只运行我的服务一次 我需要它每 30 分钟运行一次吗 My code gps back process java public clas
  • C# 转换整个数组?

    我看到这个Array ConvertAll方法 但是需要一个Converter作为一个论点 当我已经在类中定义了一个隐式转换器时 我不明白为什么需要一个转换器 public static implicit operator Vec2 Poi
  • C++:如何添加外部库

    我正在尝试将 SVL 添加到我的项目中 如果没有它 我会收到数百个错误 未定义的参考 添加 lSVL 后 所有错误都消失了 但 gcc 说 找不到 lSVL 其他一切 SDL SDL TTF SDL Mixer 都工作正常 您应该告知 gc
  • JQuery UI Draggable如何获取拖动开始位置

    我可以拖动我的可拖动项目并将它们放在我的可放置物品上 并从中获取放置位置 ui absolutePosition 发生在放置事件上 我需要知道拖动从哪个位置开始 我尝试在拖动开始事件上获取 ui position 但这是空的 我也尝试过 拖
  • 在 Google Apps 脚本中创建动态下拉列表[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我想使用 Google Apps 脚本动态更改 Google 电子表格的单元格验证功能中候选列表的值 我需要从其他电子表格中获取值 如果我理解正确的话 这是我一直在努力解决的问题
  • Visual Studio代码nodejs请求“启动”:无法启动目标(原因:生成节点ENOENT)

    当我使用 Visual Studio 代码调试 NodeJS 应用程序时 视觉工作室代码告诉我request launch cannot launch target reason spawn node ENOENT 我的nodejs版本是4
  • 使用循环 onclick 更改背景颜色

    这是我的 js 小提琴 http jsfiddle net pYM38 16 var box document getElementById box var colors purple yellow orange brown black b
  • 确定 Android 设备是否以编程方式 root? [复制]

    这个问题在这里已经有答案了 可能的重复 确定是否在已取得 root 权限的设备上运行 如何 以编程方式 确定 Android 设备是否 已 root 运行软件或 ROM 的破解副本 我的数据库中有一些敏感信息 我想在手机 root 后 即用
  • SSKeychain 不保留数据

    我在用SSKeychain用于存储设备的UUID 然而 有时SSKeychain不保留 UUID 因此我的应用程序必须重新创建新的 UUID 有人可以告诉我一些原因吗SSKeychain不保留数据 提前致谢 对不起我的英语不好 在 Obje
  • SmartGit:文件或目录不是过期错误消息吗?

    有人请帮助我理解我对下面发生的事情的错误 误解 这是一个 SVN 存储库 正如您所看到的 我有两个分支并对版本进行了一些独立的更改 根据上面的日志 两个服务器分支都映射回当前本地发布分支 该分支提前了一些提交 如果我去将发布的更改推送回远程
  • 组合 SQL Server 查询

    我正在使用 SQL Server 并且有两个表 我想将其合并为一个查询 以用于填充网格视图 表1 dbo 工作UID PK 整数 Tech Ticket 整数 RMA Ticket 整数 区域 nchar10 已完成 nchar10 FA
  • 如何在 Rust 中将 Future 的生命周期绑定到 fn 参数

    我想写一个简单的run transactionRust MongoDB 驱动程序的函数 该函数尝试通过 mongo db 客户端执行事务 并在遇到可重试错误时重试该事务 这是该函数的最小可重现示例 use mongodb Client Co
  • 在 XNA 中,处理我不再需要的纹理的最佳方法是什么?

    我开始了一个项目 其概念是在整个游戏中连续重用相同的texture2d对象 定期重新加载新纹理 随着时间的推移 这被证明是一个坏主意 因为我遇到了 System OutOfMemoryException bool loadImages st