بررسی سرعت رندر GPU و اضافه برداشت، بررسی سرعت رندر GPU و اضافه برداشت، بررسی سرعت رندر GPU و اضافه برداشت، بررسی سرعت رندر GPU و اضافه برداشت

Android شامل برخی از گزینه‌های توسعه‌دهنده روی دستگاه است که به شما کمک می‌کند تصور کنید برنامه‌تان در کجا ممکن است با مشکلات رندر UI خود مواجه شود، مانند انجام کارهای رندر بیشتر از حد لازم، یا اجرای عملیات‌های طولانی و GPU. این صفحه نحوه رفع اشکال اضافه برداشت GPU و رندر GPU نمایه را شرح می دهد.

برای کسب اطلاعات بیشتر درباره گزینه‌های برنامه‌نویس روی دستگاه، از جمله نحوه فعال کردن آنها، پیکربندی گزینه‌های برنامه‌نویس روی دستگاه را بخوانید.

سرعت رندر GPU نمایه

ابزار Profile GPU Rendering، به عنوان یک هیستوگرام پیمایشی، نمایشی بصری از مدت زمان لازم برای رندر کردن فریم‌های یک پنجره UI نسبت به معیار 16.67 میلی‌ثانیه در هر فریم را نشان می‌دهد.

در پردازنده‌های گرافیکی کم‌توان، نرخ پر کردن موجود (سرعتی که GPU می‌تواند بافر فریم را پر کند) می‌تواند بسیار کم باشد. با افزایش تعداد پیکسل‌های مورد نیاز برای ترسیم یک فریم، پردازنده گرافیکی ممکن است برای پردازش دستورات جدید بیشتر طول بکشد و از بقیه سیستم بخواهد منتظر بمانند تا بتواند به نتیجه برسد. ابزار نمایه‌سازی به شما کمک می‌کند تشخیص دهید که چه زمانی پردازنده گرافیکی در تلاش برای ترسیم پیکسل‌ها غرق می‌شود یا با اضافه برداشت سنگین مواجه می‌شود.

نمایه ساز را فعال کنید

قبل از شروع، مطمئن شوید که از دستگاهی استفاده می‌کنید که Android نسخه 4.1 (سطح API 16) یا بالاتر دارد، و گزینه‌های برنامه‌نویس را فعال کرده‌اید . برای شروع نمایه سازی رندر GPU دستگاه در حین استفاده از برنامه، به صورت زیر عمل کنید:

  1. در دستگاه خود، به تنظیمات بروید و روی گزینه‌های برنامه‌نویس ضربه بزنید.
  2. در بخش مانیتورینگ ، بسته به نسخه اندرویدی که روی دستگاه اجرا می‌شود ، رندر نمایه GPU یا نمایه رندر HWUI را انتخاب کنید.
  3. در گفتگوی نمایش GPU نمایه، روی صفحه را به‌عنوان میله‌ها انتخاب کنید تا نمودارها روی صفحه دستگاهتان قرار بگیرند.
  4. برنامه ای را که می خواهید نمایه کنید باز کنید.

خروجی را بررسی کنید

در تصویر بزرگ‌شده نمودار نمایه GPU Rendering نشان داده شده در شکل 1، می‌توانید بخش رنگی را همانطور که در Android 6.0 (سطح API 23) نشان داده شده است، مشاهده کنید.

شکل 1. نمودار رندر GPU نمایه بزرگ شده.

در زیر چند نکته در مورد خروجی ذکر شده است:

  • برای هر برنامه قابل مشاهده، ابزار یک نمودار نمایش می دهد.
  • هر نوار عمودی در امتداد محور افقی نشان دهنده یک فریم است و ارتفاع هر میله عمودی نشان دهنده مدت زمانی است که فریم برای رندر گرفتن (بر حسب میلی ثانیه) صرف شده است.
  • خط سبز افقی نشان دهنده 16.67 میلی ثانیه است. برای دستیابی به 60 فریم در ثانیه، نوار عمودی برای هر فریم باید زیر این خط باقی بماند. هر بار که یک نوار از این خط فراتر رود، ممکن است در انیمیشن ها مکث ایجاد شود.
  • این ابزار، فریم‌هایی را که از آستانه 16.67 میلی‌ثانیه فراتر رفته‌اند، با پهن‌تر و شفاف‌تر کردن نوار مربوطه برجسته می‌کند.
  • هر نوار دارای اجزای رنگی است که به مرحله ای در خط لوله رندر نگاشت می شوند. تعداد اجزا بسته به سطح API دستگاه متفاوت است.

جدول زیر توضیحاتی در مورد هر بخش از یک نوار عمودی در خروجی نمایه ساز هنگام استفاده از دستگاه دارای Android نسخه 6.0 و بالاتر ارائه می دهد.

جزء نوار مرحله رندرینگ توضیحات
بافرها را تعویض کنید نشان دهنده زمانی است که CPU منتظر است تا GPU کار خود را به پایان برساند. اگر این نوار بلند شود، به این معنی است که برنامه کار زیادی روی GPU انجام می دهد.
موضوع فرمان نشان دهنده زمان صرف شده توسط رندر دوبعدی اندروید برای صدور دستورات به OpenGL برای ترسیم و ترسیم مجدد لیست های نمایشی است. ارتفاع این نوار به طور مستقیم با مجموع زمانی که هر لیست نمایشی برای اجرا طول می کشد، متناسب است - لیست های نمایش بیشتر برابر با یک نوار قرمز بلندتر است.
همگام سازی و آپلود نشان دهنده زمان لازم برای آپلود اطلاعات بیت مپ در GPU است. یک بخش بزرگ نشان می دهد که برنامه زمان زیادی را برای بارگذاری مقادیر زیادی از گرافیک صرف می کند.
قرعه کشی کنید نشان دهنده زمان استفاده شده برای ایجاد و به روز رسانی لیست های نمایشی نما است. اگر این قسمت از نوار بلند باشد، ممکن است تعداد زیادی طراحی نمای سفارشی یا کارهای زیادی در روش‌های onDraw وجود داشته باشد.
اندازه گیری / چیدمان نشان دهنده مدت زمان صرف شده برای تماس های onLayout و onMeasure در سلسله مراتب view است. یک بخش بزرگ نشان می دهد که سلسله مراتب نمایش زمان زیادی برای پردازش نیاز دارد.
مدیریت ورودی و انیمیشن نشان‌دهنده مدت زمانی است که برای ارزیابی همه انیماتورهایی که برای آن فریم اجرا شده‌اند و همه تماس‌های ورودی را بررسی می‌کنند. اگر این بخش بزرگ باشد، می تواند نشان دهنده این باشد که یک انیماتور سفارشی یا برگشت به تماس ورودی، زمان زیادی را صرف پردازش می کند. مشاهده اتصال در حین پیمایش، مانند RecyclerView.Adapter.onBindViewHolder() نیز معمولاً در طول این بخش رخ می دهد و منبع رایج تری برای کاهش سرعت در این بخش است.
زمان متفرقه / تاخیر VSync نشان دهنده زمانی است که برنامه برای اجرای عملیات در بین دو فریم متوالی صرف می کند. ممکن است نشانگر پردازش بیش از حدی باشد که در رشته UI اتفاق می افتد که می تواند در رشته دیگری بارگذاری شود.

