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