پرش به محتوای اصلی

رابط کاربری و زمان اجرا Blender: بسیار سریعتر از GPUI

هکرنیوز۱۴۰۵ آبان ۱۵, جمعه، ساعت ۱۱:۱۰حدود 17 دقیقه مطالعه

آدرس مقاله: https://github.com/ppmpreetham/BUI آدرس نظرات: https://news.ycombinator.com/item?id=50389333 امتیاز: 332 # نظرات: 140

رابط کاربری Blender، به عنوان یک کتابخانه می توانید از Python، Rust، JavaScript (React، Svelte)، C، C++ و Dear ImGui استفاده کنید.

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

وب سایت و مستندات کامل: bui.preetham.top · چت: Discord

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

BUI رابط کاربری Blender (طراحی ویجت، قوانین تعامل و ظاهر آن) را می گیرد و آن را به یک کتابخانه UI مستقل با یک هسته کوچک C تبدیل می کند. کد شما درخت ویجت را می سازد و پاسخگوی تماس ها را مدیریت می کند. چیدمان، ورودی، ترسیم و ارائه همه در کدهای بومی سریع، روی CPU یا GPU اتفاق می‌افتد.

در قلب BUI این کیت وجود دارد: یک زمان اجرا کوچک که به زبان C نوشته شده است. این کیت همه ویجت ها را در یک درخت نگه می دارد، آنها را قرار می دهد، ماوس و صفحه کلید را کنترل می کند، و آنها را همانطور که Blender انجام می دهد ترسیم می کند. کد ترسیم یک پورت C از کد ویجت خود بلندر است و تعامل از قوانین بلندر پیروی می کند. در بالای کیت اتصالات قرار دارند: لایه‌های نازکی که به Python، Rust، JavaScript، C++ و Dear ImGui اجازه می‌دهند با آن صحبت کنند.

رابط کاربری بلندر به خاطر احساسش مشهور است. یک فیلد عددی را فشار می‌دهید و می‌کشید: مکان‌نما ناپدید می‌شود، مقدار زیر دستتان می‌لغزد، و هرگز به لبه‌ی صفحه‌نمایش برخورد نمی‌کنید. شما 2*pi را در یک فیلد تایپ می کنید و فقط کار می کند. شما "ad cu" را در یک منو تایپ می کنید و "Add Cube" را پیدا می کند. میلیون ها هنرمند این عادات را در دست دارند.

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

شما می‌توانید BUI را به روش‌های مختلف هدایت کنید، و همه آن‌ها زمان اجرای C یکسانی را به اشتراک می‌گذارند، بنابراین همه آنها دارای ابزارک‌ها و تعاملات یکسانی هستند:

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

هر اسکرین شات در اینجا یک پنجره BUI واقعی است که خارج از صفحه نمایش داده می شود. در جایی که یک تصویر در یک نسخه تیره و روشن ارائه می شود، GitHub تصویری را نشان می دهد که با موضوع شما مطابقت دارد.

ویرایشگر گره، از پایتون ( examples/site/geometry_nodes.py)

منوی پای و جستجوی منوی بلندر (در هر منوی باز تایپ کنید)

جلوه‌های CSS در Rust: فیلترها، مسیر کلیپ، تبدیل‌ها، حالت‌های ترکیبی، فیلتر پس‌زمینه (site_effects.rs)

شبکه CSS با تکرار(پر کردن خودکار، minmax())، دهانه ها و جریان خودکار شبکه: متراکم (site_grid.rs)

CSS @keyframes در 0.25 ثانیه، 0.6 ثانیه و 1.0 ثانیه (site_animation.rs)

examples/showcase.rs : HTML + CSS در Rust دمو Dear ImGui با ویجت های خاص خود، در تم Blender's Qt syntax tkinter: متن با برچسب ها، بوم، دیالوگ ها

پایتون. شما به CPython 3.11 یا جدیدتر نیاز دارید. چرخ‌ها برای ویندوز، لینوکس و macOS منتشر شده‌اند، بنابراین چیزی برای کامپایل وجود ندارد. یک بسته به شما هر چهار API پایتون را می دهد (سینتکس tkinter، نحو Qt، اجزای Blender و Dear ImGui):

