Можете ли вы использовать очищенную поверхность IOS? - PullRequest
0 голосов
/ 06 февраля 2019

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

1 Ответ

0 голосов
/ 06 февраля 2019

Да, все еще можно использовать.Просто пиксельные данные были потеряны.

Обычно, когда система находится под давлением памяти, она обычно выдает данные на диск.Маркировка очищаемого объекта volatile позволяет вместо этого просто отбросить эти данные.Приложение указало, что, хотя оно и доступно, но не обязательно и может быть воссоздано при необходимости.

Когда оно снова хочет работать с IOSurface, приложение должно пометитьобъект энергонезависимый и проверьте старое состояние.Если оно пустое, то приложение должно воссоздать данные.

Причина, по которой Instruments сообщает, что вашему приложению все еще выделено 6 ГБ, заключается в том, что у него есть 6 ГБ его адресного пространства, зарезервированного для IOSurface с.Но выделение не обязательно означает поддержку физической памяти или файла подкачки.Это просто бухгалтерия, пока память фактически не используется.Размер резидентного набора вашего приложения (RSS) должен уменьшиться.

...