1

我需要在 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();  

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

4

2 回答 2

2

副作用:

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

除了这个副作用,确保检查这个过程是否成功,因为显卡内存不足并没有提供最“用户明显”的错误。

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

于 2013-05-29T12:52:34.053 回答
2

我无法想象有任何正当理由想要这样做,但总的来说这是不可能的。Windows PC 具有广泛的硬件,许多甚至没有单独的视频内存的概念。对于那些执行性能特征的人来说,性能特征并不能得到保证,这就是为什么 Direct3D 有很多方法可以向驱动程序指示您的预期用途,以便驱动程序可以决定在哪里找到资源的最佳位置(除其他事项外,例如如何最好地将它们布置在内存),而不是为您提供指定“在视频内存中”和其他在不同硬件类型中定义不一致的概念的方法。

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

于 2013-05-29T19:39:50.720 回答