جدول 1. نوارهای مؤلفه در Android نسخه 6.0 و بالاتر.

نسخه های اندروید بین 4.0 (سطح API 14) و 5.0 (سطح API 21) دارای بخش های آبی، بنفش، قرمز و نارنجی هستند. نسخه های اندروید زیر 4.0 فقط دارای اجزای آبی، قرمز و نارنجی هستند. جدول زیر نوارهای مؤلفه را در اندروید 4.0 و 5.0 نشان می دهد.

جزء نوار مرحله رندرینگ توضیحات
فرآیند نشان دهنده زمانی است که CPU منتظر است تا GPU کار خود را به پایان برساند. اگر این نوار بلند شود، به این معنی است که برنامه کار زیادی روی GPU انجام می دهد.
اجرا کنید نشان دهنده زمان صرف شده توسط رندر دوبعدی اندروید برای صدور دستورات به OpenGL برای ترسیم و ترسیم مجدد لیست های نمایشی است. ارتفاع این نوار به طور مستقیم با مجموع زمانی که هر لیست نمایشی برای اجرا طول می کشد، متناسب است - لیست های نمایش بیشتر برابر با یک نوار قرمز بلندتر است.
XFer نشان دهنده زمان بارگذاری اطلاعات بیت مپ در GPU است. یک بخش بزرگ نشان می دهد که برنامه زمان زیادی را برای بارگذاری مقادیر زیادی از گرافیک صرف می کند. این بخش در دستگاه‌های دارای Android نسخه 4.0 یا پایین‌تر قابل مشاهده نیست.
به روز رسانی نشان دهنده زمان استفاده شده برای ایجاد و به روز رسانی لیست های نمایشی نما است. اگر این قسمت از نوار بلند باشد، ممکن است تعداد زیادی طراحی نمای سفارشی یا کارهای زیادی در روش‌های onDraw وجود داشته باشد.

جدول 2. نوارهای مؤلفه در اندروید 4.0 و 5.0.

برای اطلاعات بیشتر در مورد نحوه تفسیر اطلاعات ارائه شده توسط ابزار پروفایل، تجزیه و تحلیل با نمایه GPU Rendering را بخوانید.

توجه: در حالی که این ابزار Profile GPU Rendering نام دارد، تمام فرآیندهای نظارت شده در واقع در CPU رخ می دهند. رندر با ارسال دستورات به GPU انجام می شود و GPU صفحه را به صورت ناهمزمان رندر می کند. در شرایط خاص، GPU ممکن است کار زیادی برای انجام داشته باشد و CPU شما باید قبل از ارسال دستورات جدید منتظر بماند. وقتی این اتفاق می‌افتد، میخ‌هایی را در نوارهای نارنجی و قرمز می‌بینید و ارسال فرمان مسدود می‌شود تا زمانی که فضای بیشتری در صف فرمان GPU ایجاد شود.

تجسم اضافه برداشت GPU

یکی دیگر از ویژگی‌های موجود در گزینه‌های توسعه‌دهنده به شما کمک می‌کند تا با کدگذاری رنگی رابط کاربری خود، اضافه برداشت را شناسایی کنید. Overdraw زمانی رخ می دهد که برنامه شما یک پیکسل را بیش از یک بار در یک قاب ترسیم کند. بنابراین این تجسم نشان می دهد که برنامه شما ممکن است بیشتر از آنچه لازم است کار رندرینگ انجام دهد، که به دلیل تلاش اضافی GPU برای رندر پیکسل هایی که برای کاربر قابل مشاهده نیستند، می تواند یک مشکل عملکرد باشد. بنابراین، باید در صورت امکان ، رویدادهای اضافه برداشت را برطرف کنید .

اگر قبلاً این کار را نکرده‌اید، گزینه‌های توسعه‌دهنده را فعال کنید . سپس، برای تجسم اضافه برداشت در دستگاه خود، به صورت زیر عمل کنید:

  1. در دستگاه خود، به تنظیمات بروید و روی گزینه‌های برنامه‌نویس ضربه بزنید.
  2. به بخش رندر تسریع شده سخت افزار بروید و Debug GPU Overdraw را انتخاب کنید.
  3. در گفتگوی Debug overdraw GPU ، Show overdraw areas را انتخاب کنید.

اندروید عناصر رابط کاربری را برای شناسایی میزان اضافه برداشت به صورت زیر رنگ می کند:

  • رنگ واقعی: بدون اضافه برداشت
  • آبی: 1 بار اضافه برداشت شده است
  • سبز: 2 بار اضافه برداشت شده است
  • صورتی: 3 بار اضافه برداشت شده است
  • قرمز: 4 بار یا بیشتر اضافه برداشت شده است

شکل 2. یک برنامه همانطور که به طور معمول ظاهر می شود (سمت چپ)، و همانطور که با فعال کردن GPU Overdraw (راست) ظاهر می شود.

توجه داشته باشید که این رنگ ها نیمه شفاف هستند، بنابراین رنگ دقیقی که روی صفحه می بینید به محتوای رابط کاربری شما بستگی دارد.

اکنون که می توانید تشخیص دهید که اضافه برداشت در چیدمان شما کجا رخ می دهد، نحوه کاهش اضافه برداشت را بخوانید.

به یاد داشته باشید که مقداری اضافه برداشت اجتناب ناپذیر است. همانطور که در حال تنظیم رابط کاربری برنامه خود هستید، سعی کنید به تصویرسازی برسید که عمدتاً رنگ های واقعی یا فقط 1 برابر اضافه برداشت (آبی) را نشان می دهد.

