موتور برنامه چگونه کار می‌کند

OLED Guard Pro یک محافظ صفحه (screensaver) معمولی نیست؛ یک پایپلاین ویدئویی بلادرنگ است که به‌طور کامل روی GPU اجرا می‌شود و در تمام مدتی که با رایانه کار می‌کنید، هر فریم را روی هر نمایشگر متصل پردازش می‌کند. این صفحه مرور فنی همین موتور است.

پایپلاین چهارمرحله‌ای

CAPTUREWGC/DXGIMODELexposurePRESENTfieldCOMPOSITEDWM

1. ضبط: Windows Graphics Capture / Desktop Duplication

ویندوز دو API دارد که یک GPU texture handle از خروجی DWM برای هر نمایشگر در اختیار برنامه می‌گذارند: Windows Graphics Capture (WGC) و DXGI Desktop Duplication. OLED Guard از هر دو پشتیبانی می‌کند. با تنظیم Capture method می‌توانید بین Auto، WGC و Desktop Duplication یکی را انتخاب کنید؛ گزینه Auto روی Windows 11 سراغ WGC می‌رود و روی سیستم‌های دیگر از مسیر کلاسیک، یعنی Desktop Duplication، استفاده می‌کند. هر جا WGC در دسترس باشد همان در اولویت است، چون حتی داخل بازی‌های تمام‌صفحه هم فریم‌ها را با نرخ کامل تحویل می‌دهد؛ جایی که Desktop Duplication ممکن است از فریم جا بماند. در هر دو حالت، ویژگی‌هایی که موتور به آن‌ها متکی است پابرجا می‌مانند:

  • ضبط روی GPU انجام می‌شود و بافر فریم هرگز از حافظه گرافیکی خارج نمی‌شود.
  • هر دو API داخل بازی‌های تمام‌صفحه بدون حاشیه (borderless fullscreen) هم کار می‌کنند؛ یعنی همان حالتی که بیشتر گیمرها عملاً در آن بازی می‌کنند. روش‌های قدیمی‌تری مثل BitBlt یا PrintWindow از پس این کار برنمی‌آیند.
  • HDR، چند مانیتور و نمایشگرهای با نرخ نوسازی بالا بدون هیچ کار اضافه‌ای از سمت ما پشتیبانی می‌شوند.

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

2. مدل: شیدر نوردهی هر پیکسل

یک پیکسل‌شیدر هر فریم ضبط‌شده را با وضوح اصلی نمایشگر پردازش می‌کند و برای تک‌تک پیکسل‌ها این مقادیر را محاسبه می‌کند:

luminance     = dot(pixelRGB, vec3(0.2126, 0.7152, 0.0722));
delta         = luminance * frameTime;
exposure[p]   = exposure[p] + delta;

دو گذر موازی هم در کنار آن اجرا می‌شوند:

  • پوش حرکت (motion envelope). یک فیلتر بالاگذر زمانی کم‌هزینه که می‌سنجد هر پیکسل در N فریم اخیر چقدر تغییر کرده است. نوردهی پیکسل‌های پرتحرک سریع‌تر افت داده می‌شود، چون محتوای متحرک فرسایش را در یک نقطه متمرکز نمی‌کند.
  • آشکارساز پایداری (stability detector). یک فیلتر پایین‌گذر روی پوش حرکت: پیکسل‌هایی که مقدارشان طی فریم‌های زیادی ثابت مانده باشد، «ایستا» علامت می‌خورند و نامزد محافظت می‌شوند.

هیستوگرام نوردهی به‌صورت دوبافره (double-buffered) در حافظه GPU نگهداری می‌شود و در مسیر داغ (hot path) هیچ بازخوانی‌ای به سمت CPU وجود ندارد.

3. نمایش: تبدیل خطر به یک میدان پیوسته

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

  • اشغال‌شدگی (Occupancy) به این پرسش پاسخ می‌دهد که «آیا محتوای قابل‌محافظتی به‌طور ماندگار اینجا هست؟»، تا یک درخشش روشن گذرا باعث کم‌نوری نشود.
  • شدت (Intensity) به این پرسش پاسخ می‌دهد که «مدل ریسک اینجا چه مقدار محافظت می‌خواهد؟».

کم‌نوری دیده‌شده حاصل‌ضرب همین دو میدان است که با اصلاح‌کننده‌هایی با ترتیب مشخص شکل می‌گیرد: یک هسته ایمنی فوری برای قله‌های واقعیِ پرخطر، کف HUD یادگرفته‌شده‌ی Game IQ، یک دوره مهلت برای محتوای ثابت، مستطیل‌های استثنا، وزن‌دهی اختیاری لبه‌ها به سبک vignette و شکل‌دهی الگوی نویز آبی. چون نمایش از تاریخچه جدا نگه داشته می‌شود، محتوای متحرک می‌تواند کم‌نوری کهنه را رها کند بدون اینکه نوردهی‌ای را که پنل واقعاً انباشته پاک کند.

