Страница загрузки NDK отмечает, что, "Типичные хорошие кандидаты на NDK являются автономными, интенсивными действиями ЦП, которые не выделяют много памяти, такой как обработка сигналов, моделирование физики, и так далее".
Я произошел из среды C и был счастлив попытаться использовать NDK для работы большинством моих функций ES OpenGL и любыми собственными функциями, связанными с физикой, анимацией вершин, и т.д... Я нахожу, что полагаюсь вполне немного на Собственный код и задаюсь вопросом, могу ли я делать некоторые ошибки. Я не испытал затруднений протестировать в этой точке, но мне любопытно, если я могу столкнуться с проблемами в будущем.
Например, у меня есть игровая определенная структура (несколько как, замечен в примере San-Angeles). Я загружаю информацию о вершине для объектов динамично (что необходимо для активной игровой области), таким образом, существует довольно мало выделения памяти, происходящего для вершин, normals, координат текстуры, индексов и графических данных структуры... только для именования основ. Я довольно осторожен относительно освобождения, что выделяется между игровыми областями.
Я был бы более безопасной установкой некоторых ограничений на размерах массива, или я должен заряжаться смело вперед, поскольку я иду теперь?
Поскольку приложения, использующие 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
, установленного по умолчанию.