شکل 3. نمونه هایی از یک برنامه با اضافه برداشت زیاد (سمت چپ) و اضافه برداشت بسیار کمتر (راست)

،

Android شامل برخی از گزینه‌های توسعه‌دهنده روی دستگاه است که به شما کمک می‌کند تصور کنید برنامه‌تان در کجا ممکن است با مشکلات رندر UI خود مواجه شود، مانند انجام کارهای رندر بیشتر از حد لازم، یا اجرای عملیات‌های طولانی و GPU. این صفحه نحوه رفع اشکال اضافه برداشت GPU و رندر GPU نمایه را شرح می دهد.

برای کسب اطلاعات بیشتر درباره گزینه‌های برنامه‌نویس روی دستگاه، از جمله نحوه فعال کردن آنها، پیکربندی گزینه‌های برنامه‌نویس روی دستگاه را بخوانید.

سرعت رندر GPU نمایه

ابزار Profile GPU Rendering، به عنوان یک هیستوگرام پیمایشی، نمایشی بصری از مدت زمان لازم برای رندر کردن فریم‌های یک پنجره UI نسبت به معیار 16.67 میلی‌ثانیه در هر فریم را نشان می‌دهد.

در پردازنده‌های گرافیکی کم‌توان، نرخ پر کردن موجود (سرعتی که GPU می‌تواند بافر فریم را پر کند) می‌تواند بسیار کم باشد. با افزایش تعداد پیکسل‌های مورد نیاز برای ترسیم یک فریم، پردازنده گرافیکی ممکن است برای پردازش دستورات جدید بیشتر طول بکشد و از بقیه سیستم بخواهد منتظر بمانند تا بتواند به نتیجه برسد. ابزار نمایه‌سازی به شما کمک می‌کند تشخیص دهید که چه زمانی پردازنده گرافیکی در تلاش برای ترسیم پیکسل‌ها غرق می‌شود یا با اضافه برداشت سنگین مواجه می‌شود.

نمایه ساز را فعال کنید

قبل از شروع، مطمئن شوید که از دستگاهی استفاده می‌کنید که Android نسخه 4.1 (سطح API 16) یا بالاتر دارد، و گزینه‌های برنامه‌نویس را فعال کرده‌اید . برای شروع نمایه سازی رندر GPU دستگاه در حین استفاده از برنامه، به صورت زیر عمل کنید:

  1. در دستگاه خود، به تنظیمات بروید و روی گزینه‌های برنامه‌نویس ضربه بزنید.
  2. در بخش مانیتورینگ ، بسته به نسخه اندرویدی که روی دستگاه اجرا می‌شود ، رندر نمایه GPU یا نمایه رندر HWUI را انتخاب کنید.
  3. در گفتگوی نمایش GPU نمایه، روی صفحه را به‌عنوان میله‌ها انتخاب کنید تا نمودارها روی صفحه دستگاهتان قرار بگیرند.
  4. برنامه ای را که می خواهید نمایه کنید باز کنید.

خروجی را بررسی کنید

در تصویر بزرگ‌شده نمودار نمایه GPU Rendering نشان داده شده در شکل 1، می‌توانید بخش رنگی را همانطور که در Android 6.0 (سطح API 23) نشان داده شده است، مشاهده کنید.

شکل 1. نمودار رندر GPU نمایه بزرگ شده.

در زیر چند نکته در مورد خروجی ذکر شده است:

  • برای هر برنامه قابل مشاهده، ابزار یک نمودار نمایش می دهد.
  • هر نوار عمودی در امتداد محور افقی نشان دهنده یک فریم است و ارتفاع هر میله عمودی نشان دهنده مدت زمانی است که فریم برای رندر گرفتن (بر حسب میلی ثانیه) صرف شده است.
  • خط سبز افقی نشان دهنده 16.67 میلی ثانیه است. برای دستیابی به 60 فریم در ثانیه، نوار عمودی برای هر فریم باید زیر این خط باقی بماند. هر بار که یک نوار از این خط فراتر رود، ممکن است در انیمیشن ها مکث ایجاد شود.
  • این ابزار فریم هایی را که از آستانه 16.67 میلی ثانیه فراتر می روند، با پهن تر و شفاف تر کردن نوار مربوطه برجسته می کند.
  • هر نوار دارای اجزای رنگی است که به مرحله ای در خط لوله رندر نگاشت می شوند. تعداد اجزا بسته به سطح API دستگاه متفاوت است.

جدول زیر توضیحاتی در مورد هر بخش از یک نوار عمودی در خروجی نمایه ساز هنگام استفاده از دستگاه دارای Android نسخه 6.0 و بالاتر ارائه می دهد.

جزء نوار مرحله رندرینگ توضیحات
بافرها را تعویض کنید نشان دهنده زمانی است که CPU منتظر است تا GPU کار خود را به پایان برساند. اگر این نوار بلند شود، به این معنی است که برنامه کار زیادی روی GPU انجام می دهد.
موضوع فرمان نشان دهنده زمان صرف شده توسط رندر دوبعدی اندروید برای صدور دستورات به OpenGL برای ترسیم و ترسیم مجدد لیست های نمایشی است. ارتفاع این نوار به طور مستقیم با مجموع زمانی که هر لیست نمایشی برای اجرا طول می کشد، متناسب است - لیست های نمایش بیشتر برابر با یک نوار قرمز بلندتر است.
همگام سازی و آپلود نشان دهنده زمان لازم برای آپلود اطلاعات بیت مپ در GPU است. یک بخش بزرگ نشان می دهد که برنامه زمان زیادی را برای بارگذاری مقادیر زیادی از گرافیک صرف می کند.
قرعه کشی کنید نشان دهنده زمان استفاده شده برای ایجاد و به روز رسانی لیست های نمایشی نما است. اگر این قسمت از نوار بلند باشد، ممکن است تعداد زیادی طراحی نمای سفارشی یا کارهای زیادی در روش‌های onDraw وجود داشته باشد.
اندازه گیری / چیدمان نشان دهنده مدت زمان صرف شده برای تماس های onLayout و onMeasure در سلسله مراتب view است. یک بخش بزرگ نشان می دهد که سلسله مراتب نمایش زمان زیادی برای پردازش نیاز دارد.
مدیریت ورودی و انیمیشن نشان‌دهنده مدت زمانی است که برای ارزیابی همه انیماتورهایی که برای آن فریم اجرا شده‌اند و همه تماس‌های ورودی را بررسی می‌کنند. اگر این بخش بزرگ باشد، می تواند نشان دهنده این باشد که یک انیماتور سفارشی یا برگشت به تماس ورودی، زمان زیادی را صرف پردازش می کند. مشاهده اتصال در حین پیمایش، مانند RecyclerView.Adapter.onBindViewHolder() نیز معمولاً در طول این بخش رخ می دهد و منبع رایج تری برای کاهش سرعت در این بخش است.
زمان متفرقه / تاخیر VSync نشان دهنده زمانی است که برنامه برای اجرای عملیات در بین دو فریم متوالی صرف می کند. ممکن است نشانگر پردازش بیش از حدی باشد که در رشته UI اتفاق می افتد که می تواند در رشته دیگری بارگذاری شود.