آن را به عنوان blenderui وارد کنید. همچنین در نمونه‌های قدیمی‌تر، import bui را خواهید دید: این کد با نام اصلی‌اش یکسان است، اما یک پروژه نامرتبط مالک bui در PyPI است، بنابراین blenderui را در هر چیزی که منتشر می‌کنید ترجیح دهید.

اولین ساخت، کیت C BUI را برای شما کامپایل می‌کند، بنابراین به Rust 1.88 یا جدیدتر، CMake و یک کامپایلر C (در ویندوز، Visual Studio Build Tools برای هدف پیش‌فرض MSVC)، و در لینوکس به هدرهای X11 (libx11-dev یا libX11-devel؛ نیازی به هدر GL نیست) نیاز دارید.

جاوا اسکریپت. شما به Node.js 18 یا جدیدتر یا Bun نیاز دارید:

بسته های npm برای ویندوز x64 از پیش ساخته شده اند. در لینوکس، افزونه را از یک کلون بسازید (npm install سپس npm build را در bindings/، با Rust، CMake و یک کامپایلر C اجرا کنید). ویندوز X11 بومی ویندوز وجود دارد. در macOS، جاوا اسکریپت در حال حاضر بدون سر اجرا می شود (به پلتفرم ها مراجعه کنید).

C و C++. ساخت از منبع با CMake 3.20+ و کامپایلر C11 / C++20 (MSVC، GCC یا MinGW-w64، یا Clang). در لینوکس، همچنین هدرهای X11:

در پروژه CMake خود، BUI را به عنوان یک زیر شاخه اضافه کنید و bui::kit را پیوند دهید (یا bui::imgui برای Dear ImGui):

ImGui عزیز. پایتون آن را با pip install blenderui دریافت می کند ( import blenderui.imgui ). پیوندهای C++ bui::imgui، پیوندهای C bui_cimgui. Rust از جعبه blenderui-imgui استفاده می کند:

بیشتر: docs/getting-started.md و BUI را در وب سایت نصب کنید.

هر برنامه tkinter را روی BUI بدون تغییر خط اجرا کنید:

blenderui-tk باعث می شود import tkinter پیاده سازی BUI را برای آن اجرا برگرداند. یا از کد انتخاب کنید:

برنامه های tkinter و ttk بدون تغییر ( examples/site/tk_export.py، ttk_queue.py)

فیلدهای اعداد (Spinbox، Scale) مانند Blender's، Ctrl+Z / Ctrl+Shift+Z لغو ویرایش‌ها را پاک می‌کند و filedialog مرورگر فایل Blender را باز می‌کند. راهنما: docs/tkinter.md.

یک ویرایشگر Render Properties از اجزا ( examples/site/render_props.py )

45 جزء وجود دارد: چیدمان، مقادیر، دکمه ها، نماها، منوها و منوهای پای، انتخابگر رنگ، سطح شیب دار رنگ، ویرایشگرهای منحنی و گره، مناطق و قالب ها. مرجع: docs/components.md.

پایتون به سبک Qt بنویسید. واردات تنها خطی است که با PySide یا PyQt متفاوت است و هیچ کدام مورد نیاز نیست:

نحو Qt جزئی است (حدود 24٪ از نام های روش Qt در کلاس های اصلی ویجت). هر چیزی که از دست رفته باشد AttributeError را افزایش می دهد. راهنما: docs/qt.md.

جعبه Rust BUI دارای دو نحو درجه یک است و پنجره مشابهی را ترسیم می کنند:

در rsx! (این bindings/rust/blenderui/examples/hello.rs است؛ آن را با کارگو اجرا اجرا کنید --release --example hello in bindings/rust):

دو چیز کوچک که مردم را در rsx غافلگیر می کند! :

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

site_dashboard.rs (rsx! ) و site_dashboard_builder.rs (سازندگان gpui)

راهنما: docs/rust.md و آموزش Rust در وب سایت.

بدون React، @blender-ui/native یک API شبیه به DOM به شما می‌دهد:

لیست وظایف در React ( examples/site/js/todo_react.js)؛ نسخه DOM مانند همان را ترسیم می کند

