RenderingNG

آماده برای نسل بعدی محتوای وب

کریس هارلسون
Chris Harrelson

RenderingNG یک معماری رندر نسل بعدی است که عملکرد بسیار بهتری نسبت به قبل دارد. RenderingNG بیش از هشت سال ساخته شد و نشان دهنده کار جمعی بسیاری از توسعه دهندگان اختصاصی Chromium است. این پتانسیل عظیمی را برای محتوای وب سریع، روان، قابل اعتماد، پاسخگو و تعاملی باز می کند.

طرحی از عناصر مختلف RenderingNG
RenderingNG

در اینجا، خواهید آموخت که ما چه چیزی ساخته ایم، چرا آن را ساخته ایم و چگونه کار می کند.

گل ستاره شمال

هدف ستاره شمالی انگیزش RenderingNG این است که پیاده‌سازی موتور مرورگر، و غنی بودن APIهای رندر آن، نباید یک عامل محدودکننده UX در وب باشد.

شما نباید نگران اشکالات مرورگر باشید که ویژگی‌ها را غیرقابل اعتماد می‌کند یا رندر سایت شما را خراب می‌کند.

نباید هیچ صخره ای مرموز عملکرد وجود داشته باشد. و، لازم نیست در مورد ویژگی های داخلی از دست رفته کار کنید.

فقط باید کار کند.

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

  • دارای ویژگی‌های هسته‌ای محکم در پلتفرم‌ها، دستگاه‌ها و ترکیب‌های سیستم عامل مختلف.
  • عملکرد قابل پیش بینی و قابل اعتمادی دارد.
  • استفاده از قابلیت های سخت افزاری (هسته ها، GPU، وضوح صفحه نمایش، نرخ تازه سازی، API های شطرنجی سطح پایین) را به حداکثر می رساند.
  • فقط کارهایی را انجام می دهد که برای نمایش محتوای قابل مشاهده لازم است.
  • دارای پشتیبانی داخلی برای طراحی بصری متداول، انیمیشن و الگوهای طراحی تعامل.
  • API های توسعه دهنده را برای مدیریت آسان هزینه های رندر ارائه می دهد.
  • نقاط توسعه خط لوله را برای افزونه های توسعه دهنده ارائه می دهد.
  • تمام محتواها - HTML، CSS، بوم 2 بعدی، بوم سه بعدی، تصاویر، ویدئو و فونت ها را بهینه می کند.

مقایسه با سایر موتورهای رندر مرورگر

Gecko و Webkit نیز اکثر ویژگی‌های معماری مشابه توصیف شده در این پست‌های وبلاگ را پیاده‌سازی کرده‌اند، و حتی در برخی موارد آنها را قبل از Chromium اضافه کرده‌اند.

هر مرورگری که سریعتر و قابل اعتمادتر می شود دلیلی برای جشن گرفتن است و تأثیر واقعی دارد. هدف نهایی پیشبرد خط پایه برای همه مرورگرها است تا توسعه دهندگان بتوانند به آن تکیه کنند.

هرم موفقیت

فلسفه من این است که موفقیت در ابتدا نتیجه دستیابی به قابلیت اطمینان، سپس عملکرد مقیاس پذیر و در نهایت توسعه پذیری است.

هرم با برچسب قابلیت اطمینان در پایه، عملکرد در وسط، توسعه پذیری در بالا

مانند یک هرم واقعی، هر سطح پایه ای الزاماً محکم برای سطح بالا فراهم می کند.

قابلیت اطمینان

طرحی که نشان می‌دهد چگونه می‌توان با RenderingNG ویژگی‌ها را بدون افزایش زیادی در ناامیدی اضافه کرد

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

طرح ماهیت دایره ای اضافه کردن ویژگی ها، دریافت بازخورد، بهبود قابلیت اطمینان را نشان می دهد

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

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

نمودار طرحی قابلیت اطمینان، عملکرد و توسعه پذیری را نشان می دهد که در طول زمان بهبود می یابد

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

تست و معیارها

در طول 8 سال گذشته، ما ده ها هزار واحد، عملکرد و تست یکپارچه را اضافه کرده ایم. علاوه بر این، ما معیارهای جامعی را توسعه داده‌ایم که بسیاری از جنبه‌های رفتار رندر Chromium را در آزمایش‌های محلی، در معیارهای عملکرد، و در طبیعت در سایت‌های واقعی، با کاربران و دستگاه‌های واقعی اندازه‌گیری می‌کند.

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

