2011-08-23 4 views
3

는 I는 입자가 0XNA 입자 시스템 성능

시스템의 perfomance PC에서 매우 나쁨, 매우 불량까지 점감 알파 값에 기초하여 생성되고 소멸되는 염기성의 SpriteBatch를 이용한 입자 시스템을 중요한 fps가 느려지 기 전에 화면에 약 100 개의 입자가있는 xbox를 사용하여 성능을 향상시키는 방법에 대해 읽었지만 사람들에게 어떻게 적용 할 지에 대한 조언이 있습니다. 예를 들어 입자를 재사용하는 가장 좋은 방법은 무엇입니까? 죽이는 것보다? 각 입자의 이미지 크기가 차이가 있습니까? 내가 각 입자를 회전시키지 않으면 이것이 도움이 될까요?

나는이 제안들 각각을 가지고 놀았지만 중요한 개선점을 얻지 못했다. 누구 에게라도 조언이 있는가? CPU 기반이 아닌 GPP가 될만한 가치가 있는가?

+1

몇 가지 코드를 게시하십시오. 특히 당신의'SpriteBatch' 호출, 특히'Begin'. –

+0

그래서 내 particleengine.cs에서 Draw에 있습니다. particles [index] .Draw (spriteBatch); spriteBatch.Draw (질감, 색상, 회전 크기 ..... 내 내용은 Game1.cs에서 마지막 : 나는 그리기에있는 모든 변수를 호출 particle.cs에서 ParticleEngine.Draw (의 SpriteBatch를) 더 효율적으로 만들 수 있습니까? – Paul

+1

질문을 편집하고 입자'Draw' 및 입자 엔진'Draw' 메서드에 대한 코드를 넣어야합니다. 각 입자에 대한 메서드 호출은 너무 많은 오버 헤드 일 것입니다. –

답변

4

입자를 파괴하고 생성하는 것을 생각하면 성능이 크게 저하됩니다. 입자를 다시 사용하고자 할 수 있습니다.

이미지 크기가 크지 않거나 이미지의 크기가 크지 않으면 성능이 크게 저하됩니다.

활성 입자의 끝까지 죽은 입자를 교환하여 활성 입자 만 처리하는 배열이 있습니다. 예를 들어

:이 도움이

Make an array of MAX particles; 
When you need a particle grab particle_array[count]; 
Increment count. 
When a particle dies, decrement count, swap the particle with particle_array[count]; 
Update only count particles; 

희망.

+0

큰 감사드립니다. ve는 – Paul

1

나는 완전히 아음속의 대답에 동의하지만, 나는 그것을 확장하고 싶었다.

매번 새로운 입자를 생성하고 오래된 입자를 파괴 (또는 폐기)하면 많은 양의 쓰레기가 생성됩니다. C#의 쓰레기 회피, 특히 Xbox의 (가벼운 프레임 워크의 가비지 처리로 인한) 쓰레기 회피라는 말은 결코 업데이트/그리기 루프의 클래스 유형이 new입니다. 항상 수영장으로 미리 만듭니다. Shawn H는 설명합니다 : http://blogs.msdn.com/b/shawnhar/archive/2007/07/02/twin-paths-to-garbage-collector-nirvana.aspx.

여러 가지 텍스처를 사용하면 여러 번의 그리기 호출로 인해 스프라이트 배치가 느려질 수 있습니다. 여러 입자 텍스처를 하나에 병합하고 소스 사각형 SpriteBatch.Draw 매개 변수를 사용하십시오.

+1

에게 고맙다 Aranda - 당신의 followup provi 좀 더 유용한 독서를 위해 ... – Paul