Node.js 18+ یا Bun. از پیش ساخته شده برای ویندوز x64. در لینوکس، افزونه را از منبع بسازید ( npm اجرا ساخت در bindings/node ) و ویندوزها بومی هستند. راهنما: docs/javascript.md.

Dear ImGui 1.93 واقعی روی BUI اجرا می شود: ویندوزهای BUI، ورودی، رندر CPU/GPU، تم Blender و فونت Inter. کد ImGui موجود بدون تغییر کامپایل می شود.

C (cimgui.h، قراردادهای cimgui: ImGui_Button، ImGui_ButtonEx، و backend در cimgui_impl_bui.h) و Rust (blenderui-imgui) به همین ترتیب کار می کنند:

ساخت با -DBUI_IMGUI_BLENDER_WIDGETS=ON (یا ویژگی Rust blender-widgets) و ابزارک‌های ImGui متعلق به Blender می‌شوند: DragFloat فیلد شماره کشیدن به پاکسازی بلندر است (Shift برای دقت، Ctrl به snap)، Blender'stoggles, dragFloat منوها و ترکیب‌ها منوهای بلندر را دریافت می‌کنند. بقیه API ImGui بدون تغییر است. (چرخ PyPI بدون آن ساخته شده است، بنابراین از پایتون ویجت های خود ImGui را در موضوع Blender دریافت می کنید، مگر اینکه از منبع بسازید.)

نسخه ی نمایشی خود ImGui عزیز با BUI_IMGUI_BLENDER_WIDGETS=ON: فیلدهای اعداد، لغزنده ها، ردیف های رنگی و سرصفحه های پانل متعلق به Blender هستند.

همان کد ImGui: ویجت های ImGui (سمت چپ) و ساخت ابزارک های Blender (سمت راست) ( examples/site/imgui_inspector.cpp)

راهنما، پوشش و ظاهر سهام: docs/imgui.md.

API کیت یک هدر است، kit/include/BUI_kit.h، و به عنوان مرجع دو برابر می شود: هر تابع یک نظر یک خطی دارد. این یک نمونه کوتاه شده/kit_hello.c است: یک نوار لغزنده و یک دکمه در یک پنجره اصلی.

یک برنامه C بزرگتر: یک پشته اصلاح کننده ( examples/site/kit_modifiers.c)

بدون سیستم پنجره، به جای آن، به صورت رستر رندر کنید (BK_render(ctx، شطرنجی، w، h، کامل))، که همچنین نحوه عملکرد تست ها و اسکرین شات ها است. راهنما: docs/c-api.md.

این قوانین در کیت C زندگی می‌کنند، بنابراین در هر جایی که ویجت‌های Blender کشیده می‌شوند یکسان عمل می‌کنند: اجزای Python، نحو tkinter و Qt، مولفه‌های Rust و JavaScript Blender و کنترل‌های فرم داخل styled، ساخت ویجت‌های Blender ImGui و هر ویجت کیت C.

به زودی: تایپ کردن مقادیر با واحدها ("2 متر")، پنجره های بازشو جستجوی بلندر، و کشیدن و رها کردن ویجت. بیشتر: ویجت های بلندر.

در Rust و JavaScript شما ظاهر هر عنصر را انتخاب می کنید:

کامپوننت ها عبارتند از Button، Checkbox، Radio، NumberField، NumberSlider، TextField، TextArea، ColorSwatch، Dropdown و ProgressBar. هر یک عنصر HTML است که مخفف آن است، بنابراین هر ویژگی، سبک و رویداد روی آن کار می کند:

فرم‌های اجرا محموله - نمونه: HTML ساده، درون استایلد و اجزای Blender

همان نشانه‌گذاری، ساده (چپ) و استایل داخلی (راست). HTML ساده در هر دو موضوع یکسان به نظر می رسد.

اجزای بلندر از Rust (site_components.rs)

اجزای Blender پایتون (پانل، PieMenu، ویرایشگر گره ...) یک مجموعه جداگانه و بزرگتر هستند.

BUI دو رندر دارد و پیکسل‌های یکسانی را ترسیم می‌کنند.

سایه‌زنان فرمول‌های شطرنجی نرم‌افزار را ارزیابی می‌کنند: تست برابری 10 پیکسل از 172800 پیکسل را پیدا می‌کند که بیش از 3/255 در هر دو باطن تفاوت دارند.