تست های پلتفرم وب یک تلاش مشترک است. به عنوان مثال، مهندسان کروم تنها حدود 10 درصد از کل تست‌های WPT را برای ویژگی‌های CSS اضافه کرده‌اند. سایر فروشندگان مرورگر، مشارکت کنندگان مستقل و نویسندگان مشخصات، بقیه را مشارکت می دهند. برای بالا بردن وب قابل همکاری یک دهکده لازم است!

گذراندن تست ها در موتورهای مختلف
از wpt.fyi/compat2021 ، اندازه‌گیری نرخ عبور WPT برای ویژگی‌های اصلی

الگوهای خوب طراحی نرم افزار

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

عملکرد مقیاس پذیر

دستیابی به عملکرد عالی - در ابعاد سرعت، حافظه و مصرف انرژی - مهمترین جنبه بعدی RenderingNG است. ما می خواهیم تعامل با همه وب سایت ها صاف و پاسخگو باشد، اما ثبات دستگاه را قربانی نکنیم.

اما ما فقط عملکرد نمی‌خواهیم، ​​بلکه عملکرد مقیاس‌پذیر می‌خواهیم – معماری که در ماشین‌های رده پایین و سطح بالا و در سرتاسر پلتفرم‌های سیستم‌عامل به‌طور قابل‌اطمینانی عملکرد خوبی دارد. من این را بزرگ‌سازی می‌نامم - بهره‌گیری از تمام چیزهایی که دستگاه سخت‌افزاری می‌تواند به دست آورد، و کاهش مقیاس - به حداکثر رساندن کارایی و کاهش تقاضا در سیستم در صورت نیاز.

برای رسیدن به آنجا، ما باید حداکثر استفاده را از حافظه پنهان، ایزوله سازی عملکرد و شتاب سخت افزاری GPU داشته باشیم. بیایید هر کدام را به نوبه خود در نظر بگیریم. و برای مشخص کردن آن، بیایید به این فکر کنیم که چگونه هر یک از آنها در عملکرد یک تعامل بسیار مهم در صفحات وب نقش دارند: پیمایش.

ذخیره سازی

در یک پلتفرم رابط کاربری پویا و تعاملی مانند وب، حافظه پنهان تنها راه مهم برای بهبود چشمگیر عملکرد است. شناخته شده ترین نوع کش در مرورگر، کش HTTP است، اما رندر کش های زیادی نیز دارد. مهم‌ترین حافظه پنهان برای اسکرول، بافت‌های GPU ذخیره‌شده و لیست‌های نمایشی است که به اسکرول اجازه می‌دهد در عین اینکه تخلیه باتری را به حداقل می‌رساند و در دستگاه‌های مختلف به خوبی کار می‌کند، بسیار سریع باشد.

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

جداسازی عملکرد

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

در وب، بهترین مثال از جداسازی عملکرد، پیمایش است. حتی در وب‌سایت‌هایی که جاوا اسکریپت آهسته زیادی دارند، پیمایش می‌تواند بسیار روان باشد، زیرا روی رشته‌ای متفاوت اجرا می‌شود که نیازی به جاوا اسکریپت و موضوع طرح‌بندی ندارد. ما تلاش زیادی را برای RenderingNG انجام دادیم تا مطمئن شویم که هر اسکرول ممکن از طریق کش که فراتر از یک لیست نمایشی است و موقعیت‌های پیچیده‌تر را فراتر می‌رود، رشته می‌شود. مثال‌ها شامل کدی برای نمایش عناصر با موقعیت ثابت و چسبنده، شنونده‌های رویداد غیرفعال، و رندر متن با کیفیت بالا است.

Sketch نشان می دهد که با RenderingNG عملکرد حتی زمانی که جاوا اسکریپت بسیار کند است ثابت می ماند.

شتاب پردازنده گرافیکی

یک GPU باعث می‌شود که پیکسل‌ها و کشیدن روی صفحه به طور چشمگیری سریع‌تر شوند—در بسیاری از موارد، هر پیکسل را می‌توان به موازات هر پیکسل دیگر ترسیم کرد و در نتیجه سرعت فوق‌العاده‌ای افزایش می‌یابد. یکی از اجزای اصلی RenderingNG شطرنجی GPU است و همه جا ترسیم می شود. این کار از GPU در همه پلتفرم‌ها و همه دستگاه‌ها برای سرعت بخشیدن به رندر و متحرک کردن محتوای وب استفاده می‌کند. این امر به ویژه در دستگاه های رده پایین یا دستگاه های بسیار پیشرفته که اغلب دارای پردازنده گرافیکی بسیار قوی تری نسبت به سایر قسمت های دستگاه هستند، بسیار مهم است.