جدول 1. نوارهای مؤلفه در Android نسخه 6.0 و بالاتر.

نسخه های اندروید بین 4.0 (سطح API 14) و 5.0 (سطح API 21) دارای بخش های آبی، بنفش، قرمز و نارنجی هستند. نسخه های اندروید زیر 4.0 فقط دارای اجزای آبی، قرمز و نارنجی هستند. جدول زیر نوارهای مؤلفه را در اندروید 4.0 و 5.0 نشان می دهد.

جزء نوار مرحله رندرینگ توضیحات
فرآیند نشان دهنده زمانی است که CPU منتظر است تا GPU کار خود را به پایان برساند. اگر این نوار بلند شود، به این معنی است که برنامه کار زیادی روی GPU انجام می دهد.
اجرا کنید نشان دهنده زمان صرف شده توسط رندر دوبعدی اندروید برای صدور دستورات به OpenGL برای ترسیم و ترسیم مجدد لیست های نمایشی است. ارتفاع این نوار به طور مستقیم با مجموع زمانی که هر لیست نمایشی برای اجرا طول می کشد، متناسب است - لیست های نمایش بیشتر برابر با یک نوار قرمز بلندتر است.
XFer نشان دهنده زمان بارگذاری اطلاعات بیت مپ در GPU است. یک بخش بزرگ نشان می دهد که برنامه زمان زیادی را برای بارگذاری مقادیر زیادی از گرافیک صرف می کند. این بخش در دستگاه‌های دارای Android نسخه 4.0 یا پایین‌تر قابل مشاهده نیست.
به روز رسانی نشان دهنده زمان استفاده شده برای ایجاد و به روز رسانی لیست های نمایشی نما است. اگر این قسمت از نوار بلند باشد، ممکن است تعداد زیادی طراحی نمای سفارشی یا کارهای زیادی در متدهای onDraw وجود داشته باشد.

جدول 2. نوارهای مؤلفه در اندروید 4.0 و 5.0.

برای اطلاعات بیشتر در مورد نحوه تفسیر اطلاعات ارائه شده توسط ابزار پروفایل، تجزیه و تحلیل با نمایه GPU Rendering را بخوانید.

توجه: در حالی که این ابزار Profile GPU Rendering نام دارد، تمام فرآیندهای نظارت شده در واقع در CPU رخ می دهند. رندر با ارسال دستورات به GPU انجام می شود و GPU صفحه را به صورت ناهمزمان رندر می کند. در شرایط خاص، GPU ممکن است کار زیادی برای انجام داشته باشد و CPU شما باید قبل از ارسال دستورات جدید منتظر بماند. وقتی این اتفاق می‌افتد، میخ‌هایی را در نوارهای نارنجی و قرمز می‌بینید و ارسال فرمان مسدود می‌شود تا زمانی که فضای بیشتری در صف فرمان GPU ایجاد شود.

تجسم اضافه برداشت GPU

یکی دیگر از ویژگی‌های موجود در گزینه‌های توسعه‌دهنده به شما کمک می‌کند تا با کدگذاری رنگی رابط کاربری خود، اضافه برداشت را شناسایی کنید. Overdraw زمانی رخ می دهد که برنامه شما یک پیکسل را بیش از یک بار در یک قاب ترسیم کند. بنابراین این تجسم نشان می دهد که برنامه شما ممکن است بیشتر از آنچه لازم است کار رندرینگ انجام دهد، که به دلیل تلاش اضافی GPU برای رندر پیکسل هایی که برای کاربر قابل مشاهده نیستند، می تواند یک مشکل عملکرد باشد. بنابراین، باید در صورت امکان ، رویدادهای اضافه برداشت را برطرف کنید .

اگر قبلاً این کار را نکرده‌اید، گزینه‌های توسعه‌دهنده را فعال کنید . سپس، برای تجسم اضافه برداشت در دستگاه خود، به صورت زیر عمل کنید:

  1. در دستگاه خود، به تنظیمات بروید و روی گزینه‌های برنامه‌نویس ضربه بزنید.
  2. به بخش رندر تسریع شده سخت افزار بروید و Debug GPU Overdraw را انتخاب کنید.
  3. در گفتگوی Debug overdraw GPU ، Show overdraw areas را انتخاب کنید.

اندروید عناصر رابط کاربری را برای شناسایی میزان اضافه برداشت به صورت زیر رنگ می کند:

  • رنگ واقعی: بدون اضافه برداشت
  • آبی: 1 بار اضافه برداشت شده است
  • سبز: 2 بار اضافه برداشت شده است
  • صورتی: 3 بار اضافه برداشت شده است
  • قرمز: 4 بار یا بیشتر اضافه برداشت شده است

شکل 2. یک برنامه همانطور که به طور معمول ظاهر می شود (سمت چپ)، و همانطور که با فعال کردن GPU Overdraw (راست) ظاهر می شود.

توجه داشته باشید که این رنگ ها نیمه شفاف هستند، بنابراین رنگ دقیقی که روی صفحه می بینید به محتوای رابط کاربری شما بستگی دارد.

اکنون که می توانید تشخیص دهید که اضافه برداشت در چیدمان شما کجا رخ می دهد، نحوه کاهش اضافه برداشت را بخوانید.

به یاد داشته باشید که مقداری اضافه برداشت اجتناب ناپذیر است. همانطور که در حال تنظیم رابط کاربری برنامه خود هستید، سعی کنید به تصویرسازی برسید که عمدتاً رنگ های واقعی یا فقط 1 برابر اضافه برداشت (آبی) را نشان می دهد.

