SetVertexBuffer
должен быть самым быстрым способом назначения вершинных данных, поскольку этот метод напрямую обращается к API DirectX 9.
Насколько я знаю (работа с DX11), нет другого способа присвоения данных вершины.Даже когда вы вызываете DrawUserPrimitives
или DrawUserIndexedPrimitives
, буфер создается и затем отправляется на устройство.Разница здесь в том, что этот буфер будет создаваться для каждого вызова отрисовки, поскольку вы могли бы изменить данные в это время, поэтому он должен быть еще медленнее.
Убедитесь, что на самом деле медленный вызов SetVertexBufferвниз ваше приложение.Если это так, возможно, вы просто отправляете много данных на устройство, что должно занять некоторое время.Но я не могу сказать без кода.
Многие отдельные вызовы SetVertexBuffer
на самом деле замедляют работу приложения.И отправка двух буферов на устройство, скорее всего, будет медленнее, чем один буфер, содержащий объединенные данные.Несколько советов:
- Уменьшите общее количество буферов.Используйте смещения индексов и вершин для рисования только определенных сегментов буфера.
- Избегайте слишком большого количества переключений между буферами.(Это общее руководство для всего, что вы отправляете на устройство. Избегайте изменения состояния.)
- По возможности используйте статические буферы.
- Если вам действительно нужны динамические сетки, попробуйте отделить их отстатические данные для оптимизированного кэширования. (Кредиты A-Type, см. Комментарии)
Но, как всегда, производительность в 3D-приложениях - нечеткая тема.Вскоре могут появиться другие узкие места (шейдеры, текстуры и т. Д.), И вам, возможно, придется нарушить приведенные выше рекомендации.