0

我一直在为 Windows 10/Windows Phone (10) 开发 UWP/UWA 游戏,并且一直在期待 Xbox One 的开发模式。我很高兴今天听到开发模式的发布,迫不及待地想回家并在我的 Xbox 上进行测试。

我的应用程序/游戏运行良好,除了被裁剪的绘制区域(“titlesafe/tv safe”区域之外的外边缘)之外,我还没有遇到任何错误。

我正在使用 Win2D CanvasSwapChain 和通用 CoreWindow。

我觉得我可以用 MyCoreWindow 或 MyViewSource 做一些事情来缓解这个问题,但还没有找到答案。此时可能是睡眠不足,但我希望答案或指向它的箭头会对我自己和未来的寻求者有很大帮助。

我宁愿不使用 xaml。

这是我的查看代码。

using Windows.ApplicationModel.Core;          
class MyViewSource : IFrameworkViewSource
{
    public IFrameworkView CreateView()
    {
        return new MyCoreWindow();
    }
}

这是 MyCoreWindow

class MyCoreWindow : IFrameworkView
{
    private IGameSurface _surface;
    private Engine _gameEngine;

    public void Initialize(CoreApplicationView applicationView)
    {
        applicationView.Activated += applicationView_Activated;
        CoreApplication.Suspending += CoreApplication_Suspending;
        CoreApplication.Resuming += CoreApplication_Resuming;
    }

    private void CoreApplication_Resuming(object sender, object e)
    {
        _surface.Resume(sender, e);
    }

    private void CoreApplication_Suspending(object sender, SuspendingEventArgs e)
    {
        _surface.Suspend(sender, e);
    }

    private void applicationView_Activated(CoreApplicationView sender, IActivatedEventArgs args)
    {
        Windows.UI.Core.CoreWindow.GetForCurrentThread().Activate();
    }

    public void Load(string entryPoint)
    {
        _surface.Load(entryPoint);
    }

    public void Run()
    {
        while (_gameEngine.IsRunning)
        {
            Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher.ProcessEvents(CoreProcessEventsOption.ProcessAllIfPresent);
            _surface.Update();
            _surface.Draw();
        }
    }

    public void SetWindow(Windows.UI.Core.CoreWindow window)
    {
        _surface = new Surface(window);
        _surface.SetFrameRate(60);
        _surface.SetUpdateRate(100);

        _gameEngine = new Engine(_surface.CanvasDevice);

        _surface.AddComponent(_gameEngine);
    }

    public void Uninitialize()
    {
        _surface.Unload();
    }

    public static void Main(string[] args)
    {
        CoreApplication.Run(new MyViewSource());
    }
}
4

1 回答 1

1

当你在没有 XAML 的情况下运行时,你的交换链是唯一渲染图形的东西,所以它总是填满整个屏幕。要将交换链缩放为仅适合标题安全区域,您需要将其作为输入提供给其他可以在填充时缩放和转换图像的合成系统(可能是 XAML 或 Windows.UI.Composition API)在带有背景颜色的边框中。

您可以通过设置 CanvasDrawingSession.Transform 来缩放和偏移您的渲染,并使用 CreateLayer 对其进行剪辑,从而仅绘制 Win2D 交换链的选定子集。

不过,游戏通常最好在标题安全区域之外进行绘制。究竟有多少这个空间是可见的,会因一台电视而异,所以如果你只是让它保持黑色,一些玩家会在你的游戏周围看到难看的黑色边框。您无法在该区域绘制游戏所需的重要内容,因为其他玩家根本看不到,但通常您希望非必要的背景图形一直延伸到屏幕的真实边缘。

(这是为电视显示器开发内容的麻烦之一)

于 2016-08-04T15:24:30.767 回答