شکل 3. نمونه هایی از یک برنامه با اضافه برداشت زیاد (سمت چپ) و اضافه برداشت بسیار کمتر (راست)

،

Android شامل برخی از گزینه‌های توسعه‌دهنده روی دستگاه است که به شما کمک می‌کند تصور کنید برنامه‌تان در کجا ممکن است با مشکلات رندر UI خود مواجه شود، مانند انجام کارهای رندر بیشتر از حد لازم، یا اجرای عملیات‌های طولانی و GPU. این صفحه نحوه رفع اشکال اضافه برداشت GPU و رندر GPU نمایه را شرح می دهد.

برای کسب اطلاعات بیشتر درباره گزینه‌های برنامه‌نویس روی دستگاه، از جمله نحوه فعال کردن آنها، پیکربندی گزینه‌های برنامه‌نویس روی دستگاه را بخوانید.

سرعت رندر GPU نمایه

ابزار Profile GPU Rendering، به عنوان یک هیستوگرام پیمایشی، نمایشی بصری از مدت زمان لازم برای رندر کردن فریم‌های یک پنجره UI نسبت به معیار 16.67 میلی‌ثانیه در هر فریم را نشان می‌دهد.

در پردازنده‌های گرافیکی کم‌توان، نرخ پر کردن موجود (سرعتی که GPU می‌تواند بافر فریم را پر کند) می‌تواند بسیار کم باشد. با افزایش تعداد پیکسل‌های مورد نیاز برای ترسیم یک فریم، پردازنده گرافیکی ممکن است برای پردازش دستورات جدید بیشتر طول بکشد و از بقیه سیستم بخواهد منتظر بمانند تا بتواند به نتیجه برسد. ابزار نمایه‌سازی به شما کمک می‌کند تشخیص دهید که چه زمانی پردازنده گرافیکی در تلاش برای ترسیم پیکسل‌ها غرق می‌شود یا با اضافه برداشت سنگین مواجه می‌شود.

نمایه ساز را فعال کنید

قبل از شروع، مطمئن شوید که از دستگاهی استفاده می‌کنید که Android نسخه 4.1 (سطح API 16) یا بالاتر دارد، و گزینه‌های برنامه‌نویس را فعال کرده‌اید . برای شروع نمایه سازی رندر GPU دستگاه در حین استفاده از برنامه، به صورت زیر عمل کنید:

  1. در دستگاه خود، به تنظیمات بروید و روی گزینه‌های برنامه‌نویس ضربه بزنید.
  2. در بخش مانیتورینگ ، بسته به نسخه اندرویدی که روی دستگاه اجرا می‌شود ، رندر نمایه GPU یا نمایه رندر HWUI را انتخاب کنید.
  3. در گفتگوی نمایش GPU نمایه، روی صفحه را به‌عنوان میله‌ها انتخاب کنید تا نمودارها روی صفحه دستگاهتان قرار بگیرند.
  4. برنامه ای را که می خواهید نمایه کنید باز کنید.

خروجی را بررسی کنید

در تصویر بزرگ‌شده نمودار نمایه GPU Rendering نشان داده شده در شکل 1، می‌توانید بخش رنگی را همانطور که در Android 6.0 (سطح API 23) نشان داده شده است، مشاهده کنید.

شکل 1. نمودار رندر GPU نمایه بزرگ شده.

در زیر چند نکته در مورد خروجی ذکر شده است:

  • برای هر برنامه قابل مشاهده، ابزار یک نمودار نمایش می دهد.
  • هر نوار عمودی در امتداد محور افقی نشان دهنده یک فریم است و ارتفاع هر میله عمودی نشان دهنده مدت زمانی است که فریم برای رندر گرفتن (بر حسب میلی ثانیه) صرف شده است.
  • خط سبز افقی نشان دهنده 16.67 میلی ثانیه است. برای دستیابی به 60 فریم در ثانیه، نوار عمودی برای هر فریم باید زیر این خط باقی بماند. هر بار که یک نوار از این خط فراتر رود، ممکن است در انیمیشن ها مکث ایجاد شود.
  • این ابزار، فریم‌هایی را که از آستانه 16.67 میلی‌ثانیه فراتر رفته‌اند، با پهن‌تر و شفاف‌تر کردن نوار مربوطه برجسته می‌کند.
  • هر نوار دارای اجزای رنگی است که به مرحله ای در خط لوله رندر نگاشت می شوند. تعداد اجزا بسته به سطح API دستگاه متفاوت است.

جدول زیر توضیحاتی در مورد هر بخش از یک نوار عمودی در خروجی نمایه ساز هنگام استفاده از دستگاه دارای Android نسخه 6.0 و بالاتر ارائه می دهد.

جزء نوار مرحله رندرینگ توضیحات
بافرها را تعویض کنید نشان دهنده زمانی است که CPU منتظر است تا GPU کار خود را به پایان برساند. اگر این نوار بلند شود، به این معنی است که برنامه کار زیادی روی GPU انجام می دهد.
موضوع فرمان نشان دهنده زمان صرف شده توسط رندر دوبعدی اندروید برای صدور دستورات به OpenGL برای ترسیم و ترسیم مجدد لیست های نمایشی است. ارتفاع این نوار به طور مستقیم با مجموع زمانی که هر لیست نمایشی برای اجرا طول می کشد، متناسب است - لیست های نمایش بیشتر برابر با یک نوار قرمز بلندتر است.
همگام سازی و آپلود نشان دهنده زمان لازم برای آپلود اطلاعات بیت مپ در GPU است. یک بخش بزرگ نشان می دهد که برنامه زمان زیادی را برای بارگذاری مقادیر زیادی از گرافیک صرف می کند.
قرعه کشی کنید نشان دهنده زمان استفاده شده برای ایجاد و به روز رسانی لیست های نمایشی نما است. اگر این قسمت از نوار بلند باشد، ممکن است تعداد زیادی طراحی نمای سفارشی یا کارهای زیادی در متدهای onDraw وجود داشته باشد.
اندازه گیری / چیدمان نشان دهنده مدت زمان صرف شده برای تماس های onLayout و onMeasure در سلسله مراتب view است. یک بخش بزرگ نشان می دهد که سلسله مراتب نمایش زمان زیادی برای پردازش نیاز دارد.
مدیریت ورودی و انیمیشن نشان‌دهنده مدت زمانی است که برای ارزیابی همه انیماتورهایی که برای آن فریم اجرا شده‌اند و همه تماس‌های ورودی را بررسی می‌کنند. اگر این بخش بزرگ باشد، می تواند نشان دهنده این باشد که یک انیماتور سفارشی یا برگشت به تماس ورودی، زمان زیادی را صرف پردازش می کند. مشاهده اتصال در حین پیمایش، مانند RecyclerView.Adapter.onBindViewHolder() نیز معمولاً در طول این بخش رخ می دهد و منبع رایج تری برای کاهش سرعت در این بخش است.
زمان متفرقه / تاخیر VSync نشان دهنده زمانی است که برنامه برای اجرای عملیات در بین دو فریم متوالی صرف می کند. ممکن است نشانگر پردازش بیش از حدی باشد که در رشته UI اتفاق می افتد که می تواند در رشته دیگری بارگذاری شود.

