اگر مراقب نباشید، کار با تصاویر میتواند به سرعت مشکلات عملکردی ایجاد کند. هنگام کار با بیتمپهای بزرگ، به راحتی میتوانید با خطای OutOfMemoryError مواجه شوید. برای اطمینان از عملکرد بهینه برنامه خود، این نکات را دنبال کنید.
فقط اندازه بیتمپ مورد نیاز خود را بارگذاری کنید
بیشتر گوشیهای هوشمند دوربینهای با وضوح بالا دارند که فایلهای تصویری بزرگی تولید میکنند. اگر تصویری را روی صفحه نمایش میدهید، یا باید وضوح تصویر را کاهش دهید یا تصویر را فقط تا اندازهی ظرف تصویر خود بارگذاری کنید. بارگذاری مداوم تصاویر بزرگتر از حد نیاز میتواند حافظهی نهان پردازندهی گرافیکی (GPU) را مصرف کند و منجر به رندر رابط کاربری با عملکرد ضعیفتر شود.
برای مدیریت اندازه تصاویر:
- فایلهای تصویری خود را تا حد امکان کوچک کنید (بدون اینکه روی تصویر خروجی تأثیر بگذارد).
- به جای JPEG یا PNG ، تصاویر خود را به فرمت WEBP تبدیل کنید .
- تصاویر کوچکتری را برای وضوح صفحه نمایشهای مختلف ارائه دهید (به نکته شماره ۳ مراجعه کنید)،
- از یک کتابخانه بارگذاری تصویر استفاده کنید که تصویر شما را کوچک میکند تا با اندازه نمای شما روی صفحه نمایش متناسب شود. این میتواند به بهبود عملکرد بارگذاری صفحه نمایش شما کمک کند.
در صورت امکان از بردارها به جای بیتمپها استفاده کنید
هنگام نمایش بصری چیزی روی صفحه، باید تصمیم بگیرید که آیا میتوان آن را به صورت برداری نمایش داد یا خیر. تصاویر برداری را به تصاویر بیتمپ ترجیح دهید، زیرا وقتی آنها را در اندازههای مختلف مقیاسبندی میکنید، پیکسلی نمیشوند. با این حال، همه چیز را نمیتوان به صورت برداری نمایش داد - تصاویر گرفته شده با دوربین را نمیتوان به برداری تبدیل کرد.
منابع جایگزین را برای اندازههای مختلف صفحه نمایش ارائه دهید
اگر تصاویر را با برنامه خود ارسال میکنید، ارائه داراییهایی با اندازههای مختلف برای وضوح دستگاههای مختلف را در نظر بگیرید. این میتواند به کاهش حجم دانلود برنامه شما در دستگاهها کمک کند و عملکرد را بهبود بخشد زیرا تصویری با وضوح پایینتر در دستگاهی با وضوح پایینتر بارگذاری میشود. برای اطلاعات بیشتر در مورد ارائه بیتمپهای جایگزین برای اندازههای مختلف دستگاه، به مستندات بیتمپ جایگزین مراجعه کنید .
هنگام استفاده از ImageBitmap ، قبل از ترسیم، تابع prepareToDraw فراخوانی کنید.
هنگام استفاده از ImageBitmap ، برای شروع فرآیند آپلود بافت به GPU، قبل از رسم واقعی آن ImageBitmap#prepareToDraw() را فراخوانی کنید. این به GPU کمک میکند تا بافت را آماده کند و عملکرد نمایش تصویر روی صفحه را بهبود بخشد. اکثر کتابخانههای بارگذاری تصویر از قبل این بهینهسازی را انجام میدهند، اما اگر خودتان با کلاس ImageBitmap کار میکنید، باید این نکته را در نظر داشته باشید.
ترجیح میدهید به جای Painter یک Int DrawableRes یا URL را به عنوان پارامتر به composable خود ارسال کنید.
با توجه به پیچیدگیهای کار با تصاویر (برای مثال، نوشتن یک تابع تساوی برای Bitmaps از نظر محاسباتی پرهزینه خواهد بود)، API Painter به صراحت به عنوان یک کلاس Stable علامتگذاری نشده است. کلاسهای ناپایدار میتوانند منجر به ترکیبهای غیرضروری شوند زیرا کامپایلر نمیتواند به راحتی تشخیص دهد که آیا دادهها تغییر کردهاند یا خیر.
بنابراین، ترجیح داده میشود که به جای ارسال Painter به عنوان پارامتر، یک URL یا شناسه منبع drawable را به عنوان پارامتر به composable خود ارسال کنید.
// Prefer this:
@Composable
fun MyImage(url: String) {
}
// Over this:
@Composable
fun MyImage(painter: Painter) {
}
یک بیتمپ را بیش از نیاز در حافظه ذخیره نکنید
هرچه بیتمپهای بیشتری در حافظه بارگذاری کنید، احتمال کمبود حافظه در دستگاه بیشتر میشود. برای مثال، اگر لیست بزرگی از تصاویر قابل ترکیب را روی صفحه بارگذاری میکنید، LazyColumn یا LazyRow استفاده کنید تا هنگام پیمایش یک لیست بزرگ، حافظه آزاد شود.
تصاویر بزرگ را با فایل AAB/APK خود بستهبندی نکنید
One of the top causes for large app download size is due to graphics that are packaged inside the AAB or APK file. Use the APK analyzer tool to ensure that you aren't packaging larger than required image files. Reduce the sizes or consider placing the images on a server and only downloading them when required.
{% کلمه به کلمه %}برای شما توصیه میشود
- توجه: متن لینک زمانی نمایش داده میشود که جاوا اسکریپت غیرفعال باشد.
- ImageBitmap در مقابل ImageVector {:#bitmap-vs-vector}
- ذخیره وضعیت رابط کاربری در Compose
- مراحل نوشتن Jetpack