2013-06-10 5 views
0

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

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

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

добавить новую частицу:

 if (isActive) 
     { 
      timeSinceLastEmission += gameTime.ElapsedGameTime.Milliseconds; 

      if (emitterFrequency == 0 || timeSinceLastEmission >= emitterFrequency) 
      { 
       emitterFrequency = emissionInterval; 

       for (int i = 0; i < Math.Round(timeSinceLastEmission/emitterFrequency); i++) 
       { 
        if (particleList.Count < MaxParticles) 
         addParticle(); 
       } 

       timeSinceLastEmission = 0; 
      } 
     } 

раздаточный функцию:

public void draw(SpriteBatch spriteBatch) 
    { 
     spriteBatch.Begin(); 

     for (int i = 0; i < particleList.Count; i++) 
     { 
      spriteBatch.Draw(particleList[i].texture, 
          particleList[i].position, 
          null, 
          particleList[i].color, 
          particleList[i].rotation, 
          particleList[i].origin, 
          particleList[i].textureScale, 
          SpriteEffects.None, 
          0); 
     } 

     spriteBatch.End(); 
    } 

любая помощь будет принята с благодарностью.

+0

Какова ваша эмитент Частота и MaxParticles? –

+0

различны для каждого эффекта, но эффект взрыва составляет 30 частиц и 1.0f, поэтому они все появляются в одно и то же время. – dtothef

ответ

1

Вы должны сделать две вещи:

во-первых, вы должны сделать свой частицы ввести struct вместо class. (я предполагаю, что это так.)

A class выделяет кучную память, и ваш список будет заполнен ссылками на те объекты, которые находятся на куче. Каждый из этих объектов кучи должен управляться сборщиком мусора. Когда у вас много объектов, это очень медленно. (Для слишком manyreasons, чтобы вдаваться в подробности здесь.)

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

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

Во-вторых, вы должны установить List.Capacity до максимального размера вашей системы частиц.

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


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

(Примечание № 2 : «Slow» в этом ответе относится к оптимизации системы частиц, поскольку вы работаете с большим количеством часто обновляемых объектов. Эти операции не являются медленными в общем смысле.)

+0

спасибо, я попробую это. im, используя ту же самую текстуру для всех частиц в минуту, пока она не будет работать правильно. – dtothef