جدول 1. نوارهای مؤلفه در Android نسخه 6.0 و بالاتر.

نسخه های اندروید بین 4.0 (سطح API 14) و 5.0 (سطح API 21) دارای بخش های آبی، بنفش، قرمز و نارنجی هستند. نسخه های اندروید زیر 4.0 فقط دارای اجزای آبی، قرمز و نارنجی هستند. جدول زیر نوارهای مؤلفه را در اندروید 4.0 و 5.0 نشان می دهد.

جزء نوار مرحله رندرینگ توضیحات
فرآیند نشان دهنده زمانی است که CPU منتظر است تا GPU کار خود را به پایان برساند. اگر این نوار بلند شود، به این معنی است که برنامه کار زیادی روی GPU انجام می دهد.
اجرا کنید نشان دهنده زمان صرف شده توسط رندر دوبعدی اندروید برای صدور دستورات به OpenGL برای ترسیم و ترسیم مجدد لیست های نمایشی است. ارتفاع این نوار به طور مستقیم با مجموع زمانی که هر لیست نمایشی برای اجرا طول می کشد، متناسب است - لیست های نمایش بیشتر برابر با یک نوار قرمز بلندتر است.
XFer نشان دهنده زمان لازم برای آپلود اطلاعات بیت مپ در GPU است. یک بخش بزرگ نشان می دهد که برنامه زمان زیادی را برای بارگذاری مقادیر زیادی از گرافیک صرف می کند. این بخش در دستگاه‌های دارای Android نسخه 4.0 یا پایین‌تر قابل مشاهده نیست.
به روز رسانی نشان دهنده زمان استفاده شده برای ایجاد و به روز رسانی لیست های نمایشی نما است. اگر این قسمت از نوار بلند باشد، ممکن است تعداد زیادی طراحی نمای سفارشی یا کارهای زیادی در روش‌های onDraw وجود داشته باشد.

جدول 2. نوارهای مؤلفه در اندروید 4.0 و 5.0.

برای اطلاعات بیشتر در مورد نحوه تفسیر اطلاعات ارائه شده توسط ابزار پروفایل، تجزیه و تحلیل با نمایه GPU Rendering را بخوانید.

توجه: در حالی که این ابزار Profile GPU Rendering نام دارد، تمام فرآیندهای نظارت شده در واقع در CPU رخ می دهند. رندر با ارسال دستورات به GPU انجام می شود و GPU صفحه را به صورت ناهمزمان رندر می کند. در شرایط خاص، GPU ممکن است کار زیادی برای انجام داشته باشد و CPU شما باید قبل از ارسال دستورات جدید منتظر بماند. وقتی این اتفاق می‌افتد، میخ‌هایی را در نوارهای نارنجی و قرمز می‌بینید و ارسال فرمان مسدود می‌شود تا زمانی که فضای بیشتری در صف فرمان GPU ایجاد شود.

تجسم اضافه برداشت GPU

یکی دیگر از ویژگی‌های موجود در گزینه‌های توسعه‌دهنده به شما کمک می‌کند تا با کدگذاری رنگی رابط کاربری خود، اضافه برداشت را شناسایی کنید. Overdraw زمانی رخ می دهد که برنامه شما یک پیکسل را بیش از یک بار در یک قاب ترسیم کند. بنابراین این تجسم نشان می دهد که برنامه شما ممکن است بیشتر از آنچه لازم است کار رندرینگ انجام دهد، که به دلیل تلاش اضافی GPU برای رندر پیکسل هایی که برای کاربر قابل مشاهده نیستند، می تواند یک مشکل عملکرد باشد. بنابراین، باید در صورت امکان ، رویدادهای اضافه برداشت را برطرف کنید .

اگر قبلاً این کار را نکرده‌اید، گزینه‌های توسعه‌دهنده را فعال کنید . سپس، برای تجسم اضافه برداشت در دستگاه خود، به صورت زیر عمل کنید:

  1. در دستگاه خود، به تنظیمات بروید و روی گزینه‌های برنامه‌نویس ضربه بزنید.
  2. به بخش رندر تسریع شده سخت افزار بروید و Debug GPU Overdraw را انتخاب کنید.
  3. در گفتگوی Debug overdraw GPU ، Show overdraw areas را انتخاب کنید.

اندروید عناصر رابط کاربری را برای شناسایی میزان اضافه برداشت به صورت زیر رنگ می کند:

  • رنگ واقعی: بدون اضافه برداشت
  • آبی: 1 بار اضافه برداشت شده است
  • سبز: 2 بار اضافه برداشت شده است
  • صورتی: 3 بار اضافه برداشت شده است
  • قرمز: 4 بار یا بیشتر اضافه برداشت شده است

شکل 2. یک برنامه همانطور که به طور معمول ظاهر می شود (سمت چپ)، و همانطور که با فعال کردن GPU Overdraw (راست) ظاهر می شود.

توجه داشته باشید که این رنگ ها نیمه شفاف هستند، بنابراین رنگ دقیقی که روی صفحه می بینید به محتوای رابط کاربری شما بستگی دارد.

اکنون که می توانید تشخیص دهید که اضافه برداشت در چیدمان شما کجا رخ می دهد، نحوه کاهش اضافه برداشت را بخوانید.

به یاد داشته باشید که مقداری اضافه برداشت اجتناب ناپذیر است. همانطور که در حال تنظیم رابط کاربری برنامه خود هستید، سعی کنید به تصویرسازی برسید که عمدتاً رنگ های واقعی یا فقط 1 برابر اضافه برداشت (آبی) را نشان می دهد.

