شما به تازگی دلارهای خود را که به سختی به دست آورده اید برای آخرین بازی AAA برای بازی در رایانه شخصی بازی ارزشمند خود خرج کرده اید. بعد از یک بار دانلود طولانی، شما مستقیماً وارد بازی می شوید، در حالی که در منوی اصلی با یک انتظار طولانی مواجه می شوید، در حالی که خودش مرتب می شود…
هر بازی مدرن سه بعدی را انتخاب کنید، اما داستان کاملاً متفاوت است. سفر در مورد محیط، رفتن به سطحی متفاوت یا مبارزه با یک دشمن جدید، مستلزم آن است که بازی شیدرهای جدیدی را از درایو ذخیره سازی بارگیری کند و سپس آنها را کامپایل کند.
بازی های سه بعدی مدرن از هزاران سایه زن برای محاسبه تصاویر نمایش داده شده روی صفحه استفاده می کنند. برخی از آنها بسیار کوتاه و ساده هستند، برخی دیگر می توانند بسیار طولانی و بسیار پیچیده باشند و تمام منابعی را که یک GPU می تواند ارائه دهد را جذب کند.
یا شاید این اتفاق نمی افتد. اما در حین بازی با مشکلات زیادی در نرخ فریم روبرو می شوید. در جستجوی راه حل ناامید، وب را در جستجوی پاسخ می چرخانید و به عبارتی که اغلب تکرار می شود برخورد می کنید: “کامپایل سایه زن“
اگر کسی این را به درستی مدیریت نکند، مشکل فقط در طول تست کیفیت/عملکرد خود را نشان می دهد. البته مدیران توسعه بودجه و زمان را به چنین مواردی اختصاص میدهند، اما این فقط تا اینجا پیش میرود، و اگر بازی مشکلات زیادی را تجربه میکند، پرداختن به لکنت به دلیل کامپایل شیدر ممکن است در زمان راهاندازی مورد توجه کافی قرار نگیرد.
در این مرحله، ممکن است به این فکر کنید که نوعی سرویس آنلاین، که سایه بان های کامپایل شده را برای هر بازی، سخت افزار و پیکربندی درایور ذخیره می کند، ارزش داشتن را دارد. Valve چنین چیزی را به عنوان یک سرویس کش در Steam ارائه می دهد، اما فقط برای بازی هایی که از OpenGL یا Vulkan استفاده می کنند. با این حال، اغلب اوقات، حافظه پنهان همیشه خالی به نظر می رسد.
شاید فکر کنید که این فروشندگان می توانند کارهای بیشتری برای بهبود عملکرد کامپایل سایه زن انجام دهند، اما این روزها تا آنجا که می تواند سریع است.
داشتن تجربه و درک زیاد از جزئیات دقیق موتور مورد استفاده نیز کلیدی است. به عنوان مثال، هنگام ساخت یک بازی در UE4، ظاهر سطح هر شی و بخش از محیط توسط مواردی به نام مواد ایجاد می شود. بهطور پیشفرض، ایجاد اینها به نوبه خود مجموعهای از سایهبانها را ایجاد میکند که بسیاری از آنها ممکن است غیر ضروری باشند.
سایه بان ها تفاوتی ندارند، آنها به زبان خاصی نوشته شده اند، بنابراین ایجاد آنها و درک آنچه در حال وقوع است آسان تر است. نمونه ای از این را می توان با استفاده از ShaderToy مشاهده کرد. برای استفاده از نسخه آنلاین این ابزار، کد با استفاده از GLSL (زبان سایهزنی OpenGL) نوشته میشود و API WebGL را برای رندر در نظر میگیرد.
در مثال زیر، کد نشان داده شده بخشی از فرآیند مورد نیاز برای تولید سطح زمینی است که در تصویر نهایی مشاهده میشود — شما میتوانید با تماشای این ویدیو نحوه ایجاد همه آن را دنبال کنید.
بازیهای روی کنسولها، مانند PS5 یا سری Xbox، معمولاً همه شیدرها را از پیش کامپایل میکنند، البته نه همیشه. این به این دلیل است که پیکربندی سختافزار بسیار ثابت است – توسعهدهندگانی که یک عنوان جدید برای دستگاهی از سونی یا مایکروسافت ایجاد میکنند فقط باید یک نوع GPU را مدیریت کنند و سیستم عامل و درایورهای آن به ندرت تغییر میکنند.
متأسفانه برای گیمرها، کار زیادی نمی توانید در مورد آن انجام دهید. از آنجایی که این CPU است که وظایف کامپایل را انجام می دهد، به حداقل رساندن مقدار وظایف پس زمینه ممکن است کمک کند، همانطور که کیفیت گرافیک بازی را کاهش می دهد، اما این تقریباً تمام کاری است که کاربران می توانند انجام دهند.
و هر یک از آنها قبل از اینکه GPU بتواند کاری با آنها انجام دهد نیاز به پردازش دارد.
نحوه و زمان کامپایل شیدر
کامپایل نرم افزار فرآیند تبدیل کد منبع به کد قابل اجرا توسط ماشین است. کد منبع را می توان به هر زبان برنامه نویسی نوشت و سپس به باینری تبدیل می شود تا توسط سخت افزار کامپیوتر اجرا شود.
گیمرهایی که با عناوینی که با استفاده از موتور Unreal Engine ساخته می شوند، به ویژه نسخه 4 آشنا هستند، این را به خوبی می دانند، اگرچه این مشکلی نیست که منحصر به UE4 باشد. راه اندازی پورت های رایانه شخصی Horizon Zero Dawn و Death Stranding، که هر دو با استفاده از موتور اختصاصی Decima ساخته شده بودند، با گزارش های مکرر از لکنت بی وقفه خدشه دار شدند، که بیشتر آن ها به مشکلات کامپایل سایه زن نسبت داده می شد و در وصله های پس از راه اندازی به آن پرداخته شد.
پس توسعه دهندگان و گیمرها چه کاری می توانند انجام دهند تا این مشکل را به حداقل برسانند؟
چیزی مانند میراث هاگوارتز اخیر چنین گزینه ای را در اختیار شما قرار نمی دهد و قسمت اعظم کامپایل با روشن شدن بازی و قبل از رسیدن به منوی اصلی انجام می شود. به نظر نمیرسد که هیچیک از این روشها بهویژه بهینه نیستند، زیرا هر دو عنوان همچنان بهطور قابل توجهی سایههای بیشتری را در حین بازی پردازش میکنند.
اگرچه API های مختلف مورد استفاده توسط توسعه دهندگان اصطلاحات متفاوتی دارند، هفت دسته سایه زن وجود دارد. سایهزنهای راس، هندسه، بدنه و دامنه، همه در مورد مدیریت رئوس مثلثها هستند — ایجاد و شکلدهی دنیای سهبعدی قبل از اینکه رنگی شود.
در اصل، سایه بان ها فقط بلوک های کد هستند. در دنیای گرافیک و رندر سه بعدی، هر کدام یک برنامه کوچک است که برای تولید یک خروجی بسیار خاص طراحی شده است. ممکن است تغییر شکل یا موقعیت یک مثلث، نگاشت یک بافت به یک شکل، یا محاسبه مجموعه ای از مقادیر مورد نیاز برای سایه زن های دیگر باشد.
بدیهی است که این کار بارگذاری را تسریع میکند، اما کامپایل بلادرنگ میتواند در زنجیره پردازش گرافیکی ستال ایجاد کند، در حالی که CPU فرآیند تبدیل را اجرا میکند.
این به این دلیل است که گرایش در عناوین AAA این است که گرافیکهای واقعیتر یا از نظر بصری چشمگیرتر، به ویژه در ژانر محبوب جهان باز داشته باشند. بنابراین سایهزنها طولانیتر و پیچیدهتر میشوند و همچنین تعداد آنها افزایش مییابد، و همگی برای کامپایل شدن زمان بیشتری میبرند.
لکنت در بازی ها اینطور نیست فقط ناشی از کامپایل شیدر است، زیرا جنبه های زیادی برای رندر وجود دارد که می تواند منجر به این شود، اما این مسئله خاص یکی از مواردی است که به طور فزاینده ای رایج می شود.
با این حال، حداقل به این معنی است که کد سایه زن برای استفاده توسط درایورها آماده است، در لحظه ای که موتور رندر بازی دستوراتی را به GPU صادر می کند. روش مخالف همه اینها این است که از تبدیل آنها در ابتدا خودداری کنید و همه این کارها را در مواقعی که لازم است، در طول بازی انجام دهید.
با این حال، رایانههای رومیزی دردسر بزرگی را در این زمینه ایجاد میکنند، زیرا هزاران ترکیب احتمالی از سیستمعاملها، درایورها و تراشههای گرافیکی وجود دارد. پیشکامپایل سایهزنها برای همه آنها غیرممکن است، بنابراین توسعهدهندگان از روشهای مختلفی برای حل این معما استفاده میکنند.
مشکلات پیرامون کامپایل شیدر
هنگامی که APIهایی مانند Direct3D و OpenGL برای اولین بار از سایه بان ها پشتیبانی می کردند، اندازه و دامنه آنها بسیار محدود بود. برای مثال، زمانی که سایهزنهای پیکسل برای اولین بار در رایانههای شخصی ظاهر شدند، بیش از 20 سال پیش، تنها 4 دستورالعمل مربوط به بافتها و 8 دستورالعمل برای انجام ریاضی وجود داشت.
این کار توسط سایه زن های پیکسل (و اخیراً اشعه) انجام می شود که ریاضیات مربوط به نورپردازی و بافت را پردازش می کند. در نهایت، شیدرهای محاسباتی به جای انجام هر کاری خاص برای گرافیک، به انجام پردازش های محاسباتی و منطقی همه منظوره می پردازند.
سازندگان GPU نیز در اینجا نقش دارند، زیرا این نرم افزار آنهاست که کامپایل را انجام می دهد. درایورهای AMD و Nvidia سایه بان های کامپایل شده از بازی های معمولی را در یک پوشه در درایو ذخیره سازی اصلی ذخیره می کنند، اما لحظه ای که بازی یا درایورها به روز می شوند، این روند باید تکرار شود.
باهوش ترین توسعه دهندگان (مثلا Infinity Ward، سازندگان CoD) می دانند که باید از تمام ترفندهای موجود در کتاب استفاده کنند تا با پنهان کردن آن در منوها، صحنه های برش، وسط، مانع از ایجاد وقفه در تبدیل کد در جریان رندر شوند. مراحل بارگذاری سطح، و غیره.
در نهایت، این توسعه دهندگان بازی هستند که مسئول به حداقل رساندن تأثیر کامپایل شیدر هستند. برخی در این کار بسیار خوب هستند و ظاهراً برای به حداقل رساندن لکنت تمام تلاش خود را می کنند، در حالی که برخی دیگر در مورد آن بسیار کوشا هستند (در اینجا به شما نگاه می کنیم، FromSoftware).
حتی اگر معنی آن کد را ندانید، مهم نیست — تراشه گرافیکی شما هم این را نمی داند. میتواند تمام محاسبات را انجام دهد، اما باید دستورالعملها را به صورت باینری داده شود. کد باید از WebGL در دستورالعملهای GPU کامپایل شود – در مورد هر چیزی که از یک GPU برای رسیدن به نتیجه نهایی استفاده میکند، کامپایل توسط درایورهای GPU انجام میشود و CPU آن حجم کاری را مدیریت میکند.
اینها معمولاً به شکل یک افت ناگهانی، اما بسیار مختصر در میانگین نرخ فریم بازی تجربه می شوند. بهتر به عنوان شناخته شده است لکنت زبان، این مسئله می تواند از چیزی بیش از یک سکسکه لحظه ای تا یک آشفتگی معمولی و وحشتناک باشد.
بازی های کمی گزینه ای برای تغییر نحوه مدیریت کامپایل سایه زن ارائه می دهند. Horizon Zero Dawn فوقالذکر، با آخرین پچ، کامپایل سایهزن را در منوی اصلی انجام میدهد، اما به شما این امکان را میدهد که اگر بیش از حد طول بکشد، آن را نادیده بگیرید – که در سختافزارهای پایینرده این کار را میکند.
این نمونه ShaderToy فقط از تعداد انگشت شماری سایه زن استفاده می کند و تنها یکی از آنها نسبتا طولانی است. با این حال، یک CPU معمولی دسکتاپ فقط کسری از ثانیه طول می کشد تا همه آنها را کامپایل کند، بنابراین این یک بار انجام می شود، در لحظه ای که نسخه ی نمایشی را شروع می کنید.
امروزه، در آخرین نسخه همه سایهزنها، عملاً هیچ محدودیتی برای تعداد دستورالعملهای قابل بستهبندی در کد وجود ندارد…
آیا می خواهید بدانید کامپایل شیدر چیست، چرا به آن نیاز است و چرا چنین پرس منفی دریافت می کند؟ خوب، این مقاله عالی برای شماست.
خوب، پس شیدر چیست؟
بازیهای زیادی وجود دارند که رویکردی واسطهای برای کامپایل سایهزن دارند، بازیهای اصلی را در حین بارگذاری یا در منوی اصلی پردازش میکنند و بقیه را در صورت نیاز انجام میدهند. اما درست کردن این مورد روی پلتفرم رایانه شخصی یک چالش است.
اگر یک بازی دهها هزار شیدر داشته باشد، کامپایل کردن همه آنها در ابتدا میتواند این زمانهای لود را بسیار طولانی کند. مدیریت ضعیف کتابخانه شیدر، در طول ساخت بازی، فقط این موضوع را تشدید می کند، زیرا زمان و فضای ذخیره سازی برای جمع آوری چیزی که هرگز استفاده نمی شود تلف می شود.
بنابراین شاید، فقط شاید، مشکل می توان توسط ما رفع شود — از طریق قدرت کیف پول ما.
به خواندن ادامه دهید. ویژگی های بازی در TechSpot
وصلههای پس از انتشار اغلب سعی میکنند چنین مشکلاتی را کاهش دهند، که قویاً نشان میدهد که شرکتهای توسعهدهنده نسخههای PC بازیهای خود را به اندازه کافی تست QA نمیدهند. و با توجه به اینکه این کار هزینه دارد، تا زمانی که میلیون ها نفر همچنان آخرین بازی ها را خریداری می کنند با با لکنت، بسیاری از مدیران تمایلی به صرف بودجه بیشتر برای بهینه سازی چیزها ندارند.
یکی از روشهای رایج این است که تمام سایهبانهایی را که بازی قرار است در هنگام بارگذاری آن استفاده کند، تبدیل میکند – گاهی اوقات در طول دنباله راهاندازی اصلی، گاهی اوقات در منوی اصلی یا در بارگذاری سطح اولیه.