Как мне оптимизировать рисование большого, динамического количества наборов вершин? - PullRequest
1 голос
/ 18 сентября 2011

... или я даже схожу с ума, чтобы даже попробовать?

Как новичок в использовании голых вершин для трехмерной графики, я никогда раньше не работал с буферами вершин и тому подобным. Я предполагаю, что мне следует использовать динамический буфер, потому что моя игра имеет дело с манипулированием, добавлением и удалением примитивов. Но как мне это сделать?

Пока я храню свои индексы в классе Triangle.cs. Треугольники хранятся в четырехугольниках (которые содержат вершины, соответствующие их индексам), квадроциклы хранятся в блоках. В моем методе рисования я перебираю каждый блок, каждый квад в каждом блоке и, наконец, каждый треугольник, применяю соответствующую текстуру к моему эффекту, затем вызываю DrawUserIndexedPrimitives, чтобы нарисовать вершины, хранящиеся в треугольнике.

Я бы хотел использовать буфер вершин, потому что этот метод не поддерживает масштаб, для которого я собираюсь. Я предполагаю, что это будет динамичным. Поскольку мои вершины и индексы хранятся в коллекции отдельных классов, могу ли я по-прежнему эффективно использовать буфер? Глупо ли использовать отдельные буферы для каждого четырехугольника? Возможно ли и эффективно ли мне выгрузить вершины в буфер при первом рисовании квадрата, а затем сохранить, где были эти вершины, чтобы я мог применить это смещение к индексам этого треугольника для последовательных отрисовок? Есть ли реальный способ обработки удаления вершин из буфера в этом сценарии (возможно, основанное на событиях смещение индексов в треугольниках)?

Я прошу прощения, что эти вопросы могут быть либо слишком новыми, либо слишком запутанными / расплывчатыми. Я был бы рад предоставить разъяснения. Но, как я уже сказал, я новичок в этом и, возможно, даже не знаю, о чем говорю ...

1 Ответ

2 голосов
/ 18 сентября 2011

Я не могу точно сказать, что вы пытаетесь сделать, но использование отдельного буфера для каждого четырехугольника очень глупо.

Золотое правило в графическом программировании - партия, партия, партия.Это означает, что для упаковки как можно большего количества материала в один вызов DrawUserIndexedPrimitives ваша видеокарта полюбит вас за это.

В вашем случае поместите все свои вершины и индикаторы в один буфер вершин и индексный буфер (вывозможно, потребуется использовать больше, я понятия не имею, сколько вершин мы говорим).Всякий раз, когда пользователь меняет один из приматов, восстанавливает весь буфер.Если у вас действительно много примативов, разделите их на несколько буферов и включите только те, которые вам нужны, когда пользователь что-то меняет.

Самое главное - минимизировать количество вызовов DrawUserIndexedPrimitives,эти вещи имеют много накладных расходов, вы можете легко сделать вашу игру в 20 раз быстрее.Видеокарты - это конвейеры, им нравится получать большой кусок данных, чтобы они могли их съесть.То, что вы делаете, давая ему один треугольник за раз, похоже на то, как вынуждаете крупный автомобильный завод производить только одну машину за раз.Там, где они не могут начать строить следующую машину, пока не закончится последняя.

В любом случае, удачи, и не стесняйтесь задавать любые вопросы.

...