ios - Xamarin 中未发布金属纹理

标签 ios xamarin xamarin.ios metalkit

此文本是经过长期调查和双重检查后编辑的。

我正在 Xamarin 中开发基于 Metal API 的企业(而非游戏)应用程序,但我遇到了一个严重问题:金属纹理在处置后没有释放其内存,这导致了广泛的内存泄漏和应用程序崩溃。

class SomeClass
{
    public void CreateTexture()
    {
        var metalTexture = device.CreateTexture(textureDescriptor);
        metalTexture.Dispose();
    }
}

上面您可以看到一个简化的示例,它演示了该问题。 即使纹理是局部变量,纹理的内存在 Dispose() 调用后也不会释放。

有人能解释一下发生了什么以及如何释放纹理的内存吗?

由于这个问题,Xamarin 中的 Metal Kit 支持似乎完全被破坏并且毫无用处。我深感震惊:这是怎么回事?! Xamarin 团队怎么可能做出最初被破坏的功能并且多年不解决问题?伙计们,你们在那里做什么? Xamarin 论坛完全死了。目前,这个自豪地称为“Visual studio for Mac”,但这有什么意义呢?该死的代码片段仍然有问题——必须删除自动插入的括号来修复光标。

附注
这是演示问题的项目的存储库:
https://github.com/kav-git/Xamarin-Metal-Issue

  1. 调试期间内存使用情况会记录到 IDE 的输出窗口中。
  2. 添加纹理按钮将新的 64Mb 纹理添加到集合中。
  3. 处置纹理按钮清除所有纹理。不会释放任何内存。
  4. 处理非纹理对象时,按Release PixelData按钮以确保GC正常。
  5. 使用 GC.Collect() 按钮只是为了好玩。

最佳答案

经过几个小时的随机搜索解决方案,幸运的是找到了解决方案。

添加调用
metalTexture.SetPurgeableState(MTLPurgeableState.Empty);
在处理纹理之前解决问题。

根据答案的数量,我感觉自己是世界上唯一使用 Xamarin 和 Metal Kit 的人...

关于ios - Xamarin 中未发布金属纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45587374/

相关文章:

ios - 如何在 swift 中从 childViewContoller 刷新 parentViewContoller?

ios - Metro 风格应用程序是否可移植到 iphone 和 ipad 以及 Web 应用程序?

sqlite - 使用 Xamarin.Forms 从 Sqlite 数据库获取数据

Xamarin.Forms 图像未显示

ios - 从 visual studio 2013 运行 xamarin.ios 应用程序?

ios - UIBezierPath 和 NSBezierPath 在绘制圆弧时产生不同的结果

ios - 查找用户在 ScrollView 中拖动手指的 X 位置

android - 无法解析 : FragmentManager. FindFragmentById<MapFragment>

ios - 带参数的 MvxViewModelRequest

xamarin.ios - Xamarin.Forms 在 UIDocumentInteractionController 中看不到打印选项