Hallo zusammen.
Ich sitze seit knapp 2 Wochen an einem mühsamen Problem bei meinem privaten Projekt. Leider kam ich in letzter Zeit aus beruflichen Gründen nicht wirklich dazu es genauer zu studieren. Nun hatte ich wieder mehr Zeit, bin aber noch immer nicht auf einen grünen Zweig gekommen.
Wie der Titel vermuten lässt geht es um die Funktion
IDirect3DDevice9::CreateVertexBuffer und den Fehler E_OUTOFMEMORY, welcher von der Funktion zurückgegeben wird.
Dieser Fehler ist für mich in dem Kontext einfach nicht verständlich. Ich habe eine Funktion, welche mir den Vertexbuffer erstellt und zurückliefert, die so aussieht:
Diese hat bisher bereits gute Dienste geleistet und erstellt für andere Objekte auch Dutzende von Vertexbuffern mit Tausenden von Vertices gebuffert.
Nun habe ich eines Tages einen neuen Modelltyp einbringen wollen. Auch dieser verwendet Vertexbuffer.
Das sieht folgendermassen aus:
Jede Instanz der Klasse tut dies, und insgesamt gibt es 256 Instanzen.
Hier kommt es jedoch zu einem Problem. Bei der ersten Klasseninstanz funktioniert alles wunderbar, bei der zweiten Instanz schlägt jedoch in der Funktion GetVertexBuffer die DX-Funktion CreateVertexBuffer fehl mit dem Fehler E_OUTOFMEMORY. Und genau da versteh ich nicht warum.
Ich hoffe jemand von euch sieht warum das so ist, ich bin langsam echt ratlos...
Gruss
Cromon
Ich sitze seit knapp 2 Wochen an einem mühsamen Problem bei meinem privaten Projekt. Leider kam ich in letzter Zeit aus beruflichen Gründen nicht wirklich dazu es genauer zu studieren. Nun hatte ich wieder mehr Zeit, bin aber noch immer nicht auf einen grünen Zweig gekommen.
Wie der Titel vermuten lässt geht es um die Funktion
IDirect3DDevice9::CreateVertexBuffer und den Fehler E_OUTOFMEMORY, welcher von der Funktion zurückgegeben wird.
Dieser Fehler ist für mich in dem Kontext einfach nicht verständlich. Ich habe eine Funktion, welche mir den Vertexbuffer erstellt und zurückliefert, die so aussieht:
Code:
IDirect3DVertexBuffer9* D3DManager::GetVertexBuffer(Vertex* src, ui32 nVertices, VertexFormat format)
{
IDirect3DVertexBuffer9* ret;
HRESULT errcode = 0;
switch(format)
{
case VERTEX_3F:
errcode = device->CreateVertexBuffer(nVertices * 3 * sizeof(float), 0, format, D3DPOOL_MANAGED, &ret, 0);
break;
case VERTEX_3FC:
errcode = device->CreateVertexBuffer(nVertices * (3 * sizeof(float) + 4), 0, format, D3DPOOL_MANAGED, &ret, 0);
break;
case VERTEX_3FT:
errcode = device->CreateVertexBuffer(nVertices * 5 * sizeof(float), 0, format, D3DPOOL_MANAGED, &ret, 0);
break;
case VERTEX_3FCT:
errcode = device->CreateVertexBuffer(nVertices * (5 * sizeof(float) + 4), 0, format, D3DPOOL_MANAGED, &ret, 0);
break;
case VERTEX_3FRT:
errcode = device->CreateVertexBuffer(nVertices * 6 * sizeof(float), 0, format, D3DPOOL_MANAGED, &ret, 0);
break;
default:
return 0;
}
if(ret == 0)
return 0;
void* pData;
ret->Lock(0, 0, &pData, 0);
switch(format)
{
case VERTEX_3F:
memcpy(pData, src, nVertices * 3 * sizeof(float));
break;
case VERTEX_3FC:
memcpy(pData, src, nVertices * (3 * sizeof(float) + 4));
break;
case VERTEX_3FT:
memcpy(pData, src, nVertices * 5 * sizeof(float));
break;
case VERTEX_3FCT:
memcpy(pData, src, nVertices * (5 * sizeof(float) + 4));
break;
case VERTEX_3FRT:
memcpy(pData, src, nVertices * (6 * sizeof(float)));
break;
}
ret->Unlock();
return ret;
}
Diese hat bisher bereits gute Dienste geleistet und erstellt für andere Objekte auch Dutzende von Vertexbuffern mit Tausenden von Vertices gebuffert.
Nun habe ich eines Tages einen neuen Modelltyp einbringen wollen. Auch dieser verwendet Vertexbuffer.
Das sieht folgendermassen aus:
Code:
ui32 counter = 0;
for(ui32 i = 0; i < 17; ++i)
{
for(ui32 j = 0; j < ((i % 2) ? 8 : 9); ++j)
{
float y, x, z;
m_file->ReadInc(&y, 4);
x = j * UNITSIZE;
z = i * UNITSIZE * 0.5f;
if(i % 2)
x += 0.5f * UNITSIZE;
Vertex3F vert;
m_heights[counter] = y;
vert.x = xbase + x;
vert.y = ybase + y;
vert.z = zbase + z;
m_vertices[counter++] = vert;
}
}
m_vertexbuffer = sD3DManager.GetVertexBuffer(m_vertices, 145, VERTEX_3F);
Jede Instanz der Klasse tut dies, und insgesamt gibt es 256 Instanzen.
Hier kommt es jedoch zu einem Problem. Bei der ersten Klasseninstanz funktioniert alles wunderbar, bei der zweiten Instanz schlägt jedoch in der Funktion GetVertexBuffer die DX-Funktion CreateVertexBuffer fehl mit dem Fehler E_OUTOFMEMORY. Und genau da versteh ich nicht warum.
Ich hoffe jemand von euch sieht warum das so ist, ich bin langsam echt ratlos...
Gruss
Cromon