2010-06-14 20 views
15

एनडीके डाउनलोड पेज नोट करता है कि, "एनडीके के लिए विशिष्ट अच्छे उम्मीदवार स्वयं निहित हैं, सीपीयू-गहन ऑपरेशंस जो सिग्नल प्रोसेसिंग, भौतिकी सिमुलेशन आदि जैसे बहुत मेमोरी आवंटित नहीं करते हैं।"एनडीके में कितनी मेमोरी आवंटन है?

मैं एक सी पृष्ठभूमि से आया था और एनडीके का उपयोग करने के लिए एनडीके का उपयोग करने के लिए उत्साहित था और मेरे अधिकांश ओपनजीएल ईएस कार्यों और भौतिकी से संबंधित किसी भी मूल कार्य, शिखर के एनीमेशन आदि को संचालित करने के लिए उत्साहित था ... मुझे लगता है कि मैं ' मैं मूल कोड पर थोड़ा सा निर्भर करता हूं और सोच रहा हूं कि क्या मैं कुछ गलतियां कर रहा हूं। मुझे इस बिंदु पर परीक्षण करने में कोई दिक्कत नहीं हुई है, लेकिन अगर मैं भविष्य में समस्याओं में भाग लेता हूं तो मुझे उत्सुकता है।

उदाहरण के लिए, मेरे पास गेम स्ट्रक्चर परिभाषित है (कुछ हद तक सैन-एंजल्स उदाहरण में देखा जाता है)। मैं गतिशील रूप से ऑब्जेक्ट्स के लिए वर्टेक्स जानकारी लोड कर रहा हूं (केवल एक सक्रिय गेम क्षेत्र के लिए आवश्यक है) ताकि वर्टिस, मानक, बनावट निर्देशांक, सूचकांक और बनावट ग्राफिक डेटा के लिए स्मृति आवंटन हो रहा है ... केवल आवश्यक नामों का नाम देने के लिए । मैं खेल क्षेत्रों के बीच आवंटित करने के बारे में काफी सावधान हूं।

क्या मैं सरणी आकारों पर कुछ कैप्स को सुरक्षित रखूंगा या क्या मैं अब जा रहा हूं क्योंकि मैं बहादुरी से आगे चार्ज कर सकता हूं?

उत्तर

9

चूंकि एनडीके का उपयोग करने वाले अनुप्रयोगों को एसडीके का उपयोग करके विकसित किए गए लोगों के समान व्यवहार करना चाहिए, मुझे लगता है कि उचित ढेर उपयोग के लिए सबसे अच्छा मार्गदर्शन 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 संपत्ति डिफ़ॉल्ट रूप से स्थापित है न के रूप में होने की संभावना महत्वपूर्ण है।

+0

धन्यवाद टिम। 16 एमबी के तहत रहने वाला यह थोड़ा डरावना है। अगर मैं इस अधिकार को समझता हूं, तो यह एक टोपी है जिसे फोन निर्माता द्वारा ओएस के निर्माण द्वारा कार्यान्वित किया जा सकता है ताकि प्रत्येक एप्लिकेशन केवल कुछ निश्चित स्मृति तक पहुंच सके? यदि वह टोपी सेट नहीं है, तो क्या प्रत्येक एप्लिकेशन उपलब्ध रैम (पाठ्यक्रम के भीतर) जितना आवश्यक हो उतना आवंटित कर सकता है? क्या आप कह रहे हैं कि जब आपके फोन पर GetMemoryClass() चलाया जाता है तो वे शून्य हो जाते हैं? आपके पास कौन से फोन हैं, अगर मैं पूछने के लिए इतना साहसी हो सकता हूं ... क्या कहीं भी ऐसे नए फोन के लिए इस सीमा पर जानकारी हो सकती है? (क्या मैं आधार से पूरी तरह से बंद हूं?) – Maximus

+5

मुझे वास्तव में एनडीके समूह की खोज करनी चाहिए ... डियान हैकबर्न से। "यह भी दिया गया कि यह एनडीके सूची है, सीमा वास्तव में आपके लिए लगाई गई नहीं है, क्योंकि यह केवल जावा ढेर पर है। देशी ढेर में आवंटन पर कोई सीमा नहीं है ..." वह कहने जा रही है कि इसका दुरुपयोग नहीं किया जाना चाहिए और यदि आवेदनों की तुलना में यह मारा जा सकता है। यह धागा है, यह सामान्य रूप से विषय पर एक अच्छा पठन है। http://groups.google.com/group/android-ndk/browse_thread/thread/95c9f0cecceb112a/ab033b9a28d52fcd?lnk=gst&q=heap+limit#ab033b9a28d52fcd – Maximus

+1

@Maximus डायने की टिप्पणी यह ​​बहुत अच्छी तरह से कुल मिलाकर। जबकि वहाँ कितना ढेर NDK (चल 'ulimit -d'' रिटर्न unlimited') के साथ आवंटित किया जा सकता है पर एक कठिन सीमा नहीं है, वहाँ सभी उपलब्ध स्मृति का उपयोग करने के लिए परिणाम हैं। –

संबंधित मुद्दे