【问题标题】:SurfaceImageSource and IDXGISurface BackBuffer size mismatchSurfaceImageSource 和 IDXGISurface BackBuffer 大小不匹配
【发布时间】:2014-01-15 18:27:21
【问题描述】:

我遇到了一个奇怪的问题,IDXGISurface BackBuffer 描述与创建它的 SurfaceImageSource 的大小不匹配。我找不到任何文档说明为什么会出现这种情况,但我看到了细微的差异(例如:1366x768 变为 1376x768、2560x1440 变为 2592x1440 等等)。

我在这里有一个独立复制的来源:https://skydrive.live.com/redir?resid=16E5F6030DCB8991!25573&authkey=!AF0Y3h0-ufLPubs&ithint=file%2c.zip

有什么想法吗?

【问题讨论】:

    标签: c# windows-runtime directx windows-8.1 sharpdx


    【解决方案1】:

    这是意料之中的。使用 SurfaceImageSource 时,您获得的 DXGI 表面通常是对atlased 表面的引用。 XAML 这样做是为了提高性能并减少内存开销(尤其是对于使用许多小的 SurfaceImageSource 元素的应用程序)。

    应用程序应根据返回的offsetBeginDraw 呈现到该区域的子集。另请注意,您永远不应缓存此值或 IDXGISurface*,因为 XAML 可能会在后续调用 BeginDraw 时为您提供不同的偏移量或图集。

    在您的情况下,由于您只有一个 SurfaceImageSource,因此图集通常与请求的大小大致匹配。但是,如果您有两个 SurfaceImageSource 对象,每个对象均为 1366x768,那么您很可能会返回一个 IDXGISurface,即 1376x1536,其中一个调用 BeginDraw 会返回 (0,0),而调用 BeginDraw 会返回另一个 (0,768)。这些点作为您应该绘制到表面的原点。

    另一件事 - 考虑到您尝试过的尺寸,您似乎正在尝试创建全屏 SurfaceImageSource。根据具体情况,SwapChainPanel 可能更合适,并且实际上为您提供了一个适当缓冲的交换链。

    【讨论】:

    • 谢谢,这是很好的信息!我确实有一个全屏 SurfaceImageSource,但在一个还包含 XAML 组件的页面上,不幸的是,这似乎排除了使用 SwapChainPanel。
    • @GabrielIsenberg 这应该可以正常工作 - 您应该能够在与其他元素相同的页面上使用 SwapChainPanel。
    • 再次感谢!你的评论让我走上了正轨。我曾使用 SwapChainBackgroundPanel 进行调查,而不是您建议的 SwapChainPanel。我正在使用 SharpDX,并且 nuget 包中不存在 ISwapChainPanelNative 接口。在更新到包含 ISwapChainPanelNative 的预发布版本后,我能够获得我想要的效果。
    • 顺便说一句,您是从哪里了解到 SurfaceImageSource 地图集的?我在查看的文档中的任何地方都没有看到任何关于该行为的注释。好奇什么资源可以引导我朝着正确的方向前进。
    • @GabrielIsenberg 有几篇关于 DirectX/XAML 互操作的文章。 This one 特别介绍了如何使用 SurfaceImageSource。偏移量参数(第 4 步)意味着某种类型的图集,尤其是当您使用多个对象并查看偏移量的相关性时。
    猜你喜欢
    • 2020-03-21
    • 2021-08-01
    • 2020-02-07
    • 2020-09-19
    • 2021-01-31
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 2015-04-21
    相关资源
    最近更新 更多