Итак, я работаю с 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, что конечно неприемлемо. Мне интересно, есть ли более эффективный способ сделать это. Учитывая, что у меня есть только одна текстура, я подумал, что смогу объединить эффекты в один файл и выполнить несколько проходов, не забирая текстуру обратно. Однако я не уверен, что это возможно.
Я не совсем уверен, как лучше всего это сделать, хотя я полагаю, что должен быть лучший способ, чем то, как я это делаю.