如何在Windows中直接分配视频卡内存?

时间:2013-05-29 04:56:40

标签: windows bitmap directx

我需要在Windows的项目中在视频卡内存中分配位图。因为项目使用除GDI以外的其他2d库,所以CreateCompatibleBitmap没用。

然后我找出一个使用DX的方法,这是我的代码:

if(FAILED(g_D3DDevice->CreateVertexBuffer(10240 * 1024, 0,  
        D3DFVF_VERTEX, D3DPOOL_DEFAULT, &g_VertexBuffer,  
        NULL))) return false;  

    // Fill the vertex buffer.  
    void *ptr;  

    if(FAILED(g_VertexBuffer->Lock(0, 1024 * 10240,  
        (void**)&ptr, 0))) return false;  

    //do something...
    //printf("ptf = %x\n", ptr);
    //memcpy(ptr, objData, sizeof(objData));  
    g_VertexBuffer->Unlock();  

到目前为止效果很好。但是有任何副作用吗?

2 个答案:

答案 0 :(得分:2)

Sideeffect:

  • 每次想要写入或读取它时,您都必须解锁VertexBuffer
  • 慢然后正常记忆

除了这个副作用之外,请务必检查此过程是否成功,因为视频卡内存不足以提供最“用户明显”的错误。

至于它为什么会很慢:通过将它放入你的显卡内存,每次你想要写/读时你都必须请求访问顶点,这比在常规内存中实际访问它要慢。

答案 1 :(得分:2)

我无法想象任何合理的理由想要这样做,但总的来说无论如何都不可能。 Windows PC具有广泛的硬件,许多甚至没有单独的视频内存的概念。对于那些没有保证性能特性的人来说,这就是为什么Direct3D有很多方法可以向驾驶员指出你的预期用途,以便驾驶员可以决定最佳定位资源的位置(除其他外,如何最好地将它们放在内存)而不是提供方法来指定“在视频内存中”以及在不同硬件类型中不一致定义的其他概念。

如果你说你的老板要求你这样做,这似乎是一个不良项目管理的案例研究 - 指明要做什么的实施细节,而不是指定项目目标,让工程师负责实施,以弄清楚如何最好的实现它们。据推测,这里的真正目标是提高某些任务或操作的性能。几乎可以肯定,你所做的并不是实现这一目标的最佳方法。