تجزیه و تحلیل فرمت های رأس

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

نمای نمایه قاب برای فراخوانی glDrawElements، برای جزئیات روی پارامترهای فراخوانی قرعه کشی نشان داده شده است.
شکل 1. نمای نمای قاب برای یک فراخوانی تک glDrawElements ، که 2718 مثلث اولیه ترسیم شده را نشان می دهد.

فشرده سازی ویژگی Vertex

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

برای مشاهده فرمت راس برای یک فراخوانی مشخص، مراحل زیر را انجام دهید:

  1. یک فراخوان مورد علاقه قرعه کشی را انتخاب کنید.

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

  2. به صفحه Pipeline بروید و برای اسمبلی ورودی روی IA کلیک کنید. این فرمت راس را برای رئوس هایی که به GPU می آیند تعریف می کند.

  3. یک سری صفات و قالب آنها را رعایت کنید. به عنوان مثال، R32G32B32_SFLOAT یک شناور 3 جزء 32 بیتی است.

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

اغلب، ویژگی های راس را می توان با حداقل کاهش در کیفیت مدل های ترسیم شده فشرده کرد. به ویژه توصیه می کنیم:

  • فشرده سازی موقعیت راس به شناورهای نیمه دقیق 16 بیتی
  • فشرده سازی بافت UV مختصات به یوشورت های اعداد صحیح بدون علامت 16 بیتی
  • فشرده سازی فضای مماس با رمزگذاری بردارهای عادی، مماس و دونرمال با استفاده از کواترنیون ها

سایر ویژگی های متفرقه نیز ممکن است برای انواع با دقت کمتر به صورت موردی در نظر گرفته شوند.

تقسیم جریان راس

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

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

برای بررسی اینکه آیا ویژگی های راس به درستی تقسیم شده اند یا خیر:

  1. یک تماس قرعه کشی مورد علاقه را انتخاب کنید و شماره تماس قرعه کشی را یادداشت کنید.

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

  2. به صفحه Pipeline بروید و برای اسمبلی ورودی روی IA کلیک کنید. این فرمت راس را برای رئوس هایی که به GPU می آیند تعریف می کند.

  3. اتصالات صفات راس خود را مشاهده کنید. معمولاً اینها ممکن است به صورت خطی افزایش یابد (0، 1، 2، 3، و غیره)، اما همیشه اینطور نیست. موقعیت راس معمولاً اولین ویژگی رأس لیست شده است.

  4. در قسمت State ، LastDrawInfos را پیدا کنید و شماره تماس قرعه کشی منطبق را گسترش دهید. سپس، BoundVertexBuffers را برای این فراخوانی قرعه کشی گسترش دهید.

  5. بافرهای رأس محدود شده در طول فراخوانی قرعه کشی داده شده را با شاخص هایی که با اتصالات ویژگی راس قبلی مطابقت دارند، مشاهده کنید.

  6. اتصالات را برای ویژگی های راس فراخوانی قرعه کشی خود گسترش دهید و بافرها را گسترش دهید.

  7. VulkanHandle را برای بافرها مشاهده کنید، که نشان‌دهنده حافظه زیربنایی است که داده‌های راس از آن منبع می‌شوند. اگر s های VulkanHandle متفاوت باشند، این بدان معناست که ویژگی ها از بافرهای زیرین مختلف نشات می گیرند. اگر s های VulkanHandle یکسان باشند اما افست ها بزرگ باشند (مثلاً بزرگتر از 100)، ویژگی ها ممکن است همچنان از بافرهای فرعی متفاوتی منشأ بگیرند، اما این نیاز به بررسی بیشتر دارد.

نمای نمایه قاب برای مجموعه ورودی و حالت یک فراخوان ترسیمی که بافر راس محدود را نشان می دهد
شکل 3. مجموعه ورودی برای فراخوانی قرعه کشی، با پانل حالت در سمت راست که نشان می دهد که ویژگی ها در اتصال 0 و 1، موقعیت راس و نرمال، یک بافر زیرین را به اشتراک می گذارند.

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