[CCCP] Monster |
27.03.2016 13:04 |
lYXl, окей, давай посчитаем: в случае обычного инстансинга у нас получается количество drawCalls как количество уникальных объектов * количество лодов для каждого из двух типов возможных объектов в deferred shading (непрозрачных и прозрачных), для каждого рендер-таргета (в том числе тени и прочее), это умножить еще где-то на 4-8. Причем прозрачные и непрозрачные ты даже в forward-rendering все равно сортируешь, потому что, например, растения имеют попиксельную прозрачность, что заставляет перейти с Early-Z на Late-Z, и обратный переход, если ты вызовешь после листвы рендеринг чего-то непрозрачного, это вызовет GPU-stall пока все Late-Z процессы дальше по конвейеру не завершатся.
Но у нас количество самих объектов (например, деревьев), обычно сильно больше, чем всех этих draw-calls вместе взятых, и их надо отсечь из области видимости, поэтому самым тяжелым тут являются не вызовы отрисовки, а отсечение, и именно они делают большинство игр CPU-Bound. В таких случаях каллинг выводят на GPU, и поскольку данные уже оказываются там, использование indirect-вызовов как-то само собой подразумевается. А индиректы хороши тем, что минимизируют необходимый размер стейта для передачи в драйвер, и соответственно, занимают меньше времени.
Единственный оставшийся случай, когда сам по себе draw-call является очень медленным и потому приложение упирается в CPU, это когда у тебя DX9/XNA. Там да, даже с инстансингом все будет плохо.
|