Прежде всего, я предполагаю, что под «вызовами отрисовки» вы подразумеваете команду, которая указывает графическому процессору визуализировать определенный набор вершин в виде треугольников с определенным состоянием (шейдеры, состояние смешивания и т. Д.).
Вызовы на розыгрыш не обязательно дороги.В более старых версиях Direct3D для многих вызовов требовалось переключение контекста, что было дорого, но в новых версиях это не так.
Основная причина сделать меньше вызовов отрисовки в том, что графическое оборудование может преобразовыватьсяи рендеринг треугольников намного быстрее, чем вы можете их отправить. Если вы отправите несколько треугольников с каждым вызовом, вы будете полностью связаны процессором, а графический процессор будет в основном бездействующим.Процессор не сможет загружать GPU достаточно быстро.
Выполнение одного вызова отрисовки с двумя треугольниками обходится дешево, но если вы отправляете слишком мало данных с каждым вызовом, вам не хватит процессорного времениотправить столько геометрии в графический процессор, сколько вы могли бы.
Реализация вызовов отрисовки сопряжена с некоторыми реальными затратами, для этого необходимо настроить группу состояний (какой набор вершин использовать, какой шейдер использовать ии т. д.), а изменения состояния имеют стоимость как на стороне оборудования (обновление группы регистров), так и на стороне драйвера (проверка и перевод ваших вызовов, которые устанавливают состояние).
Но основнойСтоимость вызовов на отрисовку применяется только в том случае, если каждый вызов передает слишком мало данных , поскольку это приведет к тому, что вы будете привязаны к процессору, и не сможете полностью использовать оборудование.
Точно так же, как сказал Джош, отрисовка вызововтакже может привести к сбросу буфера команд, но по моему опыту это обычно происходит при вызове SwapBuffers, а не при отправке геометрии.Драйверы видео, как правило, пытаются буферизовать столько, сколько могут (несколько кадров иногда!), Чтобы выжать как можно больше параллелизма из графического процессора.
Вы должны прочитать презентацию nVidia Batch Batch Batch! , он довольно старый, но охватывает именно эту тему.