-
Имеется (будет иметься) механизм снижения количества DIP-ов. Интерфейс взаимодействия сводится к одной функции типа: Vertex* AllocQuads(Texture, QuadsCount), возвращаят указатель на память, которую нужно заполнить вершинными данными.
Если Texture отличается от текущей текстуры - то прорисовать заполненный буффер.
Вариантов реализации несколько.
1) Lock() всего буфера -> частичное заполнение -> UnLock() -> DIP
2) Заполнять свой буфер в ОЗУ -> Lock() части буфера -> копирование из ОЗУ-буфера -> UnLock() -> DIP
3) Заполнять свой буфер в ОЗУ -> DrawPrimitiveUp (или как там)
4) Разбить буфер на "сегменты"... пока 1 сегмент рисуется - второй заполняется
5) Организовать "цепочку записи/чтения". Т.е. если сейчас рисуются квады с 0 по 99, то я могу заполнять квады 100..SIZE... Lock()/UnLock(), "возврат каретки"... в общем, механизм, похожий на Stream-проигрывание музыки.
...
Сложно сказать, на сколько квадов в DIP-е расчитано. Может по 5-10, а может и 2000 (частицы). Буфер надо создавать с флагом WriteOnly - чтобы увеличить скорость работы. (кстати, в таком случае возможно читать из памяти?)
Вопрос, возможно, упирается в вопрос "насколько затратно лочить/разлочивать весь буфер".
У кого какие соображения ?
|