সতর্ক না হলে ছবি নিয়ে কাজ করার সময় দ্রুত পারফরম্যান্স সংক্রান্ত সমস্যা দেখা দিতে পারে। বড় আকারের বিটম্যাপ নিয়ে কাজ করার সময় খুব সহজেই OutOfMemoryError দেখা দিতে পারে। আপনার অ্যাপের সেরা পারফরম্যান্স নিশ্চিত করতে এই সেরা অনুশীলনগুলো অনুসরণ করুন।
আপনার প্রয়োজন অনুযায়ী বিটম্যাপের আকার লোড করুন।
বেশিরভাগ স্মার্টফোনে উচ্চ রেজোলিউশনের ক্যামেরা থাকে যা বড় আকারের ইমেজ ফাইল তৈরি করে। আপনি যদি স্ক্রিনে কোনো ছবি দেখাতে চান, তবে আপনাকে অবশ্যই ছবির রেজোলিউশন কমাতে হবে অথবা শুধুমাত্র আপনার ইমেজ কন্টেইনারের আকার পর্যন্ত ছবিটি লোড করতে হবে। প্রয়োজনের চেয়ে বড় ছবি ক্রমাগত লোড করার ফলে জিপিইউ ক্যাশে নিঃশেষ হয়ে যেতে পারে, যার ফলে ইউআই রেন্ডারিং কম পারফর্ম করে।
ছবির আকার পরিচালনা করতে:
- আপনার ইমেজ ফাইলগুলোকে যথাসম্ভব ছোট করুন (আউটপুট ইমেজকে প্রভাবিত না করে)।
- আপনার ছবিগুলোকে JPEG বা PNG-এর পরিবর্তে WEBP ফরম্যাটে রূপান্তর করার কথা বিবেচনা করুন।
- বিভিন্ন স্ক্রিন রেজোলিউশনের জন্য ছোট ছবি সরবরাহ করুন ( টিপ #৩ দেখুন),
- একটি ইমেজ লোডিং লাইব্রেরি ব্যবহার করুন, যা আপনার ইমেজকে স্ক্রিনের আকারের সাথে মানানসই করে ছোট করে নেয়। এটি আপনার স্ক্রিনের লোডিং পারফরম্যান্স উন্নত করতে সাহায্য করতে পারে।
সম্ভব হলে বিটম্যাপের পরিবর্তে ভেক্টর ব্যবহার করুন।
স্ক্রিনে কোনো কিছু দৃশ্যমানভাবে উপস্থাপন করার সময়, আপনাকে সিদ্ধান্ত নিতে হবে যে সেটিকে ভেক্টর হিসেবে দেখানো যাবে কি না। বিটম্যাপের চেয়ে ভেক্টর ইমেজকে বেশি প্রাধান্য দিন, কারণ এগুলোকে বিভিন্ন আকারে স্কেল করলেও পিক্সেল ফেটে যায় না। তবে, সবকিছুকে ভেক্টর হিসেবে দেখানো যায় না – ক্যামেরা দিয়ে তোলা ছবিকে ভেক্টরে রূপান্তর করা যায় না।
বিভিন্ন স্ক্রিন আকারের জন্য বিকল্প সংস্থান সরবরাহ করুন
আপনি যদি আপনার অ্যাপের সাথে ছবি সরবরাহ করেন, তবে বিভিন্ন ডিভাইসের রেজোলিউশনের জন্য ভিন্ন ভিন্ন আকারের অ্যাসেট দেওয়ার কথা বিবেচনা করতে পারেন। এটি ডিভাইসে আপনার অ্যাপের ডাউনলোড সাইজ কমাতে এবং পারফরম্যান্স উন্নত করতে সাহায্য করতে পারে, কারণ এটি কম রেজোলিউশনের ডিভাইসে আরও কম রেজোলিউশনের ছবি লোড করবে। বিভিন্ন ডিভাইসের আকারের জন্য বিকল্প বিটম্যাপ সরবরাহ করার বিষয়ে আরও তথ্যের জন্য, বিকল্প বিটম্যাপ ডকুমেন্টেশন দেখুন ।
ImageBitmap ব্যবহার করার সময়, আঁকার আগে prepareToDraw কল করুন।
ImageBitmap ব্যবহার করার সময়, GPU-তে টেক্সচার আপলোড করার প্রক্রিয়া শুরু করতে, টেক্সচারটি আঁকার আগেই ImageBitmap#prepareToDraw() কল করুন। এটি GPU-কে টেক্সচার প্রস্তুত করতে এবং স্ক্রিনে ভিজ্যুয়াল দেখানোর পারফরম্যান্স উন্নত করতে সাহায্য করে। বেশিরভাগ ইমেজ লোডিং লাইব্রেরি ইতিমধ্যেই এই অপটিমাইজেশনটি করে থাকে, কিন্তু আপনি যদি নিজে ImageBitmap ক্লাস নিয়ে কাজ করেন, তবে বিষয়টি মনে রাখা উচিত।
আপনার কম্পোজেবলে প্যারামিটার হিসেবে Painter পরিবর্তে একটি Int DrawableRes বা ইউআরএল (URL) পাস করা শ্রেয়।
ইমেজ নিয়ে কাজ করার জটিলতার কারণে (উদাহরণস্বরূপ, Bitmaps জন্য একটি ইকুয়ালস ফাংশন লেখা কম্পিউটেশনালি ব্যয়বহুল হবে), Painter এপিআই-কে স্পষ্টভাবে স্টেবল ক্লাস হিসেবে চিহ্নিত করা হয় না। আনস্টেবল ক্লাসের কারণে অপ্রয়োজনীয় রিকম্পোজিশন হতে পারে, কারণ ডেটা পরিবর্তিত হয়েছে কিনা তা কম্পাইলার সহজে অনুমান করতে পারে না।
অতএব, Painter প্যারামিটার হিসেবে পাঠানোর পরিবর্তে, আপনার কম্পোজেবলে একটি ইউআরএল (URL) বা ড্রয়েবল রিসোর্স আইডি (drawable resource ID) প্যারামিটার হিসেবে পাঠানোই শ্রেয়।
// Prefer this:
@Composable
fun MyImage(url: String) {
}
// Over this:
@Composable
fun MyImage(painter: Painter) {
}
প্রয়োজনের চেয়ে বেশি সময় ধরে মেমরিতে বিটম্যাপ সংরক্ষণ করবেন না।
আপনি মেমরিতে যত বেশি বিটম্যাপ লোড করবেন, ডিভাইসে মেমরি শেষ হয়ে যাওয়ার সম্ভাবনা তত বেড়ে যাবে। উদাহরণস্বরূপ, স্ক্রিনে ইমেজ কম্পোজেবল-এর একটি বড় তালিকা লোড করার সময়, তালিকাটি স্ক্রল করার সময় মেমরি খালি হওয়া নিশ্চিত করতে LazyColumn বা LazyRow ব্যবহার করুন।
আপনার AAB/APK ফাইলের সাথে বড় আকারের ছবি যুক্ত করবেন না।
অ্যাপ ডাউনলোডের আকার বড় হওয়ার অন্যতম প্রধান কারণ হলো AAB বা APK ফাইলের ভেতরে থাকা গ্রাফিক্স। আপনি প্রয়োজনের চেয়ে বড় ইমেজ ফাইল প্যাকেজ করছেন না, তা নিশ্চিত করতে APK অ্যানালাইজার টুল ব্যবহার করুন। ফাইলের আকার কমান অথবা ইমেজগুলো একটি সার্ভারে রেখে শুধু প্রয়োজনের সময় ডাউনলোড করার কথা বিবেচনা করুন।
{% হুবহু %}আপনার জন্য প্রস্তাবিত
- দ্রষ্টব্য: জাভাস্ক্রিপ্ট বন্ধ থাকলেও লিঙ্কের লেখা প্রদর্শিত হয়।
- ইমেজবিটম্যাপ বনাম ইমেজভেক্টর {:#bitmap-vs-vector}
- কম্পোজে UI অবস্থা সংরক্ষণ করুন
- জেটপ্যাক কম্পোজ পর্যায়গুলি