문제

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.매우 작고 전달/접속/등이 매우 저렴합니다.)

다른 팁

이 질문에 비축 된 경우 아마도 멋지고 일반적인 해결책을보고 있었을 것입니다.나는 당신이 이것을 보는 것을 제안 할 것이라고 제안 할 것입니다 :

https://gamedev.stackexchange.com/questions/14217/several-classes-need-to-access-the-same-data-where-should-the-data-be-declared/14232#14232.

이 질문을 바로 잡을 필요가 있습니다. "이기 때문에 가장 좋은 방법은 인수로 전달하는 것입니다. 다른 것들은 복잡 해지는 것입니다."은 단순히 정확하지 않습니다 입니다.

개인적으로 나는 이제 게임베이스 클래스에서 이렇게하고 있습니다 :

    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 - 좋은 조언이 많아요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top