اندروید شامل برخی گزینههای توسعهدهنده روی دستگاه است که به شما کمک میکند تا تجسم کنید که برنامه شما در کجا ممکن است با مشکلاتی در رندر رابط کاربری خود مواجه شود، مانند انجام کار رندرینگ بیشتر از حد لازم، یا اجرای عملیات طولانی thread و GPU. این صفحه نحوه اشکالزدایی از overdraw GPU و پروفایل رندرینگ GPU را شرح میدهد.
برای کسب اطلاعات بیشتر در مورد گزینههای توسعهدهنده روی دستگاه، از جمله نحوه فعال کردن آنها، پیکربندی گزینههای توسعهدهنده روی دستگاه را مطالعه کنید.
سرعت رندر پروفایل GPU
ابزار رندرینگ پردازنده گرافیکی پروفایل (Profile GPU Rendering) به صورت یک هیستوگرام پیمایشی، مدت زمان لازم برای رندر فریمهای یک پنجره رابط کاربری را نسبت به معیار ۱۶.۶۷ میلیثانیه برای هر فریم، به صورت بصری نمایش میدهد.
در پردازندههای گرافیکی ضعیفتر، نرخ پر شدن (سرعتی که پردازنده گرافیکی میتواند بافر فریم را پر کند) میتواند بسیار پایین باشد. با افزایش تعداد پیکسلهای مورد نیاز برای ترسیم یک فریم، پردازنده گرافیکی ممکن است برای پردازش دستورات جدید زمان بیشتری صرف کند و باعث شود بقیه سیستم منتظر بماند تا پردازنده گرافیکی بتواند به آن برسد.
ابزار پروفایلینگ به شما کمک میکند تا تشخیص دهید چه زمانی پردازنده گرافیکی (GPU) در تلاش برای ترسیم پیکسلها دچار مشکل میشود یا چه زمانی تحت فشار بیش از حد بارگذاری (overdraw) قرار میگیرد.
فعال کردن پروفایلر
قبل از شروع، مطمئن شوید که از دستگاهی با اندروید ۴.۱ (سطح API ۱۶) یا بالاتر استفاده میکنید و گزینههای توسعهدهنده را فعال کردهاید . برای شروع پروفایلبندی رندر GPU دستگاه هنگام استفاده از برنامه، مراحل زیر را دنبال کنید:
- در دستگاه خود، به تنظیمات (Settings) بروید و روی گزینههای توسعهدهنده (Developer Options) ضربه بزنید.
- در بخش نظارت ، بسته به نسخه اندروید در حال اجرا روی دستگاه، گزینه Profile GPU Rendering یا Profile HWUI rendering را انتخاب کنید.
- در پنجره Profile GPU Rendering، گزینه On screen as bars را انتخاب کنید تا نمودارها روی صفحه دستگاه شما نمایش داده شوند.
- برنامهای را که میخواهید نمایهسازی کنید، باز کنید.
خروجی را بررسی کنید
در تصویر بزرگشدهی نمودار رندرینگ پردازندهی گرافیکی پروفایل که در شکل ۱ نشان داده شده است، میتوانید بخش رنگی را همانطور که در اندروید ۶.۰ (سطح API ۲۳) نمایش داده شده است، مشاهده کنید.

