Сколько (низкополигональных) моделей может обрабатывать XNA? - PullRequest
6 голосов
/ 11 марта 2011

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

У меня модель с низким поли (в ней 18 граней и 14 вершин)), что я пытаюсь нарисовать на экране (высокое!) количество раз.Я получаю более 60 кадров в секунду (на приличной машине), пока не начну рисовать эту модель 5000+ раз.Я спрашиваю слишком много здесь?Я бы очень хотел удвоить или утроить это число (10-15k) как минимум.

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

Примечание: tile.Offset вычисляется один раз во время инициализации, а не каждый цикл.

foreach (var tile in Tiles)
        {
            var myModel = tile.Model;
            Matrix[] transforms = new Matrix[myModel.Bones.Count];
            myModel.CopyAbsoluteBoneTransformsTo(transforms);

            foreach (ModelMesh mesh in myModel.Meshes)
            {
                foreach (BasicEffect effect in mesh.Effects)
                {
                    // effect.EnableDefaultLighting();
                    effect.World = transforms[mesh.ParentBone.Index] 
                                 * Matrix.CreateTranslation(tile.Offset);
                    effect.View = CameraManager.ViewMatrix;
                    effect.Projection = CameraManager.ProjectionMatrix;
                }
                mesh.Draw();
            }
        }

Ответы [ 2 ]

15 голосов
/ 11 марта 2011

Вы совершенно четко достигли ограничения партии . См. эту презентацию и этот ответ и этот ответ для получения подробной информации. Проще говоря: существует ограничение на количество вызовов отрисовки, которые вы можете отправлять в графический процессор каждую секунду.

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

(И важно отметить, что, наоборот, вы почти наверняка не достигнете ограничений GPU. Не нужно пока беспокоиться о сложности сетки.)

Есть несколько способов уменьшить количество партий. Отбраковка Frustrum одна. Вероятно, лучшим вариантом для продолжения в вашем случае является Геометрия Instancing , это позволяет вам рисовать несколько моделей в одном пакете. Вот пример XNA , который делает это.

Еще лучше, если это статическая геометрия, можете ли вы просто испечь все это в одну или несколько больших сеток?

3 голосов
/ 11 марта 2011

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

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

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

Примечание: GPU работает лучше всего, когда вы отправляете большие операции относительно редко.Ваш код более или менее противоположен - отправляет огромное количество очень маленьких запросов на рисование.Вы должны иметь возможность пакетировать свои примитивы и получить лучшую производительность.Существуют примеры того, как визуализировать большое количество простых объектов (включая объекты в DirectX SDK), поиск «толпы рендеринга gpu» может дать вам отправную точку.

...