BUI_GPU=1 تنظیمات کل برنامه را در کد لغو می کند. BUI_GPU=0 پیش‌فرض‌های برنامه را خاموش می‌کند، اما پنجره‌ای که خود GPU را می‌خواهد همچنان آن را دریافت می‌کند. جایی که هیچ دستگاهی نمی تواند راه اندازی شود، BUI بی سر و صدا روی CPU می ماند (BUI_GPU_DEBUG=1 دلیل آن را می گوید).

کدام یک؟ پنجره ابزار، فرم یا پانل تنظیمات: CPU (سبکترین در حافظه، بیکار در صفر). یک پنجره بزرگ یا HiDPI، تعداد زیادی انیمیشن، هزاران مورد: GPU (حدود نیمی از CPU در هر فریم، یا کمتر، برای حدود 10 مگابایت RAM بیشتر به اضافه حافظه GPU). سرورها و تست ها: CPU. macOS: CPU، در حال حاضر (به زودی یک رندر GPU وجود دارد).

یک پنجره BUI را باز بگذارید و دور شوید: اصلا از CPU استفاده نمی کند. یک دکمه را نگه دارید و BUI آن دکمه را دوباره ترسیم می کند، نه پنجره را.

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

میزبان پنجره یک زمینه کیت را در یک پنجره سطح بالا قرار می دهد و ورودی آن را تغذیه می کند.

BUI_UI_SCALE=1.5 به جای دنبال کردن صفحه نمایش، مقیاس UI را اصلاح می کند (1 ویجت پیش فرض Blender، 20 پیکسل است). بیشتر: میزبان های پنجره.

متن برنامه شما در ویندوز، لینوکس و macOS یکسان به نظر می‌رسد و شبیه Blender است:

محدودیت‌هایی که ارزش دانستن دارند: هنوز هیچ فونتی برای هر گلیف وجود ندارد (نویسه‌های گمشده به‌عنوان کادر نشان داده می‌شوند)، بدون IME، متن از راست به چپ مرتب‌سازی شده است اما شکل‌بندی نشده است، هیچ ویژگی OpenType وجود ندارد. فونت جایگزین و IME به زودی ارائه می شود. بیشتر: متن و فونت

BUI شبیه Blender است زیرا از تم Blender استفاده می کند. این دو ارسال می‌کند: تم تیره Blender (پیش‌فرض) و از پیش تنظیم شده Light آن. هر دو توسط tools/gen_theme.py از پیش‌تنظیم‌های Blender_Dark.xml و Blender_Light.xml خود Blender، بیش از پیش‌فرض‌های داخلی Blender 5.x تولید می‌شوند. در زمان اجرا سوئیچ کنید، و هر پنجره باز بازنمایی و ترسیم مجدد می شود:

ویجت‌ها، پانل‌ها، پس‌زمینه منطقه، صفحه HTML استایل‌داده‌شده و سبک بلندر ImGui همگی از موضوع پیروی می‌کنند. HTML ساده در هر صورت ظاهر مرورگر را حفظ می کند. درون هر تم هنوز هم می‌توانید چیزها را خودتان رنگ کنید: bg/fg در tkinter، setStyleSheet در نحو Qt، color= روی کامپوننت‌ها، CSS کامل روی HTML در Rust و JavaScript، رنگ‌های سبک خود ImGui.

BUI همچنین شامل آیکون های Blender است: تمام 781 نماد SVG بلندر که با کد NanoSVG بلندر شطرنجی شده اند تا در هر مقیاسی واضح باشند. از آنها با نام بلندر استفاده کنید: Button("Add", icon="ADD") , EnumRow(..., icons=[...]).

به زودی: بارگیری هر فایل تم Blender، فراتر از Dark and Light. بیشتر: تم.

pip install blenderui چهار API را در یک بسته به شما می دهد:

می توانید آنها را در یک فرآیند ترکیب کنید: پنجره ها، تایمرها و حلقه رویداد به اشتراک گذاشته می شوند (bui.host). هر تعاملی در C اجرا می‌شود، بنابراین آزمایش‌ها می‌توانند ویجت‌ها را بدون هد هدایت کنند. در وب سایت: tkinter، نحو Qt، اجزاء، تست هدلس.

