Toon posts:

[c/dx9] IDirect3DVertexBuffer9 Release probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct GlobalVertexBuffer
{
  IDirect3DVertexBuffer9 *VB;
  void *vb_vertices;
  int VBListCount;
};

GlobalVertexBuffer gvb;

if(gvb.VB)
{
  gvb.VB->Release();
  gvb.VB=NULL;
}


Heeft iemand een idee waarom mijn programma steeds crasht als hij bij gvb.VB->Release(); terecht komt ? Roep ik die regel verkeerd aan ofzo ?

[ Voor 4% gewijzigd door .oisyn op 18-11-2003 21:26 ]


Verwijderd

Je gvb variabele is niet geïnitialiseerd waardoor de pointer naar je vertexbuffer naar een willekeurig geheugenadres wijst.

code:
1
2
3
4
5
if(gvb.VB)
{
    gvb.VB->Release();
    gvb.VB=NULL;
}


omdat gvb.VB een willekeurig adres bevat, komt hij door het if-statement heen en wordt de Release() functie van een niet bestaand object aangeroepen.

[ Voor 50% gewijzigd door Verwijderd op 18-11-2003 20:23 ]


Verwijderd

Topicstarter
Dit is het create gedeelte (ik denk dat je dit nog miste ?)

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
hr=gdx.pD3D_Device->CreateVertexBuffer(byte_count, //Length
        D3DUSAGE_WRITEONLY,//Usage
        tri_fvf, //FVF
        D3DPOOL_MANAGED, //Pool
        &gvb.VB, //ppVertexBuffer
        NULL); //Handle

if(FAILED(hr))
{
    return hr;
}

hr=gvb.VB->Lock(0, //Offset
        0, //SizeToLock
        &gvb.vb_vertices, //Vertices
        0); //Flags

if(FAILED(hr))
{
}

memcpy(gvb.vb_vertices, data, byte_count);

gvb.VB->Unlock();

[ Voor 12% gewijzigd door .oisyn op 18-11-2003 21:27 ]


Verwijderd

code:
1
2
3
4
hr=gvb.VB->Lock(0, //Offset
     0, //SizeToLock                    <----------------------
     &gvb.vb_vertices, //Vertices
     0); //Flags


Waarom lock je hier een stuk geheugen van 0 bytes?

edit:

ik zie het al, hier mee lock je het hele buffer 8)7

[ Voor 26% gewijzigd door Verwijderd op 18-11-2003 20:42 ]


Verwijderd

Topicstarter
Euh :S ikke niet weet. Zo stond het in de tutorial die ik na heb gemaakt.
Wat zou dan hier moeten staan volgens jou ? De Data ?

In de variabele data in memcpy( vb_vertices, data,byte_count); staan alle gegevens.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Post code tussen code tags!

Wat ik op gameskool zei:


Na het locken check je trouwens niet op errors. De waarde controleer je wel, maar er staat niets in je if body

Het riekt naar een geheugen-management probleem. Of je schrijft ergens overheen (bijvoorbeeld omdat die lock niet lukt), of je delete/free'd 2x een pointer, dat soort dingen. Die geven altijd onverwachte resultaten op de raarste plekken

[ Voor 87% gewijzigd door .oisyn op 18-11-2003 20:51 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Ik heb een stukje veranderd en door allebei komen ze goed door. Ik weet niet hoe ik moet controleren of e memcpy goed is gegaan :s.

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
if(gvb.VB->Lock(0, 0, &gvb.vb_vertices, 0)!=D3D_OK)
{
    WriteLog("LoadVertextBuffer","Error Lock01");
    return false;
}

memcpy(gvb.vb_vertices, data, byte_count);

if(gvb.VB->Unlock()!=D3D_OK)
{
    WriteLog("LoadVertextBuffer","Error UnLock01");
    return false;
}


Ondertussen heb ik ook gecontroleerd of de waarde die aan PrimitiveCount wordt gegeven in DrawPrimitive klopt en die klopt ook.

[ Voor 9% gewijzigd door .oisyn op 18-11-2003 21:27 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ja sorry hoor, maar

GEBRUIK CODE TAGS!

[norml]
C++:
1
...je code hier...
[/] enzo. Staat ook in de FAQ
Ik heb je posts nu voor je geedit, maar denk daar voortaan zelf aan. De policy is echt vrij duidelijk wat dat betreft

[ Voor 28% gewijzigd door .oisyn op 18-11-2003 21:28 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Ik heb het probleem gevonden alleen waarom het een probleem is snap ik nog niet zo.

Dit is mijn render functie :

gdx.pD3D_Device->Clear
gdx.pD3D_Device->BeginScene();
gdx.pD3D_Device->SetFVF(tri_fvf);

DXSetRenderState();

gdx.pD3D_Device->SetStreamSource
gdx.pD3D_Device->DrawPrimitive
gdx.pD3D_Device->EndScene();
gdx.pD3D_Device->Present(NULL,

En dit is de DXSetRenderState :
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
void DXSetRenderState()
{
if(g.WireFrame)
{
gdx.pD3D_Device->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
//strcpy(g.strRenderState,"Wire");
}
else
{
gdx.pD3D_Device->SetRenderState(D3DRS_FILLMODE,D3DFILL_SOLID);
//strcpy(g.strRenderState,"Solid");
}
}


Waarom mag ik in deze functie geen strcpy gebruiken ? Daar crashte het zaakje op. Logisch ?

Sorry dat ik geen code tags heb gebruikt }:O

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat is g voor iets :?
En heb je wel geheugen gealloceerd van tevoren voor g.strRenderState?

[ Voor 63% gewijzigd door .oisyn op 18-11-2003 21:45 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
g is gewoon een globale struct. Maar dat werkt gewoon, die strcpy dat is het probleem.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 12:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ja duh, en daarom is het van belang om te weten wat g.strRenderState voor iets is, en wat voor waarde die heeft

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Das een char die blijkbaar te klein was :s. Maar het had altijd gewerkt en nu dus ineens niet meer sinds die vertexbuffer in het leven is geroepen maar goed dit topic mag dus dicht.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Verwijderd schreef op 18 november 2003 @ 22:13:
Das een char die blijkbaar te klein was :s. Maar het had altijd gewerkt en nu dus ineens niet meer sinds die vertexbuffer in het leven is geroepen maar goed dit topic mag dus dicht.
Waarom zou dit topic dicht mogen?
Pagina: 1