1

我正在使用 XAML / C# 开发一个 Windows 应用商店应用程序。该应用程序还有一个 Windows 运行时组件,用于使用 DirectX 显示图表输出。

我正在使用 SwapChainPanel 方法来绘制线条(x 轴、y 轴和波形)。

我从下面的 MSDN 示例中选择了这种方法(参考场景 3 - D2DPanel) http://code.msdn.microsoft.com/windowsapps/XAML-SwapChainPanel-00cb688b

这是我的问题,我的波形包含大量数据(从 1,000 到 20,000 组点)。在每次Render函数调用期间,我都在为所有这些点连续调用 DrawLine 。

该控件还提供平移和缩放,但保持 StrokeWidth 不变而与缩放级别无关,因此可见区域(渲染目标)可能远小于我正在绘制的线条。

为将要离开屏幕的区域调用 DrawLine 会导致性能问题吗?

我尝试了 PathGeometry & GeometryRealization 但我无法在各种缩放级别控制 StrokeWidth。

我的 Render 方法通常类似于以下代码段。lineThickness 被控制为相同,与缩放级别无关。

m_d2dContext->SetTransform(m_worldMatrix);

float lineThickness = 2.0f / m_zoom;

for (unsigned int i = 0; i < points->Size; i += 2)
{
    double wavex1 = points->GetAt(i);
    double wavey1 = points->GetAt(i + 1);

    if (i != 0)
    {
        m_d2dContext->DrawLine(Point2F(prevX, prevY), Point2F(wavex1, wavey1), brush, lineThickness);
    }

    prevX = wavex1;
    prevY = wavey1;
}

我对 DirectX 有点陌生,但对 C++ 不熟悉。有什么想法吗?

4

1 回答 1

0

简短的回答:它可能会。在绘图之前推动剪辑是一种很好的做法。例如,在您的情况下,您会调用ID2D1DeviceContext::PushAxisAlignedClip绘图表面的边界。这将确保没有绘图调用试图在表面边界之外进行绘制。

长答案:真的,这取决于几个因素,包括但不限于设备上下文正在绘制的目标、显示硬件和显示驱动程序。例如,如果您正在绘制由 CPU 支持ID2D1Bitmap的 ,则可以公平地假设不会有太大差异。

但是,如果您直接绘制到某个硬件支持的表面(GPU 位图,或从IDXGISurface. 例如,请考虑来自一个记录良好的 MSDN 示例的此评论。在这里,代码即将从Clear以下位置ID2D1Bitmap创建IDXGISurface

// The Clear call must follow and not precede the PushAxisAlignedClip call. 
// Placing the Clear call before the clip is set violates the contract of the 
// virtual surface image source in that the application draws outside the 
// designated portion of the surface the image source hands over to it. This 
// violation won't actually cause the content to spill outside the designated 
// area because the image source will safeguard it. But this extra protection 
// has a runtime cost associated with it, and in some drivers this cost can be 
// very expensive. So the best performance strategy here is to never create a 
// situation where this protection is required. Not drawing outside the appropriate 
// clip does that the right way. 
于 2013-11-10T15:46:21.500 回答