جعبه blenderui یک چارچوب وب مانند است که توسط BUI ترسیم شده است: هر عنصر HTML، CSS، Tailwind، نشانه‌گذاری HTML مانند (rsx! / view!) یا سازنده‌ها، اجزا و هوک‌ها به سبک gpui. یک طعم:

هنوز نه: منابع غیر همگام (use_resource)، اجزای عمومی، تبدیل‌های سه بعدی، ویژگی‌های OpenType، طرح‌بندی چند ستونی. راهنما: docs/rust.md، جعبه README: bindings/rust/blenderui، و بخش Rust وب‌سایت (شامل افکت‌ها و انیمیشن‌ها).

محدودیت ها: بسته های npm فقط برای ویندوز x64 از پیش ساخته شده اند. رویدادها پس از مدیریت BUI به جاوا اسکریپت می رسند (بدون preventDefault بومی)، و event.target عمیق ترین عنصر گوش دادن است. راهنما: docs/javascript.md ; وب‌سایت: React، API بومی، سیگنال‌ها، فایل‌های اجرایی مستقل.

پیوندهای C، Python و Rust از imgui.h تولید می شوند. ImGui در BUI بی‌کار است: فریم‌ها فقط در ورودی اجرا می‌شوند و زمانی که چیزی متحرک می‌شود. ساخت Blender-Widgets (BUI_IMGUI_BLENDER_WIDGETS=ON، Rust feature blender-widgets) در ویجت های Blender جابجا می شود و می توان در زمان اجرا آن را تغییر داد (ImGui_ImplBUI_SetBlenderWidgets، imgui.set_blender_widgets). در آن ساخت، نوارهای عنوان پنجره، نکات ابزار، پنجره‌های بازشو ساده، جداول و انتخابگر رنگ، طراحی ImGui را حفظ می‌کنند.

راهنماها: docs/imgui.md، bindings/imgui/README.md (باطن و سبک بلندر)، bindings/imgui/blender/README.md (نگاشت ویجت)، و بخش Dear ImGui وب سایت.

مفاهیم کیت: گره های ساخته شده بر اساس نام نوع (قاب، لغزنده، دکمه، پانل، درخت، بوم، مرورگر فایل...)، ویژگی های تنظیم شده بر اساس نام، مدیران هندسه Tk (بسته، شبکه، مکان) در C، زمینه ای که دارای ورودی، پنجره های بازشو، فوکوس و لغو، میزبانی که رویدادها را دریافت می کند، و پنجره است. یک گره سفارشی خود ورودی را ترسیم و مدیریت می کند. ImGui عزیز به این ترتیب روی BUI اجرا می شود. راهنما: docs/c-api.md.

برای جاسازی BUI در رندر خود، کیت را در یک BuiRaster رندر کرده و آن را blit کنید (همانطور که bui.qt.BuiCanvas در داخل Qt انجام می دهد). یک لایه جداگانه و سطح پایین، رندر سینک (api/bui_c_api.h)، مثلث ها، خطوط و متن درز GPU حالت فوری را به رندر شما می دهد. باطن Qt/QPainter و ضبط کننده SVG از آن استفاده می کنند. راهنما: INTEGRATION.md.

این اعداد در لپ‌تاپ Ryzen 7 5800U (ویندوز 11، با برق متناوب) اندازه‌گیری شدند، قبل از اینکه جدیدترین ویژگی‌ها ظاهر شوند: عزیز ImGui، رندر GPU لینوکس، تم روشن، و جستجوی Blender و کد عبارت. آنها شکل چیزها را نشان می دهند، نه وعده ای برای دستگاه شما. آنها را با ابزارهای موجود در Run the Benchmarks خودتان اجرا کنید.

همان پنجره تنظیمات کوچک (برچسب، فیلد نوشتاری، چک باکس، لغزنده و دکمه) که هر یک از پنج راه را، از بنچ/برنامه‌ها، بر روی رندر CPU BUI (پیش‌فرض) و رندر GPU آن (BUI_GPU=1) نوشته است. آخرین ردیف‌ها یک فایل منبع gpui-syntax، settings.rs هستند که بدون تغییر در برابر blenderui، Zed's gpui و gpui-fast کامپایل شده‌اند. gpui ویجت‌های فرمی ندارد، بنابراین کنترل‌ها به صورت div است.

