این صفحه توضیح میدهد که overdraw چیست، چگونه آن را تشخیص دهیم و راههای حذف یا کاهش آن را بیان میکند.
وقتی یک برنامه بیش از یک بار در یک فریم، یک پیکسل مشابه را ترسیم میکند، به این کار overdraw میگویند. Overdraw معمولاً غیرضروری است و بهتر است آن را حذف کنید. Overdraw زمانی به یک مشکل عملکردی تبدیل میشود که زمان پردازنده گرافیکی (GPU) را برای رندر کردن پیکسلهایی که به آنچه کاربر روی صفحه میبیند، کمکی نمیکنند، هدر میدهد.
درباره برداشت بیش از حد
Overdraw به سیستمی اشاره دارد که یک پیکسل را چندین بار در یک فریم رندر روی صفحه نمایش رسم میکند. به عنوان مثال، اگر مجموعهای از کارتهای رابط کاربری داشته باشید، هر کارت بخشی از کارت زیرین خود را پنهان میکند. با این حال، سیستم هنوز باید بخشهای پنهان کارتهای موجود در پشته را رسم کند. دلیل این امر این است که کارتهای انباشته شده طبق الگوریتم نقاش - یعنی به ترتیب از عقب به جلو - رندر میشوند. این توالی رندر به سیستم اجازه میدهد تا ترکیب آلفای مناسبی را روی اشیاء شفاف مانند سایهها اعمال کند.
مشکلات برداشت بیش از حد را پیدا کنید
این پلتفرم ابزارهای زیر را برای کمک به شما در تعیین اینکه آیا overdraw بر عملکرد برنامه شما تأثیر میگذارد یا خیر، ارائه میدهد.
ابزار اشکالزدایی Overdraw پردازنده گرافیکی
ابزار Debug GPU Overdraw از کدگذاری رنگی برای نشان دادن تعداد دفعاتی که برنامه شما هر پیکسل را روی صفحه ترسیم میکند، استفاده میکند. هرچه این تعداد بیشتر باشد، احتمال اینکه overdraw روی عملکرد برنامه شما تأثیر بگذارد، بیشتر است.
برای اطلاعات بیشتر، به تجسم بارگذاری بیش از حد GPU مراجعه کنید.
ابزار رندرینگ پروفایل GPU
ابزار رندرینگ پروفایل GPU، مدت زمانی را که هر مرحله از فرآیند رندرینگ برای نمایش یک فریم واحد طول میکشد، به صورت یک هیستوگرام پیمایشی نمایش میدهد. بخش فرآیند هر نوار، که با رنگ نارنجی نشان داده شده است، نشان میدهد که سیستم چه زمانی در حال تعویض بافرها است. این معیار، سرنخهای مهمی در مورد overdraw ارائه میدهد.
در پردازندههای گرافیکی با عملکرد ضعیفتر، نرخ پر شدن موجود - سرعتی که پردازنده گرافیکی میتواند بافر فریم را پر کند - میتواند پایین باشد. با افزایش تعداد پیکسلهای مورد نیاز برای ترسیم یک فریم، پردازنده گرافیکی ممکن است زمان بیشتری برای پردازش دستورات جدید صرف کند و از بقیه سیستم بخواهد تا منتظر بماند تا بتواند به آن برسد. نوار پردازش این افزایش ناگهانی را نشان میدهد زیرا پردازنده گرافیکی در تلاش برای ترسیم پیکسلها در سریعترین زمان ممکن، دچار مشکل میشود. مسائلی غیر از تعداد خام پیکسلها نیز ممکن است باعث افزایش ناگهانی این معیار شوند. به عنوان مثال، اگر ابزار Debug GPU Overdraw افزایش شدید overdraw و Process را نشان دهد، احتمالاً مشکلی در overdraw وجود دارد.
برای اطلاعات بیشتر، به سرعت رندرینگ پروفایل GPU مراجعه کنید.
رفع مشکل اضافه برداشت
برای کاهش یا حذف اضافه برداشت میتوانید موارد زیر را انجام دهید:
- پسزمینههای غیرضروری را در طرحبندیها حذف کنید.
- شفافیت را کاهش دهید.
این بخش اطلاعاتی در مورد هر دوی این رویکردها ارائه میدهد.
حذف پسزمینههای غیرضروری در طرحبندیها
به طور پیشفرض، یک طرحبندی پسزمینه ندارد، به این معنی که هیچ چیزی را مستقیماً به خودی خود رندر نمیکند. با این حال، وقتی طرحبندیها پسزمینه دارند، ممکن است به overdraw کمک کنند.
شما میتوانید با حذف پسزمینههای غیرضروری، مانند پسزمینهای که به دلیل پوشش کامل توسط هر چیزی که برنامه روی آن ترسیم میکند، قابل مشاهده نیست، عملکرد رندر را بهبود بخشید. به عنوان مثال، یک Box فرزند یا یک طرحبندی با اصلاحکننده .background ممکن است پسزمینه یک کانتینر والد را به طور کامل بپوشاند و باعث شود که مسیر ترسیم والد کاملاً برای کاربر نامرئی باشد، اما همچنان توسط GPU به طور کامل پردازش شود.
برای اینکه بفهمید چرا بیش از حد ترسیم میکنید، به درخت اجزا در ابزار Layout Inspector نگاه کنید. میتوانید پسزمینههایی را که برای کاربر قابل مشاهده نیستند، جستجو کنید و آنها را حذف کنید. همچنین میتوانید پسزمینههای غیرضروری را در هر جایی که چندین کانتینر با رنگ پسزمینه مشترک وجود دارد، حذف کنید. پسزمینه پنجره را روی رنگ پسزمینه اصلی برنامه خود تنظیم کنید و تمام کانتینرهای بالای آن را بدون هیچ مقدار پسزمینهای تعریف شده رها کنید.
کاهش شفافیت
رندر کردن پیکسلهای شفاف روی صفحه نمایش، که به عنوان رندر آلفا شناخته میشود، یکی از عوامل کلیدی در overdraw است. برخلاف overdraw استاندارد - که در آن سیستم پیکسلهای رسم شده موجود را با رسم پیکسلهای مات روی آنها کاملاً پنهان میکند - اشیاء شفاف نیاز دارند که ابتدا پیکسلهای موجود رسم شوند تا معادله ترکیب صحیح رخ دهد.
جلوههای بصری مانند انیمیشنهای شفاف، محوشدگیها و سایهها شامل مقداری شفافیت هستند و بنابراین میتوانند به طور قابل توجهی در overdraw نقش داشته باشند. شما میتوانید در این مواقع با کاهش تعداد اشیاء شفافی که رندر میکنید، overdraw را بهبود بخشید. به عنوان مثال، میتوانید با رسم متن سیاه در یک Text composable و اعمال مقدار آلفای شفاف با استفاده از modifier = Modifier.alpha(0.5f) متن خاکستری به دست آورید. با این حال، میتوانید با تنظیم مستقیم رنگ متن composable به خاکستری مات، همان اثر را با عملکرد بهتر به دست آورید: color = Color.Black.copy(alpha = 0.5f) .
برای کسب اطلاعات بیشتر در مورد هزینههای عملکردی که شفافیت در کل خط لوله ترسیم اعمال میکند، هزینههای پنهان شفافیت را تماشا کنید.