در حالت دستی شدت و شکل‌دهی را از صفحه Overlay تنظیم می‌کنید. در Automatic Mode کنترلر دسته‌بندی زنده سیگنال (کار، بازی، ویدئو، بی‌کاری)، پوش حرکت هر پیکسل و روند پویایی را می‌خواند و پیکربندی‌ای را برمی‌گزیند که به گفته مدل، با رعایت سقف محسوس بودن، خطر را به حداقل می‌رساند. می‌توانید این فرایند را در نمایش Advanced > Live Classifier تماشا کنید.

4. ترکیب (Composite): DWM و آلفای پیش‌ضرب‌شده

یک شیدر دوم، لایه محافظ انتخاب‌شده را داخل پنجره‌ای شفاف رندر می‌کند که همیشه روی بقیه پنجره‌هاست. سپس Desktop Window Manager همان پنجره را با آلفای پیش‌ضرب‌شده (premultiplied alpha) روی دسکتاپ ترکیب می‌کند؛ دقیقاً همان مسیری که ویندوز برای انیمیشن‌های خودش به کار می‌برد. برای همین لایه محافظ در همه این شرایط درست کار می‌کند:

  • حالت‌های SDR و HDR،
  • بازی‌های تمام‌صفحه بدون حاشیه،
  • نمایشگرهای با نرخ نوسازی متغیر (G-Sync / FreeSync)،
  • چیدمان‌های چندمانیتوره،
  • پیکربندی‌هایی با DPI ترکیبی.

ترکیب نهایی را خود DWM انجام می‌دهد؛ ما فقط یک فریم تحویلش می‌دهیم.

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

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

چه چیزهایی روی CPU اجرا می‌شوند

سهم CPU این کارهاست:

  • کامپایل شیدرها هنگام شروع برنامه،
  • پیش‌تنظیم‌ها، پیکربندی و رابط کاربری React،
  • زیر نظر گرفتن پنجره فعال برای پروفایل‌های برنامه،
  • ارسال دستورات DDC/CI وقتی روشنایی را از داخل برنامه تغییر می‌دهید.

CPU محتوای صفحه شما را نمی‌بیند؛ فریم‌ها در تمام مدت داخل حافظه GPU می‌مانند.

بودجه عملکرد

یک اندازه‌گیری نمونه در وضوح 1440p و نرخ 144 Hz روی یک GPU میان‌رده:

مرحلههزینه هر فریم
Capture~ 0.4 ms
Model~ 0.3 ms
Composite~ 0.5 ms
مجموع~ 1.2 ms

این یعنی حدود 7% از بودجه 16.6 ms در 60 Hz؛ اما چون این پردازش سمت GPU انجام می‌شود و مسیر رندر بازی شما را مسدود نمی‌کند، اثر واقعی آن در بنچمارک‌ها معمولاً زیر 1% است. وضوح بالاتر، نرخ نوسازی بیشتر و GPU ضعیف‌تر هزینه را بالا می‌برند، اما نسبت مراحل همین می‌ماند.

چه چیزهایی عمداً کنار گذاشته شدند

چند تصمیم طراحی که بیش از یک بار دوباره سنجیدیم:

  • مدل ریسک سلولی نداریم. نمونه اولیه یک لایه محافظ که روی کاشی‌های 32 × 32 استدلال می‌کرد، ساخته و بعد کنار گذاشته شد. مدل‌سازی در سطح تک‌پیکسل با فیزیک ماجرا صادق‌تر است؛ کاشی‌های سخت در مرز محتواها آرتیفکت‌های پله‌ای می‌ساختند. میدان نمایش v5 عمداً کم‌وضوح است، اما پیوسته هموار و با محو تدریجی (crossfade) در هم می‌آمیزد، بنابراین هرگز مثل آن کاشی‌های سخت پله‌ای نمی‌شود و مدل ریسک زیربنایی همچنان تک‌پیکسلی باقی می‌ماند.
  • هیچ تشخیص اکتشافی برن-این روی CPU نداریم. موتور تلاش نمی‌کند بفهمد «این نوار کناری Discord است» یا «این لوگوی YouTube است». این نوع تشخیص شکننده است و خیلی زود از کار می‌افتد؛ در عوض نوردهی یک کمیت فیزیکی جهان‌شمول است.
  • خط تله‌متری نداریم. هیستوگرام‌های هر پیکسل هرگز از رایانه شما خارج نمی‌شوند. عمداً هیچ سروری برای دریافت آن‌ها نداریم.

اگر دوست دارید موتور را در حین کار ببینید، صفحه Advanced engine در برنامه دسکتاپ، دسته‌بند زنده، نمودار تصمیم‌های کنترلر خودکار برای تک‌تک کنترل‌ها و نوار سیگنال‌های زنده را با نرخ 60 Hz نمایش می‌دهد.