میانه 10 راه اندازی، از شروع فرآیند تا اولین فریم روی صفحه، با Python 3.14 و Node 22:

در همان کد، blenderui اولین فریم خود را حدود 5× زودتر از gpui و gpui-fast نشان می دهد، حدود 8× CPU کمتری برای رسیدن به آنجا خرج می کند، و در رندر CPU از نیمی از حافظه استفاده می کند. در حالت بیکار، gpui حدود 1.2 درصد از یک هسته را مشغول نگه می دارد. blenderui از هیچ کدام استفاده نمی کند.

لپ‌تاپ‌ها نمی‌توانند انرژی را برای هر برنامه گزارش دهند، بنابراین هزینه باتری با زمان CPU که یک برنامه ایجاد می‌کند اندازه‌گیری می‌شود: CPU که برای راه‌اندازی آن صرف می‌کند، و CPU که بیش از 20 ثانیه استفاده می‌کند در حالی که پنجره بیکار می‌ماند (چیزی که باتری را در زمانی که برنامه باز است تخلیه می‌کند). BUI فقط زمانی که چیزی تغییر می‌کند و در غیر این صورت می‌خوابد دوباره ترسیم می‌شود، بنابراین استفاده بی‌حرکت در هر یک از رندرها نزدیک به صفر است. رندر GPU کمی کندتر شروع می شود و از حافظه بیشتری استفاده می کند (دستگاه GPU) و در صحنه های بزرگ و متحرک (در زیر) نتیجه می دهد.

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

پایتون و سی، در نسخه نمایشی کامل کامپوننت (520×900):

پنجره آزمایشی ImGui عزیز با هر بخش باز (27k مثلث، 1280×800) یک نرم افزار کامل در حدود 5-8 میلی ثانیه است.

Rust، در برابر gpui Zed و فورک سریعتر gpui-fast. صحنه دارای 3000 سلول متحرک است و همه برنامه‌ها در یک جلسه اجرا می‌شوند (ردیف‌های GPU در Direct3D 11):

رندر GPU به طور پیش فرض خاموش است. آن را با Application::new().gpu(true) , tk.Tk(gpu=True) , bui.set_gpu(True) یا BUI_GPU=1 روشن کنید:

سایه‌زنان آن فرمول‌های شطرنجی نرم‌افزار را ارزیابی می‌کنند: تست برابری 10 پیکسل از 172800 پیکسل را پیدا می‌کند که بیش از 3/255 در هر دو باطن متفاوت است.

نرخ فریم صحنه سنگین gpui-fast بین جلسات در این لپ‌تاپ (30 تا 60 فریم در ثانیه) متفاوت است، بنابراین در یک جلسه مقایسه کنید. روش، داده‌های خام و نحوه اجرای مجدد: bindings/rust/bench/README.md.

راه اندازی. اینها یک برنامه کوچک React را راه‌اندازی می‌کنند (مشتری بالا) که پس از نمایش اولین فریم آن روی صفحه، از کار خارج می‌شود. هر رقم میانه 12 راه اندازی پس از راه اندازی گرم کردن (node ​​bench/startup.js) است.

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

انیمیشن. صحنه مشابه جدول Rust در بالا، در یک حالت: یک سلول تغییر در هر فریم، رندر GPU، میانه 3 اجرا. CPU کل فرآیند است که با شمارشگر سیکل مانند Rust محاسبه می شود.

React و Svelte، در کنار هم (یک جلسه، اجرا می‌شود، میانه‌های 3؛ --svelte در دستورات زیر):

روش، تجزیه حافظه و نحوه اجرای مجدد: docs/javascript.md.

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

زمان شروع و باتری: پنج راه و gpui (بنچ/، ویندوز). همان پنجره تنظیمات نوشته شده در هر طرف، روی CPU و رندر GPU، به علاوه یک فایل gpui-syntax که برای blenderui، gpui و gpui-fast کامپایل شده است. زمان شروع، CPU مورد استفاده برای شروع، حافظه و CPU بیکار را گزارش می کند و bench/results.json را می نویسد.

