Что убивает ваше выступление - как вы говорите - это ModelMesh.Draw
.Когда вы рисуете модели, это работает следующим образом:
for each frame
for each Model
for each ModelMesh // you call Draw(), which does:
for each ModelMeshPart
for each Effect
for each EffectPass
Draw some triangles // sends a batch of instructions to the GPU
Итак, вопрос: сколько раз каждый кадр вы отправляете серию в GPU?Потому что вы можете отправлять только несколько тысяч * пакетов за кадр, прежде чем загружать процессор - достигнув «предела пакета».(Каждый пакет использует процессорное время в графическом драйвере - он также использует некоторую пропускную способность и время графического процессора, но процессорное время доминирует.)
Вы можете прочитать этот ответ и этот ответ и эту слайд-деку для получения дополнительной информации.
Решение состоит в том, чтобы изменить вашу сцену (например: объединить несколько частей сетки, сделать несколько отбраковок, добавить поддержку создания экземпляров), чтобы уменьшитьколичество пакетов, которые вы отправляете в графический процессор.
Также старайтесь избегать подобных вещей в цикле Draw
и Update
:
Matrix[] transforms = new Matrix[tmpDrawModel.Bones.Count];
Вы должныдействительно старайтесь избегать выделения памяти, которое происходит в каждом кадре, поскольку в конечном итоге это приведет к дорогостоящей сборке мусора и, возможно, к перебоям в частоте кадров (особенно в Xbox).Попробуйте где-то хранить свой буфер и использовать его повторно.