شکل 3. نمونه هایی از یک برنامه با اضافه برداشت زیاد (سمت چپ) و اضافه برداشت بسیار کمتر (راست)

،

Android شامل برخی از گزینه‌های توسعه‌دهنده روی دستگاه است که به شما کمک می‌کند تصور کنید برنامه‌تان در کجا ممکن است با مشکلات رندر UI خود مواجه شود، مانند انجام کارهای رندر بیشتر از حد لازم، یا اجرای عملیات‌های طولانی و GPU. این صفحه نحوه رفع اشکال اضافه برداشت GPU و رندر GPU نمایه را شرح می دهد.

برای کسب اطلاعات بیشتر درباره گزینه‌های برنامه‌نویس روی دستگاه، از جمله نحوه فعال کردن آنها، پیکربندی گزینه‌های برنامه‌نویس روی دستگاه را بخوانید.

سرعت رندر GPU نمایه

ابزار Profile GPU Rendering، به عنوان یک هیستوگرام پیمایشی، نمایشی بصری از مدت زمان لازم برای رندر کردن فریم‌های یک پنجره UI نسبت به معیار 16.67 میلی‌ثانیه در هر فریم را نشان می‌دهد.

در پردازنده‌های گرافیکی کم‌توان، نرخ پر کردن موجود (سرعتی که GPU می‌تواند بافر فریم را پر کند) می‌تواند بسیار کم باشد. با افزایش تعداد پیکسل‌های مورد نیاز برای ترسیم یک فریم، پردازنده گرافیکی ممکن است برای پردازش دستورات جدید بیشتر طول بکشد و از بقیه سیستم بخواهد منتظر بمانند تا بتواند به نتیجه برسد. ابزار نمایه‌سازی به شما کمک می‌کند تشخیص دهید که چه زمانی پردازنده گرافیکی در تلاش برای ترسیم پیکسل‌ها غرق می‌شود یا با اضافه برداشت سنگین مواجه می‌شود.

نمایه ساز را فعال کنید

قبل از شروع، مطمئن شوید که از دستگاهی استفاده می‌کنید که Android نسخه 4.1 (سطح API 16) یا بالاتر دارد و گزینه‌های برنامه‌نویس را فعال کرده‌اید . برای شروع نمایه سازی رندر GPU دستگاه در حین استفاده از برنامه، به صورت زیر عمل کنید:

  1. در دستگاه خود، به تنظیمات بروید و روی گزینه‌های برنامه‌نویس ضربه بزنید.
  2. در بخش مانیتورینگ ، بسته به نسخه اندرویدی که روی دستگاه اجرا می‌شود ، رندر نمایه GPU یا نمایه رندر HWUI را انتخاب کنید.
  3. در گفتگوی نمایش GPU نمایه، روی صفحه را به‌عنوان میله‌ها انتخاب کنید تا نمودارها روی صفحه دستگاهتان قرار بگیرند.
  4. برنامه ای را که می خواهید نمایه کنید باز کنید.

خروجی را بررسی کنید

در تصویر بزرگ‌شده نمودار نمایه GPU Rendering نشان داده شده در شکل 1، می‌توانید بخش رنگی را همانطور که در Android 6.0 (سطح API 23) نشان داده شده است، مشاهده کنید.

شکل 1. نمودار رندر GPU نمایه بزرگ شده.

در زیر چند نکته در مورد خروجی ذکر شده است:

  • برای هر برنامه قابل مشاهده، ابزار یک نمودار نمایش می دهد.
  • هر نوار عمودی در امتداد محور افقی نشان‌دهنده یک قاب است و ارتفاع هر نوار عمودی نشان‌دهنده مدت زمانی است که فریم برای رندر کردن صرف شده است (بر حسب میلی‌ثانیه).
  • خط سبز افقی نشان دهنده 16.67 میلی ثانیه است. برای دستیابی به 60 فریم در ثانیه، نوار عمودی برای هر فریم باید زیر این خط باقی بماند. هر بار که یک نوار از این خط فراتر رود، ممکن است در انیمیشن ها مکث ایجاد شود.
  • این ابزار، فریم‌هایی را که از آستانه 16.67 میلی‌ثانیه فراتر رفته‌اند، با پهن‌تر و شفاف‌تر کردن نوار مربوطه برجسته می‌کند.
  • هر نوار دارای اجزای رنگی است که به مرحله ای در خط لوله رندر نگاشت می شوند. تعداد اجزا بسته به سطح API دستگاه متفاوت است.

جدول زیر توضیحاتی در مورد هر بخش از یک نوار عمودی در خروجی نمایه ساز هنگام استفاده از دستگاه دارای Android نسخه 6.0 و بالاتر ارائه می دهد.

جزء نوار مرحله رندرینگ توضیحات
بافرها را تعویض کنید نشان دهنده زمانی است که CPU منتظر است تا GPU کار خود را به پایان برساند. اگر این نوار بلند شود، به این معنی است که برنامه کار زیادی روی GPU انجام می دهد.
موضوع فرمان نشان دهنده زمان صرف شده توسط رندر دو بعدی اندروید برای صدور دستورات به OpenGL برای ترسیم و ترسیم مجدد لیست های نمایشی است. ارتفاع این نوار به طور مستقیم با مجموع زمانی که هر لیست نمایشی برای اجرا طول می کشد، متناسب است - لیست های نمایش بیشتر برابر با یک نوار قرمز بلندتر است.
همگام سازی و آپلود نشان دهنده زمان لازم برای آپلود اطلاعات بیت مپ در GPU است. یک بخش بزرگ نشان می دهد که برنامه زمان زیادی را برای بارگذاری مقادیر زیادی از گرافیک صرف می کند.
قرعه کشی کنید نشان دهنده زمان استفاده شده برای ایجاد و به روز رسانی لیست های نمایشی نما است. اگر این قسمت از نوار بلند باشد، ممکن است تعداد زیادی طراحی نمای سفارشی یا کارهای زیادی در روش‌های onDraw وجود داشته باشد.
اندازه گیری / چیدمان نشان دهنده مدت زمان صرف شده برای تماس های onLayout و onMeasure در سلسله مراتب view است. یک بخش بزرگ نشان می دهد که سلسله مراتب نمایش زمان زیادی برای پردازش نیاز دارد.
مدیریت ورودی و انیمیشن نشان‌دهنده مدت زمانی است که برای ارزیابی همه انیماتورهایی که برای آن فریم اجرا شده‌اند و همه تماس‌های ورودی را بررسی می‌کنند. اگر این بخش بزرگ باشد، می تواند نشان دهنده این باشد که یک انیماتور سفارشی یا برگشت به تماس ورودی، زمان زیادی را صرف پردازش می کند. مشاهده اتصال در حین پیمایش، مانند RecyclerView.Adapter.onBindViewHolder() نیز معمولاً در طول این بخش رخ می دهد و منبع رایج تری برای کاهش سرعت در این بخش است.
زمان متفرقه / تاخیر VSync نشان دهنده زمانی است که برنامه برای اجرای عملیات در بین دو فریم متوالی صرف می کند. ممکن است نشانگر پردازش بیش از حدی باشد که در رشته UI اتفاق می افتد که می تواند در رشته دیگری بارگذاری شود.