Sketch نشان می دهد که با RenderingNG عملکرد آنقدر کاهش نمی یابد.

توسعه پذیری: ابزار مناسب برای کار

هنگامی که قابلیت اطمینان و عملکرد مقیاس‌پذیر را داشته باشیم، اکنون آماده هستیم تا مجموعه‌ای از ابزارها را برای کمک به توسعه‌دهندگان بسازیم که بخش‌های داخلی HTML، CSS و Canvas را گسترش دهند، و به روش‌هایی که هیچ یک از آن‌ها را قربانی نمی‌کند. عملکرد و قابلیت اطمینان

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

APIهای وب باز زیر که توسط Chromium حمایت می‌شوند، توسط RenderingNG امکان‌پذیر شده‌اند و قبلاً غیرقابل اجرا در نظر گرفته می‌شدند.

همه آنها با مشخصات باز و همکاری با شرکای وب باز - مهندسان سایر مرورگرها، کارشناسان و توسعه دهندگان وب - توسعه یافته اند. در پست‌های بعدی وبلاگ، به بررسی هر یک از این موارد خواهیم پرداخت و توضیح خواهیم داد که چگونه RenderingNG آنها را ممکن می‌سازد.

  • مشاهده محتوا : به سایت‌ها اجازه می‌دهد تا به راحتی از رندر کردن کار برای محتوای خارج از صفحه و رندر کش برای نمایش‌های برنامه تک صفحه‌ای که در حال حاضر نشان داده نشده‌اند، اجتناب کنند.
  • OffscreenCanvas : به رندر بوم (هر دو بوم API دوبعدی و WebGL) اجازه می دهد تا برای عملکرد عالی قابل اطمینان، روی رشته خود اجرا شود. این پروژه همچنین نقطه عطف مهم دیگری برای وب است - این اولین API وب است که به جاوا اسکریپت (یا WebAssembly!) اجازه می دهد یک سند صفحه وب را از چندین رشته ارائه دهد.
  • پرس‌وجوهای کانتینر : به یک مؤلفه اجازه می‌دهد تا خود را به‌صورت پاسخ‌گویانه قرار دهد، و انسداد یک جهان کامل از مؤلفه‌های plug-and-play (در حال حاضر یک پیاده‌سازی آزمایشی) را رفع کند.
  • جداسازی مبدا : به سایت‌ها اجازه می‌دهد تا انزوای عملکرد بیشتری را بین iframe انتخاب کنند.
  • Worklets رنگ خارج از موضوع اصلی: راهی را به توسعه دهندگان می دهد تا نحوه رنگ آمیزی عناصر را با کدی که روی رشته کامپوزیتور اجرا می شود، گسترش دهند.

علاوه بر APIهای وب صریح، RenderingNG به ما این امکان را داد که چندین «ویژگی خودکار» بسیار مهم را ارسال کنیم که برای همه سایت‌ها مفید است:

  • Site Isolation : iframe های متقاطع را در فرآیندهای CPU مختلف قرار می دهد تا امنیت و عملکرد بهتری را ایزوله کند.
  • Vulkan ، D3D12 و Metal : از APIهای سطح پایین‌تری بهره می‌برد که از GPU کارآمدتر از OpenGL استفاده می‌کنند.
  • انیمیشن های ترکیبی بیشتر: SVG ، رنگ پس زمینه.

ویژگی‌های بعدی که توسط RenderingNG رفع انسداد شده‌اند و ما در مورد آن هیجان‌زده هستیم عبارتند از:

پروژه های کلیدی که RenderingNG را تشکیل می دهند

در اینجا لیستی از پروژه های کلیدی در RenderingNG آمده است.

CompositeAfterPaint

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

سال پیش رفتن
2015 لیست های نمایش کشتی
2017 ارسال باطل جدید.
2018 درختان دارایی کشتی قسمت 1.
2019 درختان دارایی کشتی قسمت 2.
2021 ارسال پروژه به پایان رسید.

LayoutNG

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

درباره LayoutNG بیشتر بخوانید.

سال پیش رفتن
2019 جریان بلوک کشتی
2020 شیپ فلکس، ویرایش.
2021 هر چیز دیگری را ارسال کنید.

BlinkNG

