2011-08-02 9 views
0

여름 프로젝트로 JRPG/던전 크롤러를 개발하려고하고 있으며 코드 작성 중입니다. 전투 중에는 "헬스 바"가 존재하며 헬스 바 하나는 각 캐릭터에 대해 그려야하는 3 개의 직사각형으로 구성됩니다 (상황에 따라 총 2 ~ 8 문자는 한 번에 최대 24 개의 힐바 사각형을 의미 함).xna에서 텍스쳐로 직사각형을 그리는 여러 가지 방법의 성능 차이는 무엇입니까?

내 치유 방법을 그리는 나의 오래된 방법은 하나의 픽셀을 에서 가져 와서 직사각형 모양의 영역을 그려 넣는 1 텍스처를 기반으로했습니다. 기본적으로 "HealtBar"텍스처를 컬러 팔레트로 사용했습니다 ... 예를 들어 소스 사각형이 (0, 0, 1, 1) 인 경우 검정 직사각형을 그립니다.

Texture2D mHealthBar; 
mHealthBar = theContentManager.Load<Texture2D>("HealthBar"); 

public override void Draw(SpriteBatch theSpriteBatch) 
     { 
      //draw healtbar 
      theSpriteBatch.Draw(mHealthBar, new Rectangle((int)Position.X+5, 
      (int)(Position.Y - 20), (MaxHealth * 5)+7, 15), 
      new Rectangle(0, 0, 1, 1), Color.Black); 

      theSpriteBatch.Draw(mHealthBar, new Rectangle((int)(Position.X + 8), 
      (int)(Position.Y - 17), ((MaxHealth * 5)), (mHealthBar.Height) - 2), 
      new Rectangle(2, 2, 1, 1), Color.White); 

      theSpriteBatch.Draw(mHealthBar, new Rectangle((int)(Position.X + 8), 
      (int)(Position.Y - 17), ((Health * 5)), (mHealthBar.Height) - 2), 
      new Rectangle(3, 2, 1, 1), Color.Red); 
     } 

이 좋은 찾고 해결책을 아닌가요 ... 그래서 대신 내가 코드의 양을 줄이고 코드 선명도의 양을 증가시킬 것이다 추상 클래스를 만들려고. 나는 "mHealthBar"변수를 버리고 더 좋은 찾고 코드 방식으로 사각형을 그릴 수있는 새로운 서랍 클래스와

abstract class Drawer 
{ 
    static private Texture2D _empty_texture; 

    static public void DrawRect(SpriteBatch batch, Color color, Rectangle rect) 
    { 
     _empty_texture = new Texture2D(batch.GraphicsDevice, 1, 1); 
     _empty_texture.SetData(new[] { Color.White }); 

     batch.Draw(_empty_texture, rect, color); 
    } 
} 

. 그러나 프레임 속도 문제가 발생하기 시작한 새로운 방법을 사용하기 시작했을 때 이전 방식은 부드러 웠습니다 ... 프레임 속도 문제의 원인은 무엇입니까?

 Drawer.DrawRect(theSpriteBatch, Color.Black, new Rectangle((int)Position.X+5, 
     (int)(Position.Y - 20), (MaxHealth * 5)+7, 15)); 

     Drawer.DrawRect(theSpriteBatch, Color.White, new Rectangle((int)(Position.X + 8), 
     (int)(Position.Y - 17), (MaxHealth * 5), 9)); 

     Drawer.DrawRect(theSpriteBatch, Color.Red, new Rectangle((int)(Position.X + 8), 
     (int)(Position.Y - 17), (Health * 5), 9)); 

답변

1

문제는 그릴 때마다 새로운 질감을 만들고 색상을 설정한다는 것입니다.

해야 할 일은 한 번만 (다른 콘텐츠를로드 할 때) 텍스처를 만듭니다.

+0

큰 감사, 그것은 문제를 해결했습니다. – Olle89