XNA 추첨 :전체 게임에서 하나의 스프라이트 배치 사용
-
13-12-2019 - |
문제
XNA 게임을 개발 중입니다.이번에는 건축에 대해 주의 깊게 살펴보겠습니다.오늘까지 저는 항상 다음과 같은 방식으로 나만의 그리기 방법을 구현해 왔습니다.
public void Draw(SpriteBatch sb, GameTime gameTime)
{
sb.Begin();
// ... to draw ...
sb.End();
}
저는 DrawableGameComponent를 조사하다가 Draw 메서드가 다음과 같은 방식으로 제공되는 것을 보았습니다.
public void Draw(GameTime gameTime)
{
// ...
}
우선, SpriteBatch는 Begin과 End 사이에 많은 Texture2D를 수집할 수 있으므로 이를 정렬하거나 동일한 효과로 그리는 것이 유용할 수 있다는 것을 알고 있습니다.
내 질문은 SpriteBatch를 전달하는 성능과 비용에 관한 것입니다.DrawableGameComponent에서는 해당 스프라이트 배치가 공개된 경우 게임 개체의 스프라이트 배치를 호출할 수 있습니다.
제안된 것은 무엇이며, xna-game 프로그래머는 무엇을 해야 합니까?
조언 감사드립니다.
해결책
의 심각한 단점 중 하나는 DrawableGameComponent
제공된 메소드 서명에 갇혀 있다는 것입니다.그 자체로는 "잘못"이 없지만 DrawableGameComponent
, 그것을 "라고 생각하지 마십시오.하나의 진정한 아키텍처".당신은 더 나아졌어 가능한 예라고 생각하면 된다 건축학.
만약 당신이 시험을 통과해야 한다고 생각한다면 SpriteBatch
(또는 다른 것) "게임 구성 요소"의 그리기 방법 - 가장 좋은 방법 ~이다 인수로 전달하려면.다른 것은 복잡합니다.
분명히 이는 제공된 XNA를 사용할 수 없음을 의미합니다. GameComponent
시스템이며 스스로 대안을 만들어야 합니다.그러나 이것은 거의 사소한 일입니다.가장 기본적인 수준에서는 적절한 가상 메서드가 있는 일부 기본 유형의 목록일 뿐입니다.
물론 꼭 사용해야 한다면 GameComponent
- 또는 게임이 너무 단순하거나(예:프로토타입) 아키텍처에 별로 신경 쓰지 않는 경우 - 기본적으로 사용할 수 있습니다. 어느 당신이 얻고 싶은 방법 SpriteBatch
당신의 그리기 방법에.그들은 모두 단점이 있습니다.
아마도 다음으로 가장 아키텍처적으로 강력한 방법은 다음을 통과하는 것입니다. SpriteBatch
인스턴스를 각 구성 요소의 생성자에 추가합니다.이렇게 하면 구성 요소가 게임 클래스에서 분리된 상태로 유지됩니다.
반면에 건축물을 바람에 날려버리고 싶다면, MyGame.spriteBatch
필드 public static
.이는 어디에서나 액세스할 수 있는 가장 간단한 방법입니다.구현하기 쉽고 나중에 필요할 때/필요할 때 쉽게 정리할 수 있습니다.
성능에 대한 질문에 대답하려면:합격과 관련된 모든 것 SpriteBatch
성능에 거의 영향을 미치지 않습니다(호출 순서 제공). Draw
/Begin
/End
동일하게 유지됩니다).걱정하지 마세요.
(네가 본다면 SpriteBatch whatever
코드에서는 참조를 나타냅니다.참조는 32비트 값입니다(모든 XNA 게임이 있는 32비트 프로그램에서).그거랑 크기가 똑같아 int
또는 float
.매우 작고 전달/접속/등이 매우 저렴합니다.)
다른 팁
이 질문에 비축 된 경우 아마도 멋지고 일반적인 해결책을보고 있었을 것입니다.나는 당신이 이것을 보는 것을 제안 할 것이라고 제안 할 것입니다 :
이 질문을 바로 잡을 필요가 있습니다. "이기 때문에 가장 좋은 방법은 인수로 전달하는 것입니다. 다른 것들은 복잡 해지는 것입니다."은 단순히 정확하지 않습니다 입니다.
개인적으로 나는 이제 게임베이스 클래스에서 이렇게하고 있습니다 :
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
SpriteBatch = new SpriteBatch(GraphicsDevice);
this.Services.AddService(typeof(SpriteBatch), SpriteBatch);
}
.
이제 게임 클래스의 초기화 방법에 DrawableGameComponents를 추가하기 때문에
를 호출 할 수 있습니다. this.Game.Services.GetService(typeof(SpriteBatch))
.
문제를 해결하기위한 가장 깨끗한 접근 방식이라고 말하고 싶습니다.
만약 DrawableGameComponent
부모의 일부가 되어야 합니다. SpriteBatch
, 그런 다음 생성자를 통해 전달하고 전용 멤버에 저장합니다(또는 원하는 경우 속성으로 노출).
또한 SpriteBatch
당신의 재산으로 Game
당신이 제안한 것처럼 원하면 수업을 들을 수 있지만, 당신이 참고할 때마다 this.Game
, 특정 항목으로 캐스팅해야 합니다. Game
수업 종류.
((MyGame)this.Game).SpriteBatch.Draw(...)
아니면 그냥 가질 수도 있습니다 DrawableGameComponent
새로 만들기 SpriteBatch
.(내가 본 바로는) 아무 문제가 없습니다.몇개냐에 따라 다른거 같은데 DrawableGameComponent
당신이 만들게 될 항목과 빈도.
또한 검색하다 DrawableGameComponent
- 좋은 조언이 많아요.