ما موتور رندر Blink را مجدداً در فازهای خط لوله جداسازی کرده و تمیز کرده ایم. این امکان ذخیره سازی بهتر، قابلیت اطمینان بالاتر، و ویژگی های ورود مجدد یا تأخیر در رندر مانند نمایش محتوا و جستجوهای کانتینر را فراهم می کند.

شتاب GPU در همه جا

شتاب پردازنده گرافیکی سرعت بسیار زیادی را برای بیشتر محتوا فراهم می کند، زیرا هر پیکسل را می توان به صورت موازی پردازش کرد. همچنین یک روش موثر برای بهبود عملکرد در دستگاه‌های رده پایینی است که تمایل به داشتن پردازنده گرافیکی دارند.

سال پیش رفتن
2014 پشتیبانی از بوم. محتوای انتخابی در Android ارسال شده است.
2016 ارسال در مک
2017 GPU در بیش از 60 درصد از بازدیدهای صفحه اندروید استفاده می شود.
2018 ارسال در Windows، ChromeOS، و Android Go.
2019 شطرنجی سازی GPU رشته ای.
2020 محتوای اندروید باقی مانده را ارسال کنید.

پیمایش رشته‌ای، انیمیشن‌ها و رمزگشایی

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

سال پیش رفتن
2011 پشتیبانی اولیه از اسکرول رشته ای و انیمیشن.
2015 له کردن لایه.
2016 پیمایش سرریز جهانی.
2017 رمزگشایی تصویر روی رشته کامپوزیتور.
2018 انیمیشن های تصویری در رشته کامپوزیتور.
2020 همیشه با موقعیت ثابت ترکیبی.
2021 انیمیشن های درصد تبدیل، انیمیشن های SVG.

یعنی

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

سال پیش رفتن
2018 OOP-R در اندروید، مک و ویندوز ارسال شده است.
2019 OOP-D ارسال شد. OOP-R به همه جا ارسال می شود (به جز Canvas). SkiaRenderer در لینوکس ارسال شد.
2020 SkiaRenderer در ویندوز و اندروید ارسال شد. Vulkan برای اندروید عرضه شد.
2021 SkiaRenderer در Mac (و ChromeOS به زودی) ارسال شد.

تعاریف اصطلاحات در نمودار بالا:

OOP-D
ترکیب کننده نمایش خارج از فرآیند. ترکیب نمایشگر همان نوع فعالیتی است که یک کامپوزیتور سیستم عامل انجام می شود . خارج از فرآیند به معنای انجام آن در فرآیند Viz به جای فرآیند رندر صفحه وب یا فرآیند UI مرورگر است.
OOP-R
شطرنجی خارج از فرآیند. Raster لیست های نمایشگر را به پیکسل تبدیل می کند. خارج از فرآیند به معنای انجام آن در فرآیند Viz به جای فرآیند رندر صفحه وب است.
SkiaRenderer
یک پیاده‌سازی ترکیب‌کننده نمایشگر جدید که می‌تواند از اجرا بر روی طیف وسیعی از APIهای مختلف GPU زیربنایی مانند Vulkan، D3D12 یا Metal پشتیبانی کند.

رندر بوم با نخ و شتاب

این پروژه ای است که OffscreenCanvas را ممکن کرد.

سال پیش رفتن
2018 ارسال OffscreenCanvas.
2019 ImageBitmapRenderingContext را ارسال کنید.
2021 ارسال OOP-R.

VideoNG

VideoNG یک تلاش طولانی مدت برای ارائه پخش کارآمد، قابل اعتماد و با کیفیت بالا در وب است.

سال پیش رفتن
2014 یک چارچوب رندر مبتنی بر موجو را معرفی کرد.
2015 Project Butter و پوشش‌های ویدیویی برای ارائه روان‌تر ویدیو ارسال شد.
2016 خطوط لوله یکپارچه رمزگشایی و رندر اندروید و دسکتاپ ارسال شد.
2017 ارسال HDR و رندر ویدیوی تصحیح شده با رنگ.
2018 خط لوله رمزگشایی ویدیویی مبتنی بر موجو ارسال شد.
2019 خط لوله رندر ویدیویی مبتنی بر سطح ارسال شد.
2021 پشتیبانی از ارائه محتوای محافظت شده 4K در ChromeOS ارسال شد.

تعاریف اصطلاحات در نمودار بالا:

موجو
یک زیرسیستم IPC نسل بعدی برای Chromium.
سطح
مفهومی که بخشی از طراحی پروژه Viz است.

تصاویر توسط Una Kravets.