Het probleem waar ik mee zit is dat de constructie van een triangle mesh van 30K vertices en 60K faces in Wavefront OBJ formaat ontzettend lang duurt. Ik heb eerlijk gezegd wat hulp nodig bij de optimalisatie van deze constructie.
Zoals je uit deze code kunt zien zit het probleem in de addVertex functie, die een optimalisatie doet zodat een vertex buffer geen dubble vertices bevat.
Ik kan natuurlijk gewoon alle data in een vertex buffer duwen en geen mesh optimalistie uitvoeren maar dat levert dan natuulijk weer perfomance degradatie op bij het renderen.
Een oplossing zou natuurlijk zijn om een CRC te berekenen over de vertex en deze bij te houden in een andere array. Natuurlijk moet de functie addVertex ook gebruik gaan maken bij pass by reference ipv pass by value. Al denk ik dat de grootste performance hit in de memcmp zit.
Als ik zoek op vertex chache optimisation of traingle mesh contrstruction kan ik niet echt vinden wat ik nodig heb.
Onder vertex chache optimisation gaat het steeds over GPU based optimisation, dit komt later pas wil eerst het laden van een file binnen in een redelijke marge hebben.
En bij traingle mesh contstruction kom ik artikels tegen die een log in vereisen, acm port en dergelijken.
Heeft iemand een andere idee of een weblink waar ik meer info kan vinden.
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
| struct OBJVertex { Vector3 m_position; Vector3 m_normal; Vector3 m_tangent; Vector3 m_textureCoordinate; }; for (int i = 0; i < (int)m_faces.size(); ++i) { OBJFace face = m_faces[i]; unsigned int layout = face.getLayout(); for ( unsigned int i = 0; i < face.getSize(); ++i) { const OBJVNTData* vntData = face.getVNTDataAt(i); OBJVertex newVertex; newVertex.m_tangent = createTangent(face, i); newVertex.m_position = m_vertices[vntData->m_vertexIndex]; newVertex.m_normal = m_normals[vntData->m_normalIndex]; newVertex.m_textureCoordinate = m_texCoords[vntData->m_texCoordIndex]; newVertex.m_tangent.normalize(); addVertex( newVertex); } } void OBJLoader::addVertex( OBJVertex vertex ) { bool foundInList = false; unsigned int returnIndex = 0; for (int i = 0; i < (int)m_tempVB.size(); ++i) { if (0 == memcmp(&vertex, &m_tempVB[i], sizeof(OBJVertex))) { foundInList = true; returnIndex = i; break; } } if (!foundInList) { returnIndex = m_tempVB.size(); m_tempVB.push_back(vertex); } m_tempIB.push_back(returnIndex); } |
Zoals je uit deze code kunt zien zit het probleem in de addVertex functie, die een optimalisatie doet zodat een vertex buffer geen dubble vertices bevat.
Ik kan natuurlijk gewoon alle data in een vertex buffer duwen en geen mesh optimalistie uitvoeren maar dat levert dan natuulijk weer perfomance degradatie op bij het renderen.
Een oplossing zou natuurlijk zijn om een CRC te berekenen over de vertex en deze bij te houden in een andere array. Natuurlijk moet de functie addVertex ook gebruik gaan maken bij pass by reference ipv pass by value. Al denk ik dat de grootste performance hit in de memcmp zit.
Als ik zoek op vertex chache optimisation of traingle mesh contrstruction kan ik niet echt vinden wat ik nodig heb.
Onder vertex chache optimisation gaat het steeds over GPU based optimisation, dit komt later pas wil eerst het laden van een file binnen in een redelijke marge hebben.
En bij traingle mesh contstruction kom ik artikels tegen die een log in vereisen, acm port en dergelijken.
Heeft iemand een andere idee of een weblink waar ik meer info kan vinden.
ex-FE Programmer: CMR:DiRT2,DiRT 3, DiRT Showdown, GRID 2, Mad Max