इमेज की परफ़ॉर्मेंस ऑप्टिमाइज़ करना

इमेज के साथ काम करते समय, परफ़ॉर्मेंस से जुड़ी समस्याएं तुरंत आ सकती हैं. इसलिए, आपको सावधानी बरतनी चाहिए. बड़े बिटमैप के साथ काम करते समय, आपको आसानी से OutOfMemoryError मिल सकता है. यह पक्का करने के लिए कि आपका ऐप्लिकेशन सबसे अच्छा परफ़ॉर्म करे, इन सबसे सही तरीकों को अपनाएं.

सिर्फ़ ज़रूरत के हिसाब से बिटमैप का साइज़ लोड करें

ज़्यादातर स्मार्टफ़ोन में हाई रिज़ॉल्यूशन वाले कैमरे होते हैं. इनसे बड़ी इमेज फ़ाइलें बनती हैं. अगर आपको स्क्रीन पर कोई इमेज दिखानी है, तो आपको इमेज का रिज़ॉल्यूशन कम करना होगा. इसके अलावा, इमेज को सिर्फ़ इमेज कंटेनर के साइज़ तक लोड किया जा सकता है. ज़रूरत से ज़्यादा बड़ी इमेज को लगातार लोड करने से, जीपीयू कैश मेमोरी खत्म हो सकती है. इससे यूज़र इंटरफ़ेस (यूआई) रेंडरिंग की परफ़ॉर्मेंस कम हो जाती है.

इमेज के साइज़ मैनेज करने के लिए:

  • अपनी इमेज फ़ाइलों को जितना हो सके उतना छोटा करें, ताकि आउटपुट इमेज पर कोई असर न पड़े.
  • JPEG या PNG के बजाय, अपनी इमेज को WEBP फ़ॉर्मैट में बदलें.
  • अलग-अलग स्क्रीन रिज़ॉल्यूशन के लिए छोटी इमेज उपलब्ध कराएं (तीसरा सुझाव देखें),
  • इमेज लोड करने वाली लाइब्रेरी का इस्तेमाल करें. यह लाइब्रेरी, आपकी इमेज को स्क्रीन पर दिखने वाले साइज़ के हिसाब से छोटा करती है. इससे आपकी स्क्रीन के लोड होने की परफ़ॉर्मेंस को बेहतर बनाने में मदद मिल सकती है.

जहां भी हो सके वहां बिटमैप के बजाय वेक्टर का इस्तेमाल करें

स्क्रीन पर किसी चीज़ को विज़ुअल तौर पर दिखाने के लिए, आपको यह तय करना होगा कि उसे वेक्टर के तौर पर दिखाया जा सकता है या नहीं. बिटमैप के बजाय वेक्टर इमेज का इस्तेमाल करें, क्योंकि इन्हें अलग-अलग साइज़ में स्केल करने पर ये पिक्सलेट नहीं होती हैं. हालांकि, हर चीज़ को वेक्टर के तौर पर नहीं दिखाया जा सकता. जैसे, कैमरे से ली गई इमेज को वेक्टर में नहीं बदला जा सकता.

अलग-अलग स्क्रीन साइज़ के लिए, वैकल्पिक संसाधन उपलब्ध कराएं

अगर आपको अपने ऐप्लिकेशन के साथ इमेज शिप करनी हैं, तो अलग-अलग डिवाइस रिज़ॉल्यूशन के लिए अलग-अलग साइज़ की ऐसेट उपलब्ध कराएं. इससे डिवाइसों पर आपके ऐप्लिकेशन का डाउनलोड साइज़ कम करने में मदद मिल सकती है. साथ ही, परफ़ॉर्मेंस को बेहतर बनाया जा सकता है, क्योंकि यह कम रिज़ॉल्यूशन वाले डिवाइस पर कम रिज़ॉल्यूशन वाली इमेज लोड करेगा. अलग-अलग डिवाइस के साइज़ के लिए, बिटमैप के विकल्प उपलब्ध कराने के बारे में ज़्यादा जानने के लिए, बिटमैप के विकल्प का दस्तावेज़ देखें.

ImageBitmap का इस्तेमाल करते समय, ड्रॉ करने से पहले prepareToDraw को कॉल करें

ImageBitmap का इस्तेमाल करते समय, टेक्सचर को जीपीयू पर अपलोड करने की प्रोसेस शुरू करने के लिए, उसे असल में ड्रॉ करने से पहले ImageBitmap#prepareToDraw() को कॉल करें. इससे जीपीयू को टेक्सचर तैयार करने में मदद मिलती है. साथ ही, स्क्रीन पर विज़ुअल दिखाने की परफ़ॉर्मेंस बेहतर होती है. इमेज लोड करने वाली ज़्यादातर लाइब्रेरी, पहले से ही इस तरह का ऑप्टिमाइज़ेशन करती हैं. हालांकि, अगर आपको ImageBitmap क्लास के साथ काम करना है, तो आपको इस बात का ध्यान रखना होगा.

Painter के बजाय, अपने कंपोज़ेबल में पैरामीटर के तौर पर Int DrawableRes या यूआरएल पास करें

इमेज को मैनेज करने में कई तरह की समस्याएं आती हैं. उदाहरण के लिए, Bitmaps के लिए बराबर का फ़ंक्शन लिखना काफ़ी मुश्किल होता है. इसलिए, Painter एपीआई को साफ़ तौर पर Stable क्लास के तौर पर मार्क नहीं किया गया है. अस्थिर क्लास की वजह से, ज़रूरत न होने पर भी फिर से कंपोज़िशन हो सकती है. ऐसा इसलिए होता है, क्योंकि कंपाइलर आसानी से यह पता नहीं लगा पाता कि डेटा में बदलाव हुआ है या नहीं.

इसलिए, अपने कंपोज़ेबल में पैरामीटर के तौर पर Painter पास करने के बजाय, यूआरएल या ड्रॉएबल रिसॉर्स आईडी पास करना बेहतर होता है.

// Prefer this:
@Composable
fun MyImage(url: String) {

}
// Over this:
@Composable
fun MyImage(painter: Painter) {

}

बिटमैप को मेमोरी में ज़रूरत से ज़्यादा समय तक सेव न करें

मेमोरी में जितने ज़्यादा बिटमैप लोड किए जाते हैं, डिवाइस में मेमोरी खत्म होने की संभावना उतनी ही ज़्यादा होती है. उदाहरण के लिए, अगर स्क्रीन पर Image कंपोज़ेबल की बड़ी सूची लोड की जा रही है, तो LazyColumn या LazyRow का इस्तेमाल करें. इससे यह पक्का किया जा सकेगा कि बड़ी सूची को स्क्रोल करते समय मेमोरी खाली हो जाए.

अपनी AAB/APK फ़ाइल में बड़ी इमेज पैकेज न करें

ऐप्लिकेशन के डाउनलोड साइज़ के ज़्यादा होने की एक मुख्य वजह, AAB या APK फ़ाइल में पैकेज किए गए ग्राफ़िक होते हैं. APK विश्लेषक टूल का इस्तेमाल करके यह पक्का करें कि आपने ज़रूरत से ज़्यादा साइज़ वाली इमेज फ़ाइलों को पैकेज नहीं किया है. इमेज का साइज़ कम करें या इमेज को किसी सर्वर पर रखें और सिर्फ़ ज़रूरत पड़ने पर उन्हें डाउनलोड करें.