代码之家  ›  专栏  ›  技术社区  ›  kennyc

你能重复使用一个已经清除的iosurface吗?

  •  1
  • kennyc  · 技术社区  · 6 年前

    DR:是一个 IOSurfaceRef 清除并将其状态更改为后要写入的有效表面 kIOSurfacePurgeableEmpty ?


    我想更好地理解 IOSurface 被净化。我遇到的唯一文件是 IOSurfaceRef.h 我遇到的唯一示例代码是WebKit。

    我正在使用命令行工具 memory_pressure 要模拟临界内存压力环境10秒钟,请执行以下操作:

    > memory_pressure -S -s 10 -l critical
    

    我编写了一个非常简单的应用程序,它可以分配100个 IOSurfaces 具有相同的属性。当我使用仪器测量内存分配时,我看到 VM: IOSurface 大约6GB,每个表面约6MB。(4096X4096X4)

    然后我改变每一个的可清除状态 碘表面 kIOSurfacePurgeableVolatile 运行内存压力模拟。

    仪器仍然报告我分配了6GB的表面。但是,如果我检查每个表面的可清除状态,它们会被标记为 无需手术治疗 .

    所以看起来它们被成功清除了,但是内存仍然分配给我的应用程序。为什么会这样?这些表面处于什么状态?

    头文件声明我应该假设它们中有“未定义的内容”。够公平的。

    但事实上 碘芥 IOSurface * 对象仍然有效?我可以成功地查询它的所有属性,并且可以成功地为读写而锁定它。

    是否允许我重新使用该对象,即使其内容已被清除,还是必须放弃该实例并创建一个全新的iosurface?

    麦考斯10.14

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ken Thomases    6 年前

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

    基本上,当系统处于内存压力下时,它通常会将数据输出到磁盘。将可清除对象标记为volatile允许系统简单地丢弃该数据。该应用程序已经表明,虽然它很高兴拥有,但它不必拥有,并且可以在必要时重新创建。

    当它想与 IOSurface 同样,应用程序应该将对象标记为非易失性,并检查旧状态。如果它是空的,那么应用程序应该重新创建数据。

    Instruments报告您的应用程序仍分配了6GB的原因是它为 碘表面 但分配并不一定意味着由物理RAM或交换文件支持。在实际使用内存之前,它只是记账。你的应用程序的驻留集大小(RSS)应该缩小。