【发布时间】:2017-08-09 09:57:03
【问题描述】:
此文本是经过深入调查和仔细检查后编辑的。
我正在 Xamarin 中开发基于 Metal API 的企业(而非游戏)应用程序,但我遇到了一个严重问题:金属纹理在处理后没有释放它的内存,导致大量内存泄漏和应用程序崩溃的原因。
class SomeClass
{
public void CreateTexture()
{
var metalTexture = device.CreateTexture(textureDescriptor);
metalTexture.Dispose();
}
}
您可以在上面看到一个简化的示例,用于演示问题。 纹理的内存在 Dispose() 调用后不会释放,即使纹理是局部变量也是如此。
谁能解释这是怎么回事,以及如何释放纹理的内存?
由于这个问题,Xamarin 中的 Metal Kit 支持似乎完全损坏且无用。我深感震惊:WTF怎么回事?! Xamarin 团队怎么可能制作最初损坏的功能并且多年不解决问题?你们在那里做什么,伙计们? Xamarin 论坛完全死了。目前,这很自豪地称为“Visual Studio for Mac”,但有什么意义呢?该死的代码 sn-ps 仍然有问题 - 必须删除自动插入的括号才能修复光标。
附言
这是演示问题的项目的 repo:
https://github.com/kav-git/Xamarin-Metal-Issue
- 在调试期间,内存使用情况会记录到 IDE 的输出窗口中。
- 按
Add texture按钮将新的64Mb 纹理添加到集合中。 - 按
Dispose textures按钮清除所有纹理。不会释放内存。 - 当您处理非纹理对象时,请按
Release pixelData按钮以确保GC 正常。 - 使用
GC.Collect()按钮只是为了好玩。
【问题讨论】:
-
你试过明确的
GC.Collect ()电话吗? -
舒尔。
GC.Collect(); GC.WaitForPendingFinalizers();这不像“只是等待,GC 会在某个时候完成它的工作”。看起来纹理内存的集合刚刚损坏。纹理的内存从不释放,直到它用完并且应用程序在多次内存警告后崩溃。 -
这可能是一些 xamarin 问题。请使用测试项目创建 repo 或 zip
-
@IvanBukashkin 已经看到了。这很美味。正是我的感受。
标签: ios xamarin xamarin.ios metalkit