Разделенный на сегменты буфер вершин
Рисунок 14.1. Разделенный на сегменты буфер вершин
Теперь создайте глобальную переменную i= 0 для отслеживания того, с каким сегментом мы работаем.
Для каждого кадра:
Обновите все частицы.
Пока не будут визуализированы все живые частицы:
Если буфер вершин не заполнен, то:
Блокируем сегмент i с флагом D3DLOCK_NOOVERWRITE.
Копируем 500 частиц в сегмент i.
Если буфер вершин заполнен, то:
Возвращаемся к началу буфера вершин: i = 0.
Блокируем сегмент i с флагом D3DLOCK_DISCARD.
Копируем 500 частиц в сегмент i.
Визуализируем сегмент i.
Переходим к следующему сегменту: i++
ПРИМЕЧАНИЕ
Это очень упрощенное описание, но оно иллюстрирует идею. Предполагается, что у нас всегда есть 500 частиц, чтобы заполнить целый сегмент, хотя в действительности это условие не выполняется потому что мы постоянно создаем и уничтожаем частицы и их количество меняется от кадра к кадру. Предположим, что у нас осталось только 200 частиц для копирования и визуализации в текущем кадре. Поскольку 200 частиц недостаточно для заполнения буфера вершин, в коде мы обрабатываем такой сценарий как особый случай. Данный сценарий может иметь место только в том случае, когда в текущем кадре заполняется последний сегмент. Если сегмент не последний, это значит что у нас есть по крайней мере 500 частиц для перехода к следующему сегменту. |
ПРИМЕЧАНИЕ
Вспомните, что наш буфер вершин динамический, и поэтому мы можем пользоваться преимуществами, предоставляемыми флагами динамической блокировки D3DLOCK_NOOVERWRITE и D3DLOCK_DISCARD. Эти флаги позволяют блокировать часть буфера вершин, которая не визуализируется, в то время как остальные части буфера вершин будут продолжать визуализироваться. Например, предположим, что мы визуализируем сегмент 0; используя флаг D3DLOCK_NOOVERWRITE мы можем заблокировать и заполнить сегмент 1 в то время, когда визуализируется сегмент 0. Это позволяет предотвратить простои визуализации, которые возникали бы в ином случае. |
Содержание Назад Вперед