جدول 1. نوارهای مؤلفه در Android نسخه 6.0 و بالاتر.

نسخه های اندروید بین 4.0 (سطح API 14) و 5.0 (سطح API 21) دارای بخش های آبی، بنفش، قرمز و نارنجی هستند. نسخه های اندروید زیر 4.0 فقط دارای اجزای آبی، قرمز و نارنجی هستند. جدول زیر نوارهای مؤلفه را در اندروید 4.0 و 5.0 نشان می دهد.

جزء نوار مرحله رندرینگ توضیحات
فرآیند نشان دهنده زمانی است که CPU منتظر است تا GPU کار خود را به پایان برساند. اگر این نوار بلند شود، به این معنی است که برنامه کار زیادی روی GPU انجام می دهد.
اجرا کنید نشان دهنده زمان صرف شده توسط رندر دوبعدی اندروید برای صدور دستورات به OpenGL برای ترسیم و ترسیم مجدد لیست های نمایشی است. ارتفاع این نوار به طور مستقیم با مجموع زمانی که هر لیست نمایشی برای اجرا طول می کشد، متناسب است - لیست های نمایش بیشتر برابر با یک نوار قرمز بلندتر است.
XFer نشان دهنده زمان بارگذاری اطلاعات بیت مپ در GPU است. یک بخش بزرگ نشان می دهد که برنامه زمان زیادی را برای بارگذاری مقادیر زیادی از گرافیک صرف می کند. این بخش در دستگاه‌های دارای Android نسخه 4.0 یا پایین‌تر قابل مشاهده نیست.
به روز رسانی نشان دهنده زمان استفاده شده برای ایجاد و به روز رسانی لیست های نمایشی نما است. اگر این قسمت از نوار بلند باشد، ممکن است تعداد زیادی طراحی نمای سفارشی یا کارهای زیادی در متدهای onDraw وجود داشته باشد.

جدول 2. نوارهای مؤلفه در اندروید 4.0 و 5.0.

برای اطلاعات بیشتر در مورد نحوه تفسیر اطلاعات ارائه شده توسط ابزار پروفایل، تجزیه و تحلیل با نمایه GPU Rendering را بخوانید.

توجه: در حالی که این ابزار Profile GPU Rendering نام دارد، تمام فرآیندهای نظارت شده در واقع در CPU رخ می دهند. رندر با ارسال دستورات به GPU انجام می شود و GPU صفحه را به صورت ناهمزمان رندر می کند. در شرایط خاص، GPU ممکن است کار زیادی برای انجام داشته باشد و CPU شما باید قبل از ارسال دستورات جدید منتظر بماند. وقتی این اتفاق می‌افتد، میخ‌هایی را در نوارهای نارنجی و قرمز می‌بینید و ارسال فرمان مسدود می‌شود تا زمانی که فضای بیشتری در صف فرمان GPU ایجاد شود.

تجسم اضافه برداشت GPU

یکی دیگر از ویژگی‌های موجود در گزینه‌های توسعه‌دهنده به شما کمک می‌کند تا با کدگذاری رنگی رابط کاربری خود، اضافه برداشت را شناسایی کنید. Overdraw زمانی رخ می دهد که برنامه شما یک پیکسل را بیش از یک بار در یک قاب ترسیم کند. بنابراین این تجسم نشان می دهد که برنامه شما ممکن است بیشتر از آنچه لازم است کار رندرینگ انجام دهد، که به دلیل تلاش اضافی GPU برای رندر پیکسل هایی که برای کاربر قابل مشاهده نیستند، می تواند یک مشکل عملکرد باشد. بنابراین، باید در صورت امکان ، رویدادهای اضافه برداشت را برطرف کنید .

اگر قبلاً این کار را نکرده‌اید، گزینه‌های توسعه‌دهنده را فعال کنید . سپس ، برای تجسم بیش از حد در دستگاه خود ، به شرح زیر ادامه دهید:

  1. در دستگاه خود به تنظیمات بروید و روی گزینه های توسعه دهنده ضربه بزنید.
  2. به بخش رندر شتاب سخت افزاری بروید و Debug GPU Overdraw را انتخاب کنید.
  3. در گفتگوی Overdraw GPU اشکال زدایی ، مناطق نمایش بیش از حد را انتخاب کنید.

Android Colors عناصر UI برای شناسایی میزان بیش از حد به شرح زیر:

  • رنگ واقعی: بدون بیش از حد
  • آبی: 1 بار بیش از حد کشیده شد
  • سبز: 2 بار بیش از حد کشیده شد
  • صورتی: 3 بار بیش از حد کشیده شد
  • قرمز: 4 بار یا بیشتر از

شکل 2. برنامه ای که به طور عادی (سمت چپ) ظاهر می شود ، و همانطور که با GPU Overdraw فعال شده (سمت راست) ظاهر می شود

توجه کنید که این رنگ ها نیمه شفاف هستند ، بنابراین رنگ دقیقی که در صفحه مشاهده می کنید به محتوای UI شما بستگی دارد.

اکنون که می توانید تشخیص دهید که بیش از حد در طرح شما رخ می دهد ، نحوه کاهش بیش از حد را بخوانید.

به یاد داشته باشید که برخی از بیش از حد اجتناب ناپذیر است. همانطور که در حال تنظیم رابط کاربری برنامه خود هستید ، سعی کنید به یک تجسم برسید که بیشتر رنگهای واقعی یا فقط 1 برابر بیش از حد (آبی) را نشان می دهد.

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