شکل ۱. نمودار رندرینگ پردازنده گرافیکی با پروفایل بزرگشده.
در مورد خروجی، چند نکته قابل توجه است:
- برای هر برنامه قابل مشاهده، این ابزار یک نمودار نمایش میدهد.
- هر نوار عمودی در امتداد محور افقی، نشان دهنده یک فریم است و ارتفاع هر نوار عمودی، مدت زمانی را که فریم برای رندر شدن صرف کرده است (بر حسب میلی ثانیه) نشان میدهد.
- خط سبز افقی نشاندهندهی ۱۶.۶۷ میلیثانیه است. برای دستیابی به ۶۰ فریم در ثانیه، نوار عمودی هر فریم باید زیر این خط قرار گیرد. هر زمان که نوار از این خط فراتر رود، ممکن است در انیمیشنها مکث ایجاد شود.
- این ابزار فریمهایی را که از آستانه ۱۶.۶۷ میلیثانیه فراتر میروند، با پهنتر کردن و کاهش شفافیت نوار مربوطه، برجسته میکند.
- هر نوار دارای اجزای رنگی است که به یک مرحله در خط لوله رندرینگ نگاشت میشوند. تعداد اجزا بسته به سطح API دستگاه متفاوت است.
جدول زیر توضیحاتی در مورد هر بخش از یک نوار عمودی در خروجی پروفایلر هنگام استفاده از دستگاهی با اندروید ۶.۰ و بالاتر ارائه میدهد.
| جزء بار | مرحله رندرینگ | توضیحات |
|---|---|---|
| بافرهای مبادلهای | نشان دهنده زمانی است که CPU منتظر اتمام کار GPU است. اگر این نوار بلند شود، به این معنی است که برنامه کار زیادی را روی GPU انجام میدهد. | |
| مشکل فرمان | نشان دهنده زمانی است که رندرکننده دوبعدی اندروید صرف صدور دستورات به OpenGL برای ترسیم و ترسیم مجدد لیستهای نمایش میکند. ارتفاع این نوار مستقیماً با مجموع زمانی که طول میکشد تا هر لیست نمایش اجرا شود متناسب است - لیستهای نمایش بیشتر برابر با نوار قرمز بلندتر است. | |
| همگامسازی و آپلود | نشان دهنده مدت زمان لازم برای آپلود اطلاعات بیت مپ به پردازنده گرافیکی (GPU) است. یک بخش بزرگ نشان میدهد که برنامه برای بارگذاری حجم زیادی از تصاویر گرافیکی، زمان قابل توجهی را صرف میکند. | |
| قرعه کشی | نشان دهنده زمان صرف شده برای ایجاد و بروزرسانی لیستهای نمایش نما است. اگر این بخش از نوار بلند باشد، ممکن است ترسیم نمای سفارشی زیادی انجام شده باشد، یا کار زیادی در متدهای onDraw انجام شده باشد. | |
| اندازهگیری / چیدمان | نشان دهنده میزان زمان صرف شده برای فراخوانیهای onLayout و onMeasure در سلسله مراتب نما است. یک بخش بزرگ نشان میدهد که پردازش سلسله مراتب نما زمان زیادی میبرد. | |
| مدیریت ورودی و انیمیشن | نشان دهنده مدت زمانی است که برای ارزیابی تمام انیمیشنسازهایی که برای آن فریم اجرا شدهاند و مدیریت تمام فراخوانیهای ورودی صرف شده است. اگر این بخش بزرگ باشد، میتواند نشان دهد که یک انیمیشنساز سفارشی یا فراخوانی ورودی، زمان زیادی را صرف پردازش میکند. اتصال نما در حین پیمایش، مانند RecyclerView.Adapter.onBindViewHolder() ، نیز معمولاً در این بخش رخ میدهد و منبع رایجتری برای کاهش سرعت در این بخش است. | |
| زمان متفرقه / تأخیر VSync | نشان دهنده زمانی است که برنامه صرف اجرای عملیات بین دو فریم متوالی میکند. این ممکن است نشانهای از پردازش بیش از حد در نخ رابط کاربری باشد که میتواند به نخ دیگری منتقل شود. |
جدول ۱. نوارهای کامپوننت در اندروید ۶.۰ و بالاتر.
نسخههای اندروید بین ۴.۰ (سطح API ۱۴) و ۵.۰ (سطح API ۲۱) دارای بخشهای آبی، بنفش، قرمز و نارنجی هستند. نسخههای اندروید پایینتر از ۴.۰ فقط اجزای آبی، قرمز و نارنجی دارند. جدول زیر نوارهای اجزا را در اندروید ۴.۰ و ۵.۰ نشان میدهد.
| جزء بار | مرحله رندرینگ | توضیحات |
|---|---|---|
| فرآیند | نشان دهنده زمانی است که CPU منتظر اتمام کار GPU است. اگر این نوار بلند شود، به این معنی است که برنامه کار زیادی را روی GPU انجام میدهد. | |
| اجرا | نشان دهنده زمانی است که رندرکننده دوبعدی اندروید صرف صدور دستورات به OpenGL برای ترسیم و ترسیم مجدد لیستهای نمایش میکند. ارتفاع این نوار مستقیماً با مجموع زمانی که طول میکشد تا هر لیست نمایش اجرا شود متناسب است - لیستهای نمایش بیشتر برابر با نوار قرمز بلندتر است. | |
| ایکسفر | نشان دهنده مدت زمان لازم برای آپلود اطلاعات بیت مپ به پردازنده گرافیکی (GPU) است. یک بخش بزرگ نشان میدهد که برنامه زمان قابل توجهی را برای بارگذاری حجم زیادی از گرافیک صرف میکند. این بخش در دستگاههایی که اندروید ۴.۰ یا پایینتر دارند قابل مشاهده نیست. | |
| بهروزرسانی | نشان دهنده زمان صرف شده برای ایجاد و بروزرسانی لیستهای نمایش نما است. اگر این بخش از نوار بلند باشد، ممکن است ترسیم نمای سفارشی زیادی انجام شده باشد، یا کار زیادی در متدهای onDraw انجام شده باشد. |
جدول 2. نوارهای کامپوننت در اندروید 4.0 و 5.0.
برای اطلاعات بیشتر در مورد نحوه تفسیر اطلاعات ارائه شده توسط ابزار پروفایلینگ، بخش «تحلیل با رندرینگ پردازنده گرافیکی پروفایل» را مطالعه کنید.
توجه: اگرچه این ابزار Profile GPU Rendering نام دارد، اما تمام فرآیندهای تحت نظارت در واقع در CPU رخ میدهند. رندر کردن با ارسال دستورات به GPU انجام میشود و GPU صفحه را به صورت ناهمزمان رندر میکند. در شرایط خاص، GPU میتواند کار زیادی برای انجام دادن داشته باشد و CPU شما باید قبل از ارسال دستورات جدید منتظر بماند. وقتی این اتفاق میافتد، شاهد افزایش ناگهانی در نوارهای نارنجی و قرمز خواهید بود و ارسال دستور تا زمانی که فضای بیشتری در صف دستورات GPU ایجاد شود، مسدود میشود.
تجسم اضافه برداشت از پردازنده گرافیکی (GPU overdraw)
یکی دیگر از ویژگیهای موجود در گزینههای توسعهدهندگان، با کدگذاری رنگی رابط کاربری، به شما کمک میکند تا overdraw را شناسایی کنید. Overdraw زمانی اتفاق میافتد که برنامه شما بیش از یک بار در یک فریم، یک پیکسل را ترسیم میکند. بنابراین این تجسم نشان میدهد که برنامه شما در کجا ممکن است کار رندرینگ بیشتری نسبت به حد لازم انجام دهد، که میتواند به دلیل تلاش اضافی پردازنده گرافیکی برای رندر کردن پیکسلهایی که برای کاربر قابل مشاهده نیستند، یک مشکل عملکردی باشد. بنابراین، باید هر زمان که ممکن است، رویدادهای overdraw را برطرف کنید .
اگر قبلاً این کار را نکردهاید، گزینههای توسعهدهنده را فعال کنید . سپس، برای نمایش overdraw در دستگاه خود، مراحل زیر را دنبال کنید:
- در دستگاه خود، به تنظیمات (Settings) بروید و روی گزینههای توسعهدهنده (Developer Options) ضربه بزنید.
- به پایین اسکرول کنید تا به بخش رندرینگ شتابیافته توسط سختافزار برسید و گزینه Debug GPU Overdraw را انتخاب کنید.
- در پنجرهی Debug GPU overdraw ، گزینهی Show overdraw areas را انتخاب کنید.
اندروید عناصر رابط کاربری را برای شناسایی میزان overdraw به صورت زیر رنگآمیزی میکند:
- رنگ واقعی: بدون تغییر رنگ
آبی: ۱ بار بیش از حد برداشت شده
سبز: دو بار بیش از حد برداشت شده
صورتی: ۳ بار بیش از حد کشیده شده
قرمز: ۴ بار یا بیشتر بیش از حد برداشت شده است

شکل ۲. یک برنامه به صورت عادی (چپ) و به صورت فعال بودن GPU Overdraw (راست)
توجه داشته باشید که این رنگها نیمهشفاف هستند، بنابراین رنگ دقیقی که روی صفحه میبینید به محتوای رابط کاربری شما بستگی دارد.
حالا که میتوانید تشخیص دهید که overdraw در کجای طرحبندی شما رخ میدهد، نحوهی کاهش overdraw را بخوانید.
به یاد داشته باشید که مقداری overdraw اجتنابناپذیر است. همانطور که در حال تنظیم رابط کاربری برنامه خود هستید، سعی کنید به تصویری برسید که بیشتر رنگهای واقعی یا فقط ۱X overdraw (آبی) را نشان دهد.

شکل ۳. نمونههایی از یک برنامه با مقدار زیادی overdraw (چپ) و مقدار بسیار کمتری overdraw (راست)