Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Bardzo powolne wczytywanie pliku

Ostatnio zmodyfikowano 2015-01-10 15:45
Autor Wiadomość
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?
P-124513
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
P-124514
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.
P-124515
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.
P-124516
stryku
» 2015-01-09 20:05:50
Czyli wina strumienia
P-124517
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.
P-124537
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:
C/C++
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;
}
P-124561
DejaVu
» 2015-01-10 13:30:39
P-124562
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona