访问冲突直接x更新方法

时间:2014-06-06 18:09:42

标签: c++ pointers memory directx

我在utube上关注了dirextX 9教程,我试图修改程序,根据一组点显示多个三角形。我正在使用它作为一种绘图仪。在我的测试中,我在绘图仪类中生成了一个点列表。然后绘图仪类生成3个顶点以在点周围创建一个小三角形。然后将这些点传递给directx设备。

我已将生成多边形的代码移动到我的更新方法中,因为我需要使用新的多边形更新多边形列表。 代码可以工作,但是它会偶尔崩溃并出现以下错误消息

DX3DPlotTest.exe中0x010F6AF1处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。

我确定问题是一遍又一遍地调用memcpy命令。我已经尝试删除pVert,但由于永远不会启动pVert,因此会产生自己的错误。

听到的是我的更新版本

`
void TestApp::Update(float dt)
{
    void *pVerts;
    plotter=new Plotter(MaxPoints,0.01f);
    float x,y;
    for(ULONG i=0;i<MaxPoints;i++)
    { 
        x= (float)(distribution(generator)-2.0f);
        y= (float)(distribution(generator)-2.0f);
        plotter->Plot(x,y);
    }
    m_pDevice3D->CreateVertexBuffer(
        plotter->listContentCount*sizeof(VertexPositionColor),
        0,VertexPositionColor::FVF,
        D3DPOOL_MANAGED,
        &VB,
        NULL
        );
    //d3d vertex buffer VB
    VB -> Lock(0,sizeof(VertexPositionColor)*plotter->listContentCount, (void**)&pVerts, 0);
    memcpy(pVerts,plotter->m_pVertexList,sizeof(VertexPositionColor)*plotter->listContentCount);
    VB -> Unlock();
}
`

请有人帮我理解如何解决这个问题?如果一直在摆弄它好几个小时。它确实有效,但时间有限。 谢谢大家。

编辑:

现在好了,我想它重新创建我的绘图仪实例

`

Plotter::Plotter(UINT PointCount,float pointsize)
    {
        listSize            =   PointCount*3;
        listContentCount    =   0;
        bufferContentCount  =   0;
        Polycount           =   0;
        m_pStdtri           =   new VertexPositionColor[3];
        m_pVertexList       =   new VertexPositionColor[listSize];
        m_pStdtri[0]        =   VertexPositionColor(0.0f                    ,1.0f*pointsize     ,d3dColors::Red);
        m_pStdtri[1]        =   VertexPositionColor(1.0f*pointsize          , -1.0f*pointsize   ,d3dColors::Lime);
        m_pStdtri[2]        =   VertexPositionColor(-1.0f*pointsize         , -1.0f*pointsize   ,d3dColors::Red);
    }
    Plotter::~Plotter()
    {
        delete(m_pStdtri);
        delete(m_pVertexList);

    }
    void Plotter::Plot(float x, float y)
    {
        Polycount++;
        m_pVertexList[listContentCount]=VertexPositionColor(x+m_pStdtri[0].x, y+m_pStdtri[0].y,d3dColors::Red);
        listContentCount++;
        m_pVertexList[listContentCount]=VertexPositionColor(x+m_pStdtri[1].x, y+m_pStdtri[1].y,d3dColors::Lime);
        listContentCount++;
        m_pVertexList[listContentCount]=VertexPositionColor(x+m_pStdtri[2].x, y+m_pStdtri[2].y,d3dColors::Blue);
        listContentCount++;
    }

`

1 个答案:

答案 0 :(得分:0)

这里有几件事可能是错的。绘图仪对象似乎从未被处理过,但它可能在其他地方完成。然而,困扰我的是你一遍又一遍地调用CreateVertexBuffer,大概是没有释放你正在使用的资源。所以基本上我认为发生的事情是:在每一帧中,你创建一个新的VertexBuffer。由于GPU上的内存不足,命令最终会失败,您无法检测并尝试使用&#34;创建的&#34;缓冲区,它并没有真正创建。你需要知道,即使你删除了保存VB变量的对象,缓冲区也不会被破坏。 CreateVertexBuffer命令占用GPU上的资源,因此需要在不再需要时显式释放它们。但是,让我们回到原点。此功能在某些时候失败。因此它会导致NULL指针错误。我的建议是只创建一次缓冲区,然后只在每一帧中更新它。但首先,确保是否是这种情况。