درک خط لوله رندر فلوتر: از ابزارک ها گرفته تا پیکسل ها

مقدمه
با تکیه بر پست قبلی من در مورد معماری Flutter (شما می توانید آن را در اینجا بخوانید) ، اکنون می توانیم به یک سؤال کلیدی بپردازیم: چگونه Flutter همه چیز را روی صفحه نمایش می دهد؟ پاسخ در رندر ، سیستمی است که کد Flutter را تبدیل می کند – عرض و ارائه دهنده های مرتبط با آنها – پیکسل های واقعی روی صفحه نمایش است. این فرآیند چند مرحله ای با درخت ویجت آغاز می شود ، جایی که هر ویجت با یک رندر ORPOCT مربوطه همراه است. این ارائه دهنده ها هر دو طرح (نحوه قرار گرفتن عناصر) و نقاشی (نحوه ظاهر شدن آنها را تعریف می کنند) تعریف می کنند. پس از تعیین طرح ، RenderObjects دستورالعمل ها را به موتور سر و صدا، که آنها را در مجموعه ای از دستورات سفارش داده شده به عنوان a جمع می کند لیست نمایشبشر با این حال ، موتور به تنهایی رندر را اداره نمی کند – با تنظیم خطوط لوله بهینه شده بهینه سازی شده برای پردازش لیست نمایشگر به طور کارآمد و اطمینان از عملکرد صاف ، GPU را از آن استفاده می کند.
تصویر 1: مراحل خط لوله رندر. منبع: https://docs.flutter.dev/resource/architectural-overview
بیایید عمیقاً هر مرحله از روند را درک کنیم.
مراحل
مرحله ورودی کاربر
همه چیز با تعامل کاربر با برنامه ، مانند ضربه زدن ، کشیدن یا تایپ کردن ، شروع می شود. این فعل و انفعالات شنوندگان رویداد را تحریک می کند ، که به نوبه خود وضعیت برنامه را اصلاح می کنند. هرگونه تغییر وضعیتی ناشی از ورودی کاربر می تواند منجر به به روزرسانی های UI شود و خط لوله رندر را شروع کند.
مرحله انیمیشن
اگر UI شامل انیمیشن ها باشد ، این مرحله انتقال یکپارچه و جلوه های پویا را تضمین می کند. سیستم انیمیشن Flutter به طور مداوم خواص انیمیشن – از جمله موقعیت ، کدورت و اندازه را بر اساس زمان به روز می کند. این عواملی مانند مدت زمان انیمیشن ، کاهش منحنی ها (به عنوان مثال ، خطی ، سهولت در خارج) و میزان فریم فعلی برای تحقق حرکت صاف و سیال را در نظر می گیرد.
مرحله ساخت
مرحله ساخت شامل تماس با ساخت () روش ، پس از آن چارچوب به طور مؤثر درخت ویجت حاصل را با قطعه قبلی مقایسه می کند و فقط قسمت های لازم را به روز می کند. این روش در دو مکان کلیدی – در Withesswidget و State تعریف شده است. با این حال ، قبل از کاوش در هر دو ، مهم است که ابتدا بفهمید که چه وضعیتی در فلاتر وجود دارد ، زیرا نقش مهمی در نحوه عملکرد () عملکرد () عملکرد و تفاوت های بین آنها دارد.
شیء دولت داده هایی را در اختیار دارد که در طی فرآیند ساخت می توانند به طور همزمان قابل دسترسی باشند و ممکن است در طول عمر ویجت تغییر کنند. در اصل ، وضعیت ویجت شامل مقادیر ذخیره شده در خصوصیات آن در زمان ایجاد است که می تواند در پاسخ به تعامل کاربر اصلاح شود. به عنوان مثال ، هنگامی که یک کاربر یک کادر انتخاب را برطرف می کند ، حالت آن را به روز می کند ، و باعث می شود که یک بازسازی از نظر بصری تغییر را منعکس کند.
در الف بی تاب و بیرونی، روش ساخت () رابط کاربری را صرفاً بر اساس پیکربندی فعلی ویجت تعریف می کند. Flutter Framework Build () را صدا می کند هنگامی که ویجت برای اولین بار در درخت ویجت قرار می گیرد یا وابستگی آن تغییر می کند، مانند زمانی که یک وراثت وراثت به تغییرات بستگی دارد. در طی این فرایند ، چارچوب تعویض زیر هواپیمای ویجت با استفاده از ساخت () ، یا به روزرسانی زیر درخت موجود یا بازآفرینی آن از ابتدا ، بسته به رفتار روش Canupdate (). به طور معمول ، پیاده سازی های بدون تابعیت ، ترکیبی از ابزارک ها را با استفاده از سازنده ویجت و BuildContext ارائه شده باز می گردانند.
برای بهینه سازی عملکرد و به حداقل رساندن بازسازی های غیر ضروری ، این بهترین شیوه ها را دنبال کنید:
- ایجاد ویجت را کاهش دهید در ساخت () با جلوگیری از لانه سازی بیش از حد ردیف ، ستون ، بالشتک و جعبه اندازه به منظور قرار دادن کودک به روشی فانتزی. درعوض ، از گزینه های دیگری مانند Align یا CustomSlechildLayout استفاده کنید. به طور مشابه ، چندین لایه کانتینر تو در تو را با یک CustomPaint واحد در صورت امکان جایگزین کنید.
- از ابزارک های const استفاده کنید: در صورت امکان ویجت ها را به عنوان const اعلام کنید و سازندگان const را برای ابزارک های سفارشی تهیه کنید. این امر به Flutter اجازه می دهد تا از ویجت ها استفاده مجدد کرده و رندر را بهینه کند.
- ابزارک های مورد علاقه بیش از توابع یاور: هنگام ساختن اجزای UI قابل استفاده مجدد ، آنها را به عنوان ابزارک و نه توابع تعریف کنید. ابزارک ها بهینه سازی بازسازی بهتری را ارائه می دهند و آنها را با جلوگیری از بازسازی های غیر ضروری ، عملکرد خود را بیشتر می کند.
در حالت روش ساخت کلاس () رابط کاربری ویجت را توصیف می کند و در نقاط مختلف چرخه عمر ویجت نامیده می شود. اینها شامل پس از INITSTATE ، DIDUPDATEWIDGET ، SETSTATE ، هنگامی که یک وابستگی تغییر می کند ، یا هنگامی که ویجت غیرفعال می شود و بعداً دوباره به درخت منتقل می شود. روش BUILD () ترکیب جدیدی از ابزارک ها را که با استفاده از سازنده ویجت ، BuildContext داده شده و وضعیت داخلی که توسط شیء دولت نگهداری می شود ، باز می گرداند.
مرحله چیدمان
با استفاده از درخت ویجت ساخته شده (یا به روز شده) ، Flutter به مرحله چیدمان حرکت می کند ، جایی که اندازه و موقعیت هر ویجت را تعیین می کند.
Flutter دنبال می کند سیستم طرح بندی مبتنی بر محدودیت، عبور از درخت رندر به روشی عمق اول. در طی این فرایند ، ویجت های والدین محدودیت هایی (مانند حداقل و حداکثر عرض/قد) را به فرزندان خود منتقل می کنند. در پاسخ ، هر کودک اندازه خود را در آن محدودیت ها محاسبه می کند و آن را به والدین خود می فرستد.
این مرحله همچنین زمانی است که ابزارک های خاص طرح مانند ردیف ، ستون و پشته فرزندان خود را بر این اساس قرار می دهند. تا پایان این مجرد Tree Traversal ، هر شیء در محدودیت های والدین خود اندازه مشخصی دارد و با استفاده از روش PAINT () برای مرحله بعدی آماده است.
مرحله رنگ
با اندازه و موقعیت هر ویجت شناخته شده ، مرحله رنگ به دست می آید. از هر روش رنگ () رنگ RenderObject استفاده می شود و ظاهر بصری ویجت ها را تعریف می کند. رنگ () یک نقاشی نقاشی و یک افست را می گیرد ، که در آن اولین روش هایی را برای ترسیم فراهم می کند در حالی که دومی تعیین می کند که شیء باید روی صفحه قرار گیرد. در طی این مرحله ، RenderObjects دستورالعمل های نقاشی را ایجاد می کند که به موتور Flutter ارسال می شود. موتور سپس این دستورالعمل ها را در a جمع می کند لیست نمایش، که برای ارائه استفاده می شود.
مرحله آهنگسازی
در این مرحله ، Flutter ویجت نقاشی شده را به لایه هایی ترتیب می دهد ، جایی که قسمت های مختلف UI روی لایه های جداگانه ترسیم می شود. این برای عملکرد ضروری است ، به خصوص هنگام برخورد با انیمیشن های پیچیده یا عناصر همپوشانی. با ترکیب این لایه ها به طور کارآمد ، Flutter می تواند فرآیند ارائه را بهینه کند و از بازگرداندن کل صفحه برای هر تغییر کوچک جلوگیری کند. به عنوان مثال ، اگر شما یک انیمیشن دارید که ویجت را بر روی یک پس زمینه استاتیک حرکت می دهد ، فقط لایه ای که حاوی ویجت متحرک است ، باید دوباره تغییر یابد.
مرحله شطرنجی
در این مرحله آخر ، لایه های ترکیبی به پیکسل تبدیل می شوند که می توانند روی صفحه نمایش داده شوند. این فرآیند توسط GPU که اطلاعات ارائه شده لایه بندی شده را به دست می آورد ، سخت افزاری است و آن را به تصویر نهایی که در دستگاه خود مشاهده می کنید تبدیل می کند.
پایان
خط لوله رندر Flutter یک فرآیند پیشرفته ، چند مرحله ای و بسیار بهینه شده است که کد را به تجربیات بصری که کاربران با آنها تعامل دارند تبدیل می کند. هر مرحله نقش مهمی ایفا می کند. با درک این خط لوله ، توسعه دهندگان می توانند برنامه های کارآمدتر را بنویسند ، استفاده از ویجت را بهینه کنند ، بازسازی ها را به حداقل برسانند و از قابلیت های چارچوب برای ایجاد تجربیات کاربر صاف و جذاب استفاده کنند. این فرایند پیچیده ، که در پشت صحنه کار می کند ، همان چیزی است که باعث می شود تا تصاویر متقاطع و پلاتف فرم خود را ارائه دهد.
منابع