RazzorFlame Temat założony przez niniejszego użytkownika |
» 2015-01-09 19:56:08 Skąd mam wiedzieć ile będzie vertexów, texture coordinate-ów lub normalów? |
|
stryku |
» 2015-01-09 19:56:09 maly dobrze prawi. Jeżeli możesz jakość z góry wiedzieć ile będzie obiektów wrzucanych do wektora to jedno duże reseve powinno też coś dać. Tu masz coś ciekawego http://stackoverflow.com/questions/17925051/fast-textfile-reading-in-c Tylko nie wiem czy chcesz się trzymać tylko i wyłącznie c++ :p W ostatnim przykładzie z zaakceptowanej odpowiedzi masz nawet rozpoznawanie linii |
|
pekfos |
» 2015-01-09 19:58:12 Skąd mam wiedzieć ile będzie vertexów, texture coordinate-ów lub normalów? |
Oszacuj. Jeśli masz 1000 wpisów w pliku, to na pewno wszystkich z wymienionych będzie mniej niż 1000. |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2015-01-09 20:04:11 Gdybym nawet oszacował to, myślisz że mógłbym osiągnąć efekt taki jak w blenderze. W sumie to aż taki nawet mi nie jest potrzebny. Cieszyłbym się nawet gdyby taki model wczytywał się w 10 sekund. Właśnie spróbowałem zarezerwować po 80 tys. dla każdego z vectorów "Position", "TexCoord" i "Normal", wydajność podskoczyła o 3s. |
|
stryku |
» 2015-01-09 20:05:50 Czyli wina strumienia |
|
SocrateZ |
» 2015-01-09 22:48:58 Otwórz plik i policz ile masz wierzchołków. Przewiń na początek, przydziel pamięć i wczytuj dane. Robiłem niedawno wczytywanie plików .obj i plik 150 mb (Paryż bodajże znalazłem w jednym pliku) wczytywało ok minuty. Tyle że pisałem w C (fopen, fgetc). Edit: Nieco przesadziłem, bo Paris zajmuje 51mb, ale chodziło mi o Venice ( http://tf3dm.com/3d-model/venice-14698.html) który zajmuje 113 mb. <tu były bzdury które nikogo nie obchodzą> Edit: Dobra, nie ważne :) Po prostu spróbuj zrobić to co mówiłem, otwórz plik funkcją fopen, pobieraj znaki i zmień if na case. |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2015-01-10 13:28:59 Poradziłem sobie, efekty są dość dobre (chociaż wiem, że mogłyby być lepsze). Teraz wczytuje się ten model 14 sekund. Oto kod: Clock myTimer; HANDLE plik =::CreateFileA(( fname.c_str() ), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 );
DWORD bufferSize = get_file_size( fname ); char * buffer = new char[ bufferSize ];
DWORD bytesRead = 0; ReadFile( plik, buffer, bufferSize, & bytesRead, NULL );
if( plik == INVALID_HANDLE_VALUE ) return false; else { myTimer.restart(); std::stringstream myStream; myStream << buffer; UINT fileLinesCount = get_file_line_count( myStream ); UINT actualSubset = 0; m_subsets.push_back( ModelSubset() ); m_subsets[ actualSubset ].m_model = new VertexModel(); VertexModel * model = m_subsets[ actualSubset ].m_model; vector < uVector3 < float >> Position; Position.reserve(( int )( fileLinesCount /( double )( 2.5 ) ) ); vector < uVector < float >> TexCoord; TexCoord.reserve(( int )( fileLinesCount /( double )( 2.5 ) ) ); vector < uVector3 < float >> Normal; Normal.reserve(( int )( fileLinesCount /( double )( 2.5 ) ) ); model->m_vdIndices.reserve( fileLinesCount * 2 ); model->m_vvVerticles.reserve( fileLinesCount * 2 ); vector < myVertexBuffer > vertBuffer( fileLinesCount * 2 ); UINT posCount = 0, texCount = 0, normalCount = 0; UINT actualIndex = 0, actualVertex = 0, actualVertBuffer = 0; string cmd; myStream >> cmd; while( true ) { if( cmd == "#" ) { getline( myStream, cmd ); } else if( cmd == "o" ) { if( actualSubset > 0 ) { model->create( device ); actualSubset++; m_subsets.push_back( ModelSubset() ); m_subsets[ actualSubset ].m_model = new VertexModel(); model = m_subsets[ actualSubset ].m_model; } else actualSubset++; } else if( cmd == "v" ) { Position[ posCount ] = uVector3 < float >( 0, 0, 0 ); myStream >> Position[ posCount ].x >> Position[ posCount ].y >> Position[ posCount ].z; posCount++; } else if( cmd == "vt" ) { TexCoord[ texCount ] = uVector < float >( 0, 0 ); myStream >> TexCoord[ texCount ].x >> TexCoord[ texCount ].y; texCount++; } else if( cmd == "vn" ) { Normal[ normalCount ] = uVector3 < float >( 0, 0, 0 ); myStream >> Normal[ normalCount ].x >> Normal[ normalCount ].y >> Normal[ normalCount ].z; normalCount++; } else if( cmd == "f" ) { myVertexBuffer buffer; string ilosc; int pos =( int )( myStream.tellg() ); getline( myStream, ilosc ); int toCount =(( std::count( ilosc.begin(), ilosc.end(), '/' ) ) / 2 ); myStream.seekg( pos, ios::beg ); vector < DWORD > myIndices( toCount ); int vID = - 1; for( int iFace = 0; iFace < toCount; iFace++ ) { myStream >> buffer.idPos; myStream.ignore(); myStream >> buffer.idTex; myStream.ignore(); myStream >> buffer.idNorm; if( iFace < toCount ) myStream.ignore(); vID = - 1; for( int a = 0; a < actualVertBuffer; a++ ) { if( buffer.idPos == vertBuffer[ a ].idPos && buffer.idTex == vertBuffer[ a ].idTex && buffer.idNorm == vertBuffer[ a ].idNorm ) { vID = a; break; } } if( vID == - 1 ) { vertBuffer[ actualVertBuffer ] = buffer; actualVertBuffer++; model->m_vvVerticles[ actualVertex ].setPosition( Position[ buffer.idPos - 1 ].x, Position[ buffer.idPos - 1 ].y, - Position[ buffer.idPos - 1 ].z ); model->m_vvVerticles[ actualVertex ].setTextureCoords( TexCoord[ buffer.idTex - 1 ].x, 1.0f - TexCoord[ buffer.idTex - 1 ].y ); model->m_vvVerticles[ actualVertex ].setNormal( Normal[ buffer.idNorm - 1 ].x, Normal[ buffer.idNorm - 1 ].y, - Normal[ buffer.idNorm - 1 ].z ); vID = actualVertex; actualVertex++; } myIndices[ iFace ] = vID; } for( int i = 0; i < myIndices.size(); i++ ) { if( i >= 3 ) { model->m_vdIndices[ actualIndex ] = myIndices[ 0 ]; actualIndex++; model->m_vdIndices[ actualIndex ] = myIndices[ i - 1 ]; actualIndex++; model->m_vdIndices[ actualIndex ] = myIndices[ i ]; actualIndex++; } else { model->m_vdIndices[ actualIndex ] = myIndices[ i ]; actualIndex++; } } } myStream >> cmd; if( myStream.eof() ) { model->m_numIndices = actualIndex; model->m_numVerticles = actualVertex; model->create( device ); cout << "Model loaded with time: " << myTimer.getElapsedTime().asSeconds() << endl; break; } } }
return true; }
|
|
DejaVu |
» 2015-01-10 13:30:39 |
|
1 « 2 » 3 |