TL; DR: IOSurfaceRef
является допустимой поверхностью для записи после того, как она была очищена и ее состояние изменилось на kIOSurfacePurgeableEmpty
?
Я пытаюсь получить лучшее пониманиео том, что это значит для IOSurface
, чтобы быть очищенным.Единственная документация, с которой я столкнулся, находится в IOSurfaceRef.h
, и единственный пример кода, с которым я столкнулся, находится в WebKit.
Я использую инструмент командной строки memory_pressure
для имитации критической нагрузки на память в течение 10 секунд, например:
> memory_pressure -S -s 10 -l critical
Я написал очень простое приложение, которое выделяет 100IOSurfaces
с идентичными свойствами.Когда я использую Инструменты для измерения распределения памяти, я вижу VM: IOSurface
примерно в 6 ГБ, что составляет около 6 МБ для каждой поверхности.(4096x4096x4)
Затем я меняю очищаемое состояние каждого IOSurface
на kIOSurfacePurgeableVolatile
и запускаю имитацию memory_pressure.
Приборы по-прежнему сообщают, что у меня выделено 6 ГБ поверхностей.Однако, если я проверяю очищаемое состояние каждой поверхности, они помечаются как kIOSurfacePurgeableEmpty
.
Таким образом, похоже, что они были успешно очищены, но память все еще выделена для моего приложения.Почему это и в каком состоянии находятся эти поверхности?
В заголовочном файле говорится, что я должен предположить, что в них есть «неопределенный контент».Достаточно справедливо.
Но фактический объект IOSurfaceRef
или IOSurface *
все еще действителен?Я могу успешно запросить все его свойства, и я могу успешно заблокировать его для чтения и записи.
Могу ли я просто повторно использовать этот объект, даже если его содержимое было очищено, или мне нужно отказаться от этого экземпляра и создать совершенно новую IOSurface?
macos 10.14