저는 WP7 용 XNA 프레임 워크와 Android 및 iOS 용 Mono를 기반으로 여러 달 동안 크로스 플랫폼 프레임 워크/추상화 계층에서 작업 해 왔습니다. . Android에서 작동하는 대부분의 기능을 보유하고 있으므로 두 플랫폼 모두에서 작동하는 간단한 게임을 만들기 위해 최근에 WP7로 돌아 왔습니다.가로 방향으로 Windows Phone 7의 XNA에서 그래픽 오류가 발생했습니다.
문제는 아주 이상한 그래픽 오류가 발생했습니다. 이 오류는 Windows 기반 XNA 게임에서는 발생하지 않으며 방향이 가로 (기본값 또는 지정됨) 인 경우 WP7에서만 발생합니다. 글리치는 에뮬레이터에는 나타나지만 실제 장치에는 나타나지 않습니다. 테스트를 위해 빨간색 배경에 단일 이미지를 표시하고 있습니다.
윈도우 XNA
Windows http://www.genius-i.com/images/Windows.png
윈도우 폰 7 (세로)
Portait http://www.genius-i.com/images/Portrait.png
윈도우 폰 7 (가로)
,Landscape http://www.genius-i.com/images/Landscape.png
분명히 예상대로 풍경 이미지가 나오지 않습니다. 모두 추상화 레이어를 통해 처리되지만 XNA 플랫폼 파일은 동일하며 대상 플랫폼/프레임 워크 인 Windows와 WP7 버전의 유일한 차이점이 있습니다.
마찬가지로 그래픽 장치와 렌더러에 대한 호출은 동일합니다.
건설 중초기화 동안
device = new Microsoft.Xna.Framework.GraphicsDeviceManager(game);
device.PreferredBackBufferHeight = 480;
device.PreferredBackBufferWidth = 800;
Backend.SupportedOrientations = DisplayOrientation.LandscapeLeft | DisplayOrientation.LandscapeRight;
// Whether or not I set the orientation, the glitchoccurs.
(다양한 종류와 기능에서 추출)
012,355,353,281,112,976,551 도면 중renderer = new SpriteBatch(device.GraphicsDevice);
(다양한 종류와 기능에서 추출)
내가 설명한 것과 같은 그래픽 오류가 발생할 수있는 것에 대해 통찰력을 가진 사람이 있습니까?
도움을 주신 데 대해 감사 드리며 며칠 동안 두 번째 질문으로 인해 죄송합니다.
문제를 식별하는 데 도움하려면 전체 코드, 나는 실제 코드의 좋은 거래를 제시하고있다. 조금 길기 때문에 원래 제외 시켰습니다. 클래스는 대부분의 XNA 기능에 대한 간단한 래퍼입니다.
게임 클래스
public class Game : Microsoft.Xna.Framework.Game, IGame
{
#region Data: Fields
private GraphicsBackendXNA graphics;
private Renderer2DXNA renderer;
ContentLoaderXNA content;
#endregion
#region Data: Properties
public GraphicsBackend Backend { get { return graphics; } }
public Renderer2D Renderer { get { return renderer; } }
public ContentLoader Loader { get { return content; } }
#endregion
#region Methods: Construction
public Game()
{
graphics = new GraphicsBackendXNA(this);
content = new ContentLoaderXNA(this.Services, "Content");
FinaliseConstruction();
}
protected virtual void FinaliseConstruction() { }
#endregion
#region Methods: Initialisation
protected override void Initialize()
{
Core.Console.Initialise(); // Initialised once for error logging.
base.Initialize();
renderer = new RendererXNA(graphics);
Core.Console.Initialise(renderer); // Initialised a second time for graphics services.
Transform.ScreenSize = new Vector2(Backend.ScreenWidth, Backend.ScreenHeight);
Core.Audio.MediaPlayer.Initialise(new Audio.MediaHandler());
Core.Audio.SoundEffect.Initialise(Audio.SoundEffectXNA.SetVolume);
Core.Input.Input.Set(new KeyboardReaderXNA(), new MouseReaderXNA(), new GamePadReaderXNA(), new Input.Touch.TouchPanelXNA(), new GamePadOutputXNA());
Core.Input.InputManager.Initialise();
}
#endregion
#region Methods: Loading and Unloading Content
protected override void UnloadContent()
{
content.Unload();
base.UnloadContent();
}
#endregion
#region Methods: Drawing
protected override void EndDraw()
{
Camera2D.AllOff();
base.EndDraw();
}
#endregion
그래픽 백엔드 클래스
그래픽 백엔드 (XNA) 클래스는 간단한 래퍼 클래스입니다. GraphicsBackend 클래스는 추상적이며 기능이없는 클래스를 확장합니다.
public class GraphicsBackendXNA : GraphicsBackend
{
#region Data: Fields
private Microsoft.Xna.Framework.GraphicsDeviceManager device;
#endregion
#region Data: Properties
public override Display Display { get { return device.GraphicsDevice.PresentationParameters.ToHeron(); } }
public override Core.Graphics.Viewport Viewport { get { return device.GraphicsDevice.Viewport.ToHeron(); } }
public override int ScreenWidth { get { return device.PreferredBackBufferWidth; } set { device.PreferredBackBufferWidth = value; } }
public override int ScreenHeight { get { return device.PreferredBackBufferHeight; } set { device.PreferredBackBufferHeight = value; } }
public override bool IsFullScreen { get { return device.IsFullScreen; } set { device.IsFullScreen = value; } }
public override Core.DisplayOrientation SupportedOrientations
{
get { return ((Core.DisplayOrientation)((int)device.SupportedOrientations); }
set { device.SupportedOrientations = (Microsoft.Xna.Framework.DisplayOrientation)((int)value); }
}
#endregion
#region Methods: Construction
public GraphicsBackendXNA(Microsoft.Xna.Framework.Game game)
{
device = new Microsoft.Xna.Framework.GraphicsDeviceManager(game);
}
#endregion
#region Methods: Settings
public override void ApplyChanges()
{
device.ApplyChanges();
}
#endregion
#region Methods: Rendering
public override void Clear(Colour colour)
{
device.GraphicsDevice.Clear(new Microsoft.Xna.Framework.Color(colour.R, colour.G, colour.B, colour.A));
}
#endregion
#region Methods: Renderer
public override Renderer2D CreateRenderer() { return new Renderer2DXNA(this); }
#endregion
렌더러 2D XNA 클래스
렌더러 2D XNA 클래스는 다른 간단한 래퍼입니다. Renderer2D 기본 클래스를 상속합니다. Renderer2D 기본 클래스는 내용을 그리는 데 필요한 많은 수의 추상 메서드를 구현합니다. 그것은 내가 먼저 세부 사항을 설명 할 몇 가지 매우 기본적인 기능을 가지고 있지만, 나는 모든 빈 방법을 포함하여 신경 쓰지 않을 것이다.
public class Renderer2D : IDisposable
{
private GraphicsBackend backend;
private Matrix currentMatrix;
public virtual GraphicsBackend Backend { get { return backend; } protected set { backend = value; } }
public Matrix CurrentMatrix { get { return currentMatrix; } set { currentMatrix = value; } }
public Renderer2D(GraphicsBackend backend) { this.backend = backend; CurrentMatrix = Matrix.Identity; }
}
public class Renderer2DXNA : Renderer2D
{
#region Static: 1 Pixel Texture
private static Texture2D filler;
private static bool Initialised { get { return filler != null; } }
public static void Initialise(GraphicsBackendXNA backend)
{
filler = CreateFiller(backend)
}
private static Texture2D CreateFiller(GraphicsBackendXNA backend)
{
Texture2D rt = new Texture2D(backend.Device.GraphicsDevice, 1, 1);
rt.SetData<Microsoft.Xna.Framework.Color>(new Microsoft.Xna.Framework.Color[] { Microsoft.Xna.Framework.Color.White });
return rt;
}
#endregion
#region Data: Fields
private SpriteBatch renderer;
#endregion
#region Methods: Construction
public Renderer2DXNA(GraphicsBackendXNA backend) : base(backend)
{
if (!Initialised)
Initialise(backend);
renderer = new SpriteBatch(backend.Device.GraphicsDevice);
}
#endregion
#region Methods: Begin and End
public override void Begin(Core.Graphics.SpriteSortMode sortMode, BlendMode blendMode, Core.Matrix transformMatrix)
{
renderer.Begin(); // Obviously not fully implemented, but simple for now.
}
public override void End() { renderer.End(); }
#endregion
#region Methods: Draw Image
public override void Draw(Image Image, Core.Rectangle Boundary, Core.Rectangle? Source, Colour DrawColour, float RotationRadians, Core.Vector2 Origin, Core.SpriteEffects Effects, float Layer)
{
if (!(Image is ImageXNA))
return;
ImageXNA realImage = Image as ImageXNA;
Microsoft.Xna.Framework.Rectangle finalSource =
Source.HasValue ? Source.Value.ToXNARectangle()
: new Microsoft.Xna.Framework.Rectangle(0, 0, realImage.Width, realImage.Height);
renderer.Draw(
realImage.Texture,
Boundary.ToXNARectangle(),
finalSource,
new Microsoft.Xna.Framework.Color(DrawColour.R, DrawColour.G, DrawColour.B, DrawColour.A),
RotationRadians,
Origin.ToXNAVector2(),
(SpriteEffects)((int)Effects),
Layer);
}
#endregion
}
// I'll leave off string and shape drawing, considering they're not being used here.
당신은 당신이 실제로'GraphicsDeviceManager'를 사용하는 경우 어떻게 볼 수 있을까요 [올바르게] (http://stackoverflow.com/a/11287316/165500)? 생성자에서 원하는 그래픽 설정을 지정해야합니다.'Game'은'Initialize'가 호출되기 전에 장치를 초기화하는 데 사용합니다. 이것이 당신의 문제를 해결할 지 모르겠지만, 그럴 가치는 있습니다. –
모든 그래픽 설정을 생성자로 이동하고 제공된 링크에서 권장하는대로 ApplyChanges에 대한 호출을 삭제했습니다. 불행히도 문제는 지속됩니다. 내가 어딘가에 줄을 채웠다는 것은 분명하지만 전화기의 풍경 설정에서만 발생한다는 것이 매우 이상합니다. 예들 사이에 유일한 변화가있었습니다. 나는 계속보고있을 것이지만, 이러한 특정 상황에서 이러한 종류의 결함을 일으킬 수있는 아이디어는 무엇입니까? (또한 지금까지 도움을 주셔서 감사합니다. 문제가 해결되지 않았지만 어쨌든 좋은 습관입니다.) –
기꺼이 도와 줘서 고맙다고 생각합니다. 문제를 재현하는 데 필요한 최소 코드를 게시 한 코드는 무엇입니까? 단순한 복제 사례로 끓여 주실 수 있습니까? 또한 이것은 하드웨어 나 시뮬레이터 또는 둘 모두에서 발생합니까? –