Image 在MFC中渲染大型图像

Image 在MFC中渲染大型图像,image,winapi,mfc,Image,Winapi,Mfc,我试图在MFC中渲染CView中的大型图像(10K x 10K)。GdiPlus的性能非常慢(精确地说是0.5 fps)。是否有任何免费或商业图书馆可供我使用 DirectX渲染代码 float halfWidth = m_CurWidth/2.0; float halfHeight = m_CurHeight/2.0; D3DXMATRIX P; D3DXMatrixOrthoLH(&P, (float)rect.Width(), (float)rect.Height(), -10,

我试图在MFC中渲染CView中的大型图像(10K x 10K)。GdiPlus的性能非常慢(精确地说是0.5 fps)。是否有任何免费或商业图书馆可供我使用

DirectX渲染代码

float halfWidth = m_CurWidth/2.0;
float halfHeight = m_CurHeight/2.0;

D3DXMATRIX P;
D3DXMatrixOrthoLH(&P, (float)rect.Width(), (float)rect.Height(), -10, 10);
m_pDevice3D->SetTransform(D3DTS_PROJECTION, &P);

float cornerX = m_Left;
float cornerY = -m_Top;

VERTEX g_vVertices[4];
{
    g_vVertices[0] = VERTEX(cornerX + (-1.0f * halfWidth), cornerY + (1.0f * halfHeight), 0.0f, 0.0f, 0.0f );
    g_vVertices[1] = VERTEX(cornerX + (1.0f * halfWidth), cornerY + (1.0f * halfHeight), 0.0f, 1.0f, 0.0f );
    g_vVertices[2] = VERTEX(cornerX + (-1.0f * halfWidth), cornerY + (-1.0f * halfHeight), 0.0f, 0.0f, 1.0f );
    g_vVertices[3] = VERTEX(cornerX + (1.0f * halfWidth), cornerY + (-1.0f * halfHeight), 0.0f, 1.0f, 1.0f );
};

 void * pVertices;
 m_pVB->Lock( 0, sizeof(pVertices), (void**)&pVertices, 0 );
 memcpy( pVertices, g_vVertices, sizeof(g_vVertices));
 m_pVB->Unlock();

if(m_pDevice3D){
    m_pDevice3D->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
        0xffffffff, 1.0f, 0);
    m_pDevice3D->BeginScene();
    m_pDevice3D->SetFVF(D3DFVF_VERTEX);
    m_pDevice3D->SetStreamSource(0, m_pVB, 0, sizeof(VERTEX));
    // Draw primitives using presently enabled texture.
    m_pDevice3D->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
    m_pDevice3D->EndScene();
    m_pDevice3D->Present(0, 0, 0, 0);
}

是否需要一次渲染所有像素?您可以改用滚动视图,只渲染滚动区域内的部分。然而,您是对的,GDIPlus速度很慢。你可以直接使用GDI的BitBlt,我实际上也需要允许图像的放大/缩小,所以渲染片段不是一个选项。我也尝试过用Direct3D渲染,但是质量太差了!我懂了。您可以使用StretchBlt进行缩放,但不会太快。可以显示DirectX代码吗?可以添加m_pDevice3D->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINEAR);和m_pDevice3D->SetSamplerState(0,D3DSAMP_磁滤波器,D3DTEXF_线性);看看质量是否有改进。还可以使用纹理坐标0从每个角点减去0.5f,如下所示:cornerX+(-1.0f*半宽度)-0.5f;将0.5f添加到纹理坐标为1的角点,如下所示:角点+(-1.0f*半高)+0.5f这就是所谓的半像素偏移:;