هزینه فریم: 100، 1000 و 3000 سلول متحرک، در برابر gpui و gpui-fast (bindings/rust/bench/, Windows). یک پنجره 1000×800 پر از N سلول گرد و شماره گذاری شده، در سه حالت:

هر برنامه چرخه های CPU، فریم ها و حافظه خود را اندازه گیری می کند و run.py استفاده از GPU و حافظه GPU را از شمارنده های عملکرد ویندوز اضافه می کند.

روش و نتایج کامل: bindings/rust/bench/README.md.

جاوا اسکریپت: همان سلول ها و راه اندازی (bindings/node/bench/):

tkinter: هزینه قاب بوم (بدون سر، هر پلت فرم):

در داخل هر برنامه: آن را با BUI_PROFILE=1 اجرا کنید تا زمان‌های فریم هر فاز (طرح، رنگ، شطرنجی، حال) را هر 60 فریم چاپ کنید. هر مقداری آن را روشن می کند. برای انتخاب رندر از BUI_GPU=1 / BUI_GPU=0 استفاده کنید. بیشتر: پروفایل .

Works یعنی کار می کند و تست شده است. آزمایشی به این معنی است که نوشته شده است اما آزمایشات عملی کمی روی سخت افزار واقعی داشته است (macOS: تا کنون دو دستگاه Apple Silicon Mac، به علاوه CI).

macOS. میزبان پنجره macOS جدید است: این یک پورت کد کاکائو Blender (GHOST) است. تا کنون توسط CI بررسی شده است و به صورت دستی روی دو Mac سیلیکون اپل امتحان شده است: توسط کریش کالاریا، که مشکل شماره 3 را گزارش کرد و آن را در درخواست کشش شماره 4 برطرف کرد، و توسط DanNoby (تست‌های 17/17؛ شماره 6 یک یادداشت زنجیره ابزار را به راهنما اضافه کرد). اگر مک دیگری دارید، به خصوص اینتل، لطفا آن را امتحان کنید و به ما بگویید چه اتفاقی می‌افتد: docs/macos-testing.md. پایتون همچنان می‌تواند از پنجره stdlib Tk در آنجا استفاده کند (BUI_HOST=tk؛ این به tkinter پایتون نیاز دارد، برای مثال از python.org یا brew install python-tk).

Node BUI را بر روی رشته UI خود اجرا می کند و macOS فقط به ویندوزها در رشته اصلی اجازه می دهد، بنابراین جاوا اسکریپت فعلا در macOS بدون سر می ماند.

لینوکس. libX11 و libGL با باز شدن اولین پنجره بارگذاری می‌شوند، بنابراین BUI روی سرورها و کانتینرهای بدون آن‌ها وارد و رندر می‌شود و به رستر CPU که در آن OpenGL وجود ندارد، باز می‌گردد. ساختن از منبع به هدرهای X11 نیاز دارد (libx11-dev / libX11-devel). هیچ هدر GL مورد نیاز نیست. تست های برابری C، Python، پنجره و GPU روی لینوکس، نرم افزار Mesa OpenGL و GPU NVIDIA انجام می شود.

اکثر آنها توسط کتابخانه C خوانده می شوند، بنابراین از هر زبانی یکسان کار می کنند. متغیرهای روشن/خاموش به نویسه اول نگاه می کنند: 1، y، Y، t یا T روشن است. در جایی که یک متغیر و یک فراخوانی API در سطح برنامه یکسان باشند، متغیر برنده است.

هر متغیر، با پیش‌فرض‌ها و جایی که خوانده می‌شود: متغیرهای محیطی و اسناد/getting-started.md.

شما به CMake 3.20+، یک کامپایلر C11 / C++20 (MSVC، GCC/MinGW یا Clang) و Python 3.11+ با هدر نیاز دارید. در لینوکس، همچنین هدرهای X11.

خواندن متن کامل در هکرنیوزبه زبان اصلی، در سایت ناشر باز می‌شود
متن اصلی (انگلیسی)

Blender's UI and Runtime: Much Faster Than GPUI

Article URL: https://github.com/ppmpreetham/BUI Comments URL: https://news.ycombinator.com/item?id=50389333 Points: 332 # Comments: 140

همه‌ی اخبار فناوری