SurfaceImageSource和IDXGISurface BackBuffer大小不匹配

时间:2014-01-15 18:27:21

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

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

这是预期的。使用SurfaceImageSource时,您获得的DXGI表面通常是对atlased曲面的引用。 XAML这样做是为了提高性能并减少内存开销(特别是对于使用许多小型SurfaceImageSource元素的应用程序)。

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

在您的情况下,因为您只有一个SurfaceImageSource,所以atlas通常大致匹配请求的大小。但是,如果你有两个SurfaceImageSource对象,每个1366x768,那么你很可能会得到一个1376x1536的IDXGISurface,其中一个调用BeginDraw返回(0,0),另一个调用返回BeginDraw(0,768)。这些点是你应该吸引到表面的原点。

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