绘制立方体时出现OutOfMemory异常

2023-11-23

我有一个绘制和旋转立方体的类。每次旋转立方体时,我都会使用立方体的新值重新加载缓冲区。

    public void LoadBuffer(GraphicsDevice graphicsDevice)
    {
        buffer = new VertexBuffer(graphicsDevice, VertexPositionNormalTexture.VertexDeclaration, triangles * 3, BufferUsage.None);
        buffer.SetData<VertexPositionNormalTexture>(verts);
        graphicsDevice.SetVertexBuffer(buffer);
    }

    public void Draw(GraphicsDevice graphicsDevice)
    {
        graphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, triangles);
    }

然后调用Game.Draw中的Cube.Draw方法

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(ClearOptions.DepthBuffer | ClearOptions.Target, Color.White, 1f, 0);

        basicEffect.Parameters["WorldViewProj"].SetValue(world * view * projection);

        EffectPass pass = basicEffect.CurrentTechnique.Passes[0];
        if (pass != null)
        {
            pass.Apply();
            cube1.LoadBuffer(GraphicsDevice);
            cube1.Draw(GraphicsDevice);
            cube2.LoadBuffer(GraphicsDevice);
            cube2.Draw(GraphicsDevice);
            cube3.LoadBuffer(GraphicsDevice);
            cube3.Draw(GraphicsDevice);
        }
        base.Draw(gameTime);
    }

大约几分钟后,我收到 OutOfMemory 异常:

buffer.SetData<VertexPositionNormalTexture>(verts);

有人可以解释一下为什么会发生这种情况以及我可以采取什么措施来解决它。


顶点缓冲区是非托管资源。垃圾收集器不知道他们在幕后使用大量非托管内存(和 GPU 资源)。它所知道的只是每个人使用的一小部分托管内存。

我更多地谈论了 XNA 中的非托管资源我对这个问题的回答.

你可以打电话Dispose()在各个VertexBuffer在泄漏它之前(但是在绘制完成之后,因为它仍然在使用中!),以释放非托管资源。这将避免内存不足错误,但仍然会很慢!

你真正应该做的是创建最少必要的顶点缓冲区只有一次。执行此操作的理想位置是在您的LoadContent函数(然后Dispose()他们在你的UnloadContent功能)。如果您有一大堆立方体,您所需要的只是一个描述立方体的顶点缓冲区,每次绘制立方体时都可以重复使用它。

显然您不想将所有立方体绘制在同一个地方。这就是世界矩阵的用途。每次绘制一个立方体时,设置BasicEffect.World到该立方体的转换矩阵并调用Apply().

(你设置的方式WorldViewProj直接也可以。但使用漂亮的 API 确实更好。)

如果您想要旋转,请使用Matrix.CreateFromYawPitchRoll(yaw, pitch, roll)创建您的变换矩阵。

有关此问题的更多详细信息,您的问题类似于我已经回答过的另一个问题.

(请注意,如果顶点本身真的改变每一帧,你应该使用DrawUserPrimitives。但请注意,这仍然比让 GPU 上的顶点着色器处理任何转换慢得多。)

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

绘制立方体时出现OutOfMemory异常 的相关文章

