Як я можу прослідкувати сцену, яка не вписується в пам'ять?


11

Якщо сцена, яку слід відслідковувати, не може бути збережена в пам'яті, то без додавання більшої кількості оперативної пам’яті машині здається нереальним відобразити її в практичний проміжок часу через необхідність завантаження різних частин сцени з диска потенційно кілька разів на піксель .

Чи є спосіб обходити це? Я намагаюся придумати якийсь спосіб виконувати велику кількість обчислень, що включають певний підмножина сцени, відразу, щоб зменшити кількість разів, яку вона потребує завантаження в пам'ять. Чи є якийсь інший спосіб покращення швидкості в такому випадку?

Відповіді:


10

Якщо сцена не повністю вписується в пам'ять, ви входите в поле позаязового візуалізації. Тут по суті є два підходи: а) генеруйте свою сцену на вимогу; b) завантажуйте сцену на вимогу

Колишній підхід добре узгоджується з більшістю робочих процесів анімації, де моделі сильно підрозділяються за допомогою, наприклад, Catmull-Clark, і вони можуть стати дуже об'ємною пам'яттю, але самі базові сітки легко вписуються в пам'ять. Pixar має декілька робіт з цього приводу (наприклад, диференціали проміння та керування геометрією багатороздільної здатності для відстеження траєкторії променів у складних сценах ), але суть у тому, що моделі поділяються лише тоді, коли вони потрапляють під промінь, і лише підрозділяються стільки, скільки є розумний для такого променя (наприклад, дифузне взаємовідбиття потребує меншої точності, ніж дзеркальне відображення). Решта обробляється кешом геометрії, який зберігає підрозділені моделі в пам’яті і сподіваємось, що це робить процес ефективним завдяки гарній стратегії виселення.

Поки всі ваші базові сітки зручно вписуються в пам'ять, ви можете легко виходити з ядра та виводити сітки на рівні підрозділу, які ніколи не впишуться в пам'ять. Кеш-пам'ять геометрії також гарно масштабується з об’ємом пам'яті, що дозволяє вам зважувати оперативну пам'ять проти часу рендерінгу. Це було використано і в Автомобілі, які я вірю.

Другий підхід більш загальний і не покладається на велике використання підрозділу. Натомість він покладається на те, що вашу сцену, швидше за все, створив художник і вже розбивається на досить невеликі об'єкти, які вписуються в пам'ять індивідуально. Тоді ідея полягає в тому, щоб зберегти дві ієрархії (kD-дерево або обмежувальну ієрархію томів): ієрархію верхнього рівня, що зберігає лише обмежуючі поля об'єктів у вашій сцені, і ієрархію низького рівня, що зберігає фактичну геометрію. Для кожного об'єкта існує одна така ієрархія низького рівня.

При такому підході ви в ідеалі вже зберігаєте обмежувальне поле разом із кожним об'єктом на диску. Під час завантаження сцени ви спочатку будуєте лише ієрархію верхнього рівня, тобто ви повинні дивитись лише на обмежувальні поля, а не на геометрію. Потім ви починаєте відстежувати промені і проходити їх по ієрархії. Щоразу, коли промінь потрапляє у вузол листків в ієрархії верхнього рівня (тобто він потрапляє в обмежувальне поле об'єкта), цей об'єкт завантажується в пам'ять і будується його низька рівень ієрархії. Потім промінь продовжує шукати цей об’єкт. У поєднанні з об'єктом кеша, який зберігає якомога більше ієрархії низького рівня в пам'яті, це може працювати досить добре.

Перша перевага такого підходу полягає в тому, що об'єкти, які ніколи не потрапляють, ніколи не завантажуються, це означає, що він автоматично адаптується до видимості у вашій сцені. Друга перевага полягає в тому, що якщо ви відстежуєте багато променів, вам не доведеться негайно завантажувати предмет, коли він потрапляє променем; натомість ви можете утримувати цей промінь і чекати, поки достатньо променів потрапить на цей об’єкт, амортизуючи навантаження за кілька ударів променів.

Ви також можете поєднати такий підхід з алгоритмом сортування променів, таким як сортування відкладеного затінення для відстеження виробничого шляху, щоб уникнути лущення через некогерентних променів. Згаданий документ описує архітектуру рендерера Hyperion Disney, що використовується для Big Hero 6, я вважаю, тому він, швидше за все, може обробляти сцени в масштабах виробництва.


1
Це супер цікаво! Так само з паперами Діснея, яку ви зв'язали.
Джон Calsbeek

+1 Стільки відповідей на речі, про які я завжди дивувався!
Ротем

7

Якщо ви організовуєте свою сцену в просторовій структурі (звичайний спосіб є ієрархією обмежувального обсягу ), ви можете використовувати якусь віртуальну сцену (я складаю цей термін, посилаючись на віртуальні текстури ).

Менеджер пам’яті зберігає лише обмежену кількість обмежених коробок, завантажених за один раз, і абстрагує операцію, що полягає у виведенні одного.

Таким чином, ящик завантажуватиметься лише за необхідності: коли промінь потрапляє в обмежувальний ящик, він завантажується для вирішення зіткнення. Пізніше, коли потрібно завантажити інший ящик, невикористаний видаляється, щоб звільнити місце для нового.

Коли всі ці скриньки завантажуються та видаляються, когерентність променів була б головним фактором швидкості. Я думаю, що подальшим вдосконаленням може стати відкладення завантаження, перенастроювання променів, щоб обробити спочатку вже завантажені ящики.


Так, щось подібне.
joojaa

1

Що ви робите, це завантажувати трикутники в пам'ять з диска на основі того, що було раніше потрапляло. Почати можна спочатку з трикутників у безпосередній близькості. Аргументація полягає в тому, що в одній області промені, ймовірно, повторно потрапляють у ті самі трикутники. І з часом ви будете дещо ефективними. (З цієї причини, це гарна ідея кешувати останній трикутник у відстеженні оклюзії, який не піклується про порядок)

По-друге, ви зберігаєте трикутники в просторовому дереві, що дозволяє швидко шукати з диска, щоб відновити, які частини ви маєте в пам'яті за близькістю. Тому завантажуйте лише гілки, які будуть на шляху променя. Якщо це якесь дерево вокселів, як октрис, ви можете навіть сортувати вторинні промені та вирішувати їх за згодою. Дерево БСП також дещо добре в обрізку ділянок.

Є випадки, коли це не вдається, але його досить ефективно в більшості відра сцени, якщо ваш звук не видає ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.