你可以重复使用已被清除的IOSurface?

问题描述 投票:2回答:1

TL; DR:是的IOSurfaceRef有效的表面已被清除后写入并且其状态改为kIOSurfacePurgeableEmpty


我试图得到一个更好的理解这是什么意思为要清除的IOSurface。我所遇到的唯一文档是在IOSurfaceRef.h和唯一的代码示例我遇到的WebKit中。

我使用的命令行工具memory_pressure以模拟10秒,像这样的一个关键内存压力环境:

> memory_pressure -S -s 10 -l critical

我写了一个非常简单的应用,分配100 IOSurfaces具有相同的属性。当我使用仪器来测量存储器分配,我看到VM: IOSurface在大致6GB,约为6MB每个表面。 (4096x4096x4)

然后,我改变每个IOSurface的吹出的状态kIOSurfacePurgeableVolatile和运行memory_pressure模拟。

仪器还报告说我有分配的表面的6GB。不过,如果我检查每个面的吹出的状态,它们标记为kIOSurfacePurgeableEmpty

因此,它看起来像他们成功清除,但内存仍然分配给我的应用程序。这是为什么,什么条件是这些表面的?

我应该相信他们的头文件指出在他们“未定义的内容”。很公平。

但实际IOSurfaceRefIOSurface *对象是否仍然有效?我能够成功查询的所有属性都和我可以成功地锁定了阅读和写作。

我可以在刚刚重用的对象,即使它的内容被清除或做我不得不放弃这个实例,并创建一个全新的IOSurface?

MacOS的10:14

objective-c macos memory-management core-foundation iosurface
1个回答
2
投票

是的,它仍然是可用的。这只是像素数据已经丢失。

基本上,当系统是在内存压力下,它通常会页面数据到磁盘。标记一个可净化对象挥发性允许系统简单地丢弃该数据,来代替。该应用程序已表示,虽然这是很好的到了,这不是有到有,并在必要时可以重新创建。

当它想再次与IOSurface工作,应用程序应该将对象标记非易失性并检查老态。如果是空的,那么应用程序应该重新创建数据。

该仪器报告说,您的应用程序仍然6GB分配的原因是因为它对于IOSurfaces保留其地址空间的6GB。但分配并不一定意味着通过物理RAM或交换文件的支持。这只是记账,直到内存被实际使用。你的应用程序的驻留集大小(RSS)应该收缩。

© www.soinside.com 2019 - 2024. All rights reserved.