随机推荐

  • 在 PHP 中使用 XSLT 转换 XML

    我正在尝试合并两个 xml 文件并使用 XSLT 文件将它们转换为 XHTML 页面 我以前没有这样做过 也不知道该怎么做 这是我到目前为止所拥有的 只有一个 xml 文件
  • 如何在 Chrome 中启用屏幕/桌面捕获?

    我可以通过以下步骤在 Firefox 中实现它 让我的服务器https 将我的域附加到用户首选项media getusermedia screensharing allowed domains in about config将其列入屏幕共享
  • jquery,添加带有类定义的div

    所以我看到这里如何添加div和这里如何添加班级但我很难将两者结合起来 我想在 div SparkLineContainer 中生成一大堆具有特定类和 id 的 div 我有包含 div div div 我想添加以下一些内容 div div
  • 显示 mdTooltip 直到单击,再次单击时隐藏

    我试图禁用鼠标悬停效果并在单击时触发 mdTooltip 并在再次单击时禁用它 可以这样做吗 我认为 toogle 方法将是正确的工具 不幸的是它的工作方式相反 div style text align center span Test s
  • objdump -d 输出程序集的含义

    我试图弄清楚这个 objdump d 的所有元素的含义 例如我有 08048b50
  • 如何用 jQuery 替换 HTML 但保留事件绑定

    这更多的是一个战略问题 而不是一个具体问题 但我认为这是准确的问题 所以这里是 假设我有一个页面或 ap 有 3 个独立的部分 表单部分的更改会向服务器发送 ajax post 这需要对第二部分进行更改 我想发回第 2 部分重新处理的 HT
  • EditTextPreference - 仅数值输入类型 - 不起作用

  • 使用 Selenium 和 PHPUnit 对 http POST 到 /session 抛出卷曲错误:{"desiredCapability":{"browserName":"chrome","platform":"ANY"

    我正在使用 PHPUnit 运行所有测试 创建了一个包装器 用于启动 Apache 实例 然后启动 Selenium 独立服务器 然后在以下位置创建 Chrome Remote Webdriver 实例http localhost 4444
  • 有没有一种简单的方法可以使烧瓶中的会话超时?

    我正在用 Flask 构建一个网站 用户拥有帐户并且能够登录 我使用 Flask Principal 进行部分登录和角色管理 有没有办法让用户的会话在 5 分钟或 10 分钟后过期 我在 Flask 文档或 Flask Principal
  • 如何设置ViewBox背景?

    我需要设置我的背景System Windows Controls Viewbox 但该属性丢失了 我该如何解决这个问题 将视图框放入支持背景属性的控件中
  • 如何获取PHP中复制函数的进度状态?

    我需要知道如何获取状态copy PHP 中的函数 我正在使用此功能下载远程文件 并且我想要该程序的进度条 您需要编写自己的复制功能 首先通过 HTTP HEAD 请求检查文件大小 例如使用以下解决方案 http php net manual
  • 将方法传递给 LINQ 查询

    在我目前正在处理的一个项目中 我们有许多静态表达式 当我们调用它们的 Invoke 方法并将 lambda 表达式的参数传递给它们时 我们必须将它们带入本地作用域 今天 我们声明了一个静态方法 其参数正是查询所期望的类型 因此 我和我的同事
  • NHibernate 中是否需要代理工厂?

    我在 hibernate cfg xml 中有这样的配置
  • 使用 HTML5 进行移动开发(iphone、android)的资源和框架 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在寻找主要为 iPho
  • 用 c 封装一个 c++ 库? (不要“外部c”)

    是否可以将 C 库包装到 C 中 我怎样才能做到这一点 有现成的工具吗 需要访问现有的 C 库 但只能使用 C 您可以用 C 语言编写面向对象的代码 因此如果它是面向对象的 C 库 则可以将其包装在 C 接口中 然而 这样做可能非常乏味 特
  • spring-security中基于路径变量的授权

    我的用例是根据 PathVariable 参数对用户进行身份验证和授权 我需要执行一些自定义代码来授权主体 我不确定这里要采取的方法 我已经实现了一个自定义的 AbstractAuthenticationProcessingFilter 和
  • 如何使用 RDD API 在分区内排序(并避免跨分区排序)?

    Hadoop MapReduce shuffle 的默认行为是对分区内的 shuffle key 进行排序 而不是跨分区 这是使键跨分区排序的总排序 我想问如何使用 Spark RDD 实现同样的事情 在分区内排序 但不跨分区排序 RDD
  • “堆内”和“堆外”的区别

    Ehcache 谈论堆内和堆外内存 有什么不同 使用哪些 JVM 参数来配置它们 堆上存储是指将出现在 Java 堆中 并且也受 GC 影响 的对象 另一方面 堆外存储是指由 EHCache 管理的 序列化 对象 但存储在堆外 并且也不受
  • 在 iPhone 中创建 pdf 缩略图

    我是 Objective c iPhone 编程新手 我有一个应用程序 可以在 UIWebView 中成功显示 PDF 但现在我想创建 PDF 的缩略图 我的 PDF 存储在我的资源文件夹中 因此 请给我如何显示 PDF 缩略图的代码 我的
  • 绘制立方体时出现OutOfMemory异常

    我有一个绘制和旋转立方体的类 每次旋转立方体时 我都会使用立方体的新值重新加载缓冲区 public void LoadBuffer GraphicsDevice graphicsDevice buffer new VertexBuffer