Итак, я делаю вещи с XNA 3.1, и у меня есть много отдельных эффектов, которые применяются через пиксельные шейдеры. Они исходят из разных источников, таких как специальные атаки, окружающая среда и т.д. Проблема, с которой я сталкиваюсь, заключается в том, что я замечаю значительное снижение частоты кадров.
На данный момент я рисую всю сцену в RenderTarget2D, и я применяю все эффекты. Я храню SortedDictionary, содержащий эффекты и их идентификаторы (идентификаторы используются для изменения параметров во время выполнения), и я повторяю его и применяю каждый эффект один за другим:
foreach(KeyValuePair<Ref<int>,Effect> p in renderEffects)
{
Effect r = p.Value;
g.SetRenderTarget(0, MainGame.MainRenderTarget);
//Change RenderTarget to allow code to grab existing texture in the same draw area.
levelDraw = MainGame.LevelRenderTarget.GetTexture();
//Change back to draw back to this texture, allowing render effects to be layered.
g.SetRenderTarget(0, MainGame.LevelRenderTarget);
MainGame.StartDraw(MainGame.GameBatch);
//Starts the sprite batch and sets some parameters
r.Begin();
r.CurrentTechnique.Passes[0].Begin();
MainGame.GameBatch.Draw(levelDraw, new Rectangle(0, 0, levelDraw.Width, levelDraw.Height), Color.White);
r.CurrentTechnique.Passes[0].End();
r.End();
MainGame.GameBatch.End();
}
Теперь это приводит к заметным падениям кадров при нанесении всего 3 эффектов, а при применении 10 оно падает с 60FPS до 16FPS, что, конечно, неприемлемо. Мне интересно, есть ли более эффективный способ сделать это. Учитывая, что у меня есть только одна текстура, я считал, что могу объединить эффекты в один файл и выполнить несколько проходов без захвата текстуры назад. Я не уверен, что это возможно.
Я не совсем уверен, как наилучшим образом это сделать, хотя я полагаю, что должен быть лучший способ, чем то, как я это делаю.