Оптимизация игры XNA 2D

Имеет ли смысл реализовать логику, чтобы пропускать объекты рендеринга вне области просмотра, или мне это не нужно, и пусть Framework делает это?

56 голосов | спросил smnbss 4 MaramFri, 04 Mar 2011 01:24:45 +03002011-03-04T01:24:45+03:0001 2011, 01:24:45

3 ответа


79

Culling - это оптимизация производительности. Поэтому не имеет смысла просто делать это только ради этого. У вас должна быть причина.


Графический процессор (а не XNA Framework) отбирает треугольники и пиксели с невероятно быстрой скоростью. Каждый треугольник, который вы отправляете, должен быть преобразован (через ваш вершинный шейдер). Затем он отбирает те, которые выходят за пределы экрана. Затем он заполняет оставшиеся треугольники, отбраковывая пиксели, которые находятся за пределами экрана. Остальные пиксели затем выводятся в задний буфер (через ваш пиксельный шейдер).

(Когда я говорю «тогда» - он на самом деле делает все это в массивном параллельном конвейере.)

Так что очень редко и необычно, что вам, возможно, придется отбирать отдельные треугольники. Чтобы попасть в пределы вершин, вы должны рисовать абсурдно большое количество треугольников. Чтобы достичь ограничений по заполнению, текстуре или выборке пикселей, вам, как правило, необходимо иметь сложность с глубиной (в этом случае выборка видового экрана /усечения не поможет).


Таким образом, обычно нет или нет затрат на геометрию вне экрана.

Стоимость - особенно в контексте рисования «объектов» (обычно трехмерных объектов) - фактически при отправке этих объектов на GPU в первую очередь . Отправляйте слишком много объектов, и вы нажимаете на ваш лимит партии (вы получаете несколько тысяч * для каждого кадра).

Я рекомендую прочитать этот ответ и этот связанный слайд-панель для подробное описание партий.

Из-за этого, если вы выполняете отсев, вы можете уменьшить количество партий, отправляемых на GPU. Если вы ограничены партиями - это может привести вас к пределу.


Теперь - ваш вопрос о 2D XNA - так предположительно вы используете SpriteBatch . Это немного отличается.

Не случайно, что он называется «Sprite Batch ». То, что он делает, это взять спрайты, которые вы рисуете, и делать все возможное, чтобы отправить эти спрайты на графический процессор в как можно меньше партий , объединив их вместе.

Но SpriteBatch будет вынужден запустить новую партию, если:

  • Вы рисуете больше спрайтов, чем может вписаться в одну партию (2048 спрайтов в XNA 4)
  • Вы меняете текстуру (вот почему есть опция сортировки по текстуре)

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

Теперь - если вы рисуете с достаточным количеством текстурных свопов, чтобы взять вас за лимит партии, и , многие из них на самом деле вне экрана и , отбраковывая их, вы получите под лимитом партии. Тогда да - отбраковка - это оптимизация, которая будет работать.

Однако - лучшая оптимизация в этом случае заключается в использовании текстурных атласов (aka: sprite sheets). Это позволяет уменьшить количество текстурных свопов и, следовательно, партий - независимо от того, что находится на экране или выключено. (Это основная причина, по которой вы можете указать исходный прямоугольник для спрайтов.)


(Как всегда: это советы по оптимизации производительности, поэтому вы должны измерять и понимать собственную производительность своей игры и какие ограничения вы нажимаете, прежде чем тратить усилия на добавление оптимизаций.)

ответил Andrew Russell 4 MaramFri, 04 Mar 2011 06:06:16 +03002011-03-04T06:06:16+03:0006 2011, 06:06:16
13

Согласно сообщению на форумах в MSDN, инфраструктура XNA не выполняет выборку:

  

Рамка XNA не будет делать уловки для вас - это не могло быть связано с тем, что она не имеет понятия, где что-то на самом деле закончится. Все преобразования выполняются на графическом процессоре и могут быть настраиваемым шейдером.

http://xboxforums.create.msdn.com/forums/p /22763 /121897.aspx

В этом сообщении говорится, что, если у вас много объектов в вашей сцене, возможно, стоит потратить на себя.

ответил Nate 4 MaramFri, 04 Mar 2011 01:40:07 +03002011-03-04T01:40:07+03:0001 2011, 01:40:07
1

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

XNA Профиль HiDef (не Reach) имеет класс OcclusionQuery, который используется для выполнения Occlusion Culling. Окклюзия Culling удаляет эти квадратики из окна просмотра, которые скрыты от просмотра другими квадратиками.

Что-то еще, что вы должны учитывать, - это раздельное создание и тесселяция.

Итак, когда вы приближаетесь к очень большому количеству квадратиков в каждом преобразованном фрейме, вам нужно тщательно подумать о том, как вы можете применять методы отбора и потоковой обработки для поддержания частоты кадров, уменьшая трафик до gpu шейдеры.

ответил Jason Coombes 15 FebruaryEurope/MoscowbFri, 15 Feb 2013 16:53:32 +0400000000pmFri, 15 Feb 2013 16:53:32 +040013 2013, 16:53:32

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132