Сколько слишком много памяти выделяется в NDK? - PullRequest
18 голосов
/ 14 июня 2010

На странице загрузки NDK отмечается, что «типичными подходящими кандидатами для NDK являются автономные операции с интенсивным использованием процессора, которые не выделяют много памяти, такие как обработка сигналов, физическое моделирование и т. Д.»

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

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

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

1 Ответ

10 голосов
/ 16 июня 2010

Поскольку приложения, использующие 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 function.

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 не установлено по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...