Kolik je příliš mnoho alokace paměti v NDK?

hlasů
15

Stránka pro stažení NDK poznamenává, že „Typickými vhodnými kandidáty pro NDK je soběstačný, CPU-náročné operace, které nemají přidělit tolik paměti, jako je například zpracování signálů, simulaci chování, a tak dále.“

Přišel jsem z C pozadí a byl nadšený, zkuste použít NDK provozovat většinu svých OpenGL ES funkcí a některých původních funkcí souvisejících s fyzikou, animace vrcholů, atd ... já zjistil, že jsem se spoléhat docela bit na nativního kódu a přemýšlel, jestli můžu dělat nějaké chyby. Měl jsem žádné problémy s testováním v tomto bodě, ale jsem zvědavý, jestli mi může dostat do problémů v budoucnosti.

Například, mám hru struct definované (podobně jako je vidět na příkladu San-Angeles). Já načítání informací vertex pro objekty dynamicky (jen to, co je nezbytné pro aktivní hrací plochy), takže je tu docela dost alokace paměti děje na vrcholy, normály, texturovací souřadnice, indexy a textur grafických dat ... jen abychom jmenovali základy , Jsem docela opatrný o uvolnění co je alokována mezi herních oblastí.

Budu bezpečnější nastavení některé stropy na velikosti pole nebo bych měl účtovat statečně vpřed, jak jsem teď děje?

Položena 14/06/2010 v 18:24
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
9

Vzhledem k tomu, aplikace využívající NDK by se měl chovat podobně, která byla vyvinuta pomocí SDK, myslím, že nejlepší pokyny pro rozumné využití haldy pochází z připomínek 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));
}

Kód, který nastavuje velikost haldy pro Dalvik VM je v AndroidRuntime.cpp a poskytuje příklad pro to, jak určit, hrubý limit pro haldy přidělení v nativním kódu pomocí property_get funkci.

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

Výchozí hodnota 16mje pravděpodobně důležité, protože ani jeden z těchto dvou telefonech Vlastním tu dalvik.vm.heapsizevlastnost nastavena jako výchozí.

Odpovězeno 16/06/2010 v 04:17
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more