Я пытаюсь оптимизировать потребление текстурной памяти в своем родном приложении для Android. У меня есть два счетчика: первый - мой, который увеличивается каждый раз при вызове TexImage:
g_cbTextureMemory += ImageLineBytes(Format, width) * height;
Вы можете предположить, что TexImage вызывается один раз для текстуры, в моем реальном коде уменьшение текущего размера изображения меньше, чем добавление нового, если текстура перераспределена, но на самом деле перераспределения не происходит.
Второй из системы:
adb shell dumpsys meminfo my.app.name
Это дает что-то вроде этого:
** MEMINFO in pid 3269 [my.app.name] **
native dalvik other total
size: 39320[*] 6663 N/A 45983
allocated: 21453 3945 N/A 25398
free: 34 2718 N/A 2752
(Pss): 6281 3078 40643 50002
(shared dirty): 2240 4968 12108 19316
(priv dirty): 6232 2684 17948 26864
После этого я делаю следующее: я заменяю все текстуры на 1x1 (отправляя фиктивное изображение 1x1 в glTexImage). Я вижу, что meminfo дает другой результат, и ячейка разницы [*] изменилась на 22Mb. Но мой счетчик показывает, что у меня 25Mb текстур, поэтому я ожидаю 25Mb.
Так где в дампе текстура памяти потребляется скрытно? Для ясности, для дампов текстур 1х1:
** MEMINFO in pid 3269 [my.app.name] **
native dalvik other total
size: 16892 5575 N/A 22467
allocated: 13211 3574 N/A 16785
free: 208 2001 N/A 2209
(Pss): 6273 3122 17016 26411
(shared dirty): 2252 5032 10756 18040
(priv dirty): 6224 2588 5848 14660
Почему я не получил 25Mb? Является ли статистическая ошибка? Включает ли родная куча текстурную память (кажется, что так и есть)? Или, может быть, для некоторых форматов Android имеют внутренние форматы, отличные от тех, которые я отправляю? Например, R8G8B8 трансформируется во что-то более оптимальное (кажется, что это не так)? Может все нормально, и есть рациональное объяснение?