Сколько слишком много выделения памяти в NDK?

Страница загрузки NDK отмечает, что, "Типичные хорошие кандидаты на NDK являются автономными, интенсивными действиями ЦП, которые не выделяют много памяти, такой как обработка сигналов, моделирование физики, и так далее".

Я произошел из среды C и был счастлив попытаться использовать NDK для работы большинством моих функций ES OpenGL и любыми собственными функциями, связанными с физикой, анимацией вершин, и т.д... Я нахожу, что полагаюсь вполне немного на Собственный код и задаюсь вопросом, могу ли я делать некоторые ошибки. Я не испытал затруднений протестировать в этой точке, но мне любопытно, если я могу столкнуться с проблемами в будущем.

Например, у меня есть игровая определенная структура (несколько как, замечен в примере San-Angeles). Я загружаю информацию о вершине для объектов динамично (что необходимо для активной игровой области), таким образом, существует довольно мало выделения памяти, происходящего для вершин, normals, координат текстуры, индексов и графических данных структуры... только для именования основ. Я довольно осторожен относительно освобождения, что выделяется между игровыми областями.

Я был бы более безопасной установкой некоторых ограничений на размерах массива, или я должен заряжаться смело вперед, поскольку я иду теперь?

18
задан Maximus 14 June 2010 в 17:24
поделиться

1 ответ

Поскольку приложения, использующие NDK, должны вести себя аналогично приложениям, разработанным с использованием SDK, я думаю, что лучшее руководство по разумному использованию кучи можно найти в комментариях к ActivityManager.java .

/**
 * Return the approximate per-application memory class of the current
 * device.  This gives you an idea of how hard a memory limit you should
 * impose on your application to let the overall system work best.  The
 * returned value is in megabytes; the baseline Android memory class is
 * 16 (which happens to be the Java heap limit of those devices); some
 * device with more memory may return 24 or even higher numbers.
 */
public int getMemoryClass() {
    return staticGetMemoryClass();
}

/** @hide */
static public int staticGetMemoryClass() {
    // Really brain dead right now -- just take this from the configured
    // vm heap size, and assume it is in megabytes and thus ends with "m".
    String vmHeapSize = SystemProperties.get("dalvik.vm.heapsize", "16m");
    return Integer.parseInt(vmHeapSize.substring(0, vmHeapSize.length()-1));
}

Код, который устанавливает размер кучи для виртуальной машины Dalvik, находится в AndroidRuntime.cpp и предоставляет пример того, как определить приблизительный предел для выделения кучи в машинном коде с помощью property_get ] функция.

strcpy(heapsizeOptsBuf, "-Xmx");
property_get("dalvik.vm.heapsize", heapsizeOptsBuf+4, "16m");
//LOGI("Heap size: %s", heapsizeOptsBuf);
opt.optionString = heapsizeOptsBuf;
mOptions.add(opt);

Значение по умолчанию 16m , вероятно, важно, поскольку ни один из двух телефонов Android, которыми я владею, не имеет свойства dalvik.vm.heapsize , установленного по умолчанию.

10
ответ дан 30 November 2019 в 09:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: