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