Оптимизация игры на С++
От: 5y5e1  
Дата: 27.07.07 22:03
Оценка:
Товарищи!
Пишу что-то типа игры с использованием С++ и OpenGL. Пока есть только ландшафт, с натянутой на него текстурой. При работе с использованием glVertex**,glTextureCoord*** и т.д. программа выдавала 20 fpc c текстурой и 60 без. Прочитал про VBO. C его использованием результат такойже. Тогда зачем оно нужно? Как мне повысить фпц?

P.S. используется GL_TRIANGLE_STRIP. Размер ландшафта 128x128.

Заранее спасибо!
Re: Оптимизация игры на С++
От: Phoenics Россия https://sourceforge.net/projects/phengine
Дата: 28.07.07 07:14
Оценка:
Здравствуйте, 5y5e1, Вы писали:

5>Товарищи!

5>Пишу что-то типа игры с использованием С++ и OpenGL. Пока есть только ландшафт, с натянутой на него текстурой. При работе с использованием glVertex**,glTextureCoord*** и т.д. программа выдавала 20 fpc c текстурой и 60 без. Прочитал про VBO. C его использованием результат такойже. Тогда зачем оно нужно? Как мне повысить фпц?

Возможно ты не правильно используешь VBO, например пересоздаёшь его каждый кадр, или многократно отправляешь туда данные... Как говрится код в студию. Где VBO делаешь, где отрисовка происходит...
---=== С наилучшими пожеланиями, Phoenics ===---
_
Re[2]: Оптимизация игры на С++
От: 5y5e1  
Дата: 28.07.07 10:00
Оценка:
Здравствуйте, Phoenics, Вы писали:

P>Возможно ты не правильно используешь VBO, например пересоздаёшь его каждый кадр, или многократно отправляешь туда данные... Как говрится код в студию. Где VBO делаешь, где отрисовка происходит...


Эта процедура вызывается каждый кадр
int Terrain::draw() // return FPC
{
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture);

    glEnableClientState( GL_VERTEX_ARRAY );
    glEnableClientState( GL_TEXTURE_COORD_ARRAY );

    glBindBufferARB( GL_ARRAY_BUFFER_ARB, meshVBO );
    glVertexPointer( 3, GL_FLOAT, 0, (char *)NULL );
        
    glBindBufferARB( GL_ARRAY_BUFFER_ARB, texVBO );
    glTexCoordPointer( 2, GL_FLOAT, 0, (char *)NULL );

    glDrawArrays( GL_TRIANGLE_STRIP, 0, number_of_vertex);
    
    glDisableClientState( GL_VERTEX_ARRAY );
    glDisableClientState( GL_TEXTURE_COORD_ARRAY );

    int ret =  (int)(1000.0f/ timer->get_time());
    timer->flush();
    return ret;
}



Эта единожды при инициализации
void Terrain::buildVBO() {
    if( IsExtensionSupported("GL_ARB_vertex_buffer_object")) {
        glGenBuffersARB = (PFNGLGENBUFFERSARBPROC) wglGetProcAddress("glGenBuffersARB");
        glBindBufferARB = (PFNGLBINDBUFFERARBPROC) wglGetProcAddress("glBindBufferARB");
        glBufferDataARB = (PFNGLBUFFERDATAARBPROC) wglGetProcAddress("glBufferDataARB");
        glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) wglGetProcAddress("glDeleteBuffersARB");
    }else {
        MessageBox( NULL, "VBO doesn't supported!", "ERROR", MB_OK | MB_ICONERROR );
        PostQuitMessage( 0 );
    }

    glGenBuffersARB( 1, &meshVBO );
    glBindBufferARB( GL_ARRAY_BUFFER_ARB, meshVBO );
    glBufferDataARB( GL_ARRAY_BUFFER_ARB, number_of_vertex * 3 * sizeof(float), matrix, GL_STATIC_DRAW_ARB );

    glGenBuffersARB( 1, &texVBO );
    glBindBufferARB( GL_ARRAY_BUFFER_ARB, texVBO );
    glBufferDataARB( GL_ARRAY_BUFFER_ARB, number_of_vertex * 2 * sizeof(float), textures, GL_STATIC_DRAW_ARB );

    free( matrix );   matrix = NULL;
    free( textures ); textures = NULL;
}
Re[3]: Оптимизация игры на С++
От: Phoenics Россия https://sourceforge.net/projects/phengine
Дата: 06.08.07 06:52
Оценка:
Здравствуйте, 5y5e1, Вы писали:

5>Здравствуйте, Phoenics, Вы писали:


P>>Возможно ты не правильно используешь VBO, например пересоздаёшь его каждый кадр, или многократно отправляешь туда данные... Как говрится код в студию. Где VBO делаешь, где отрисовка происходит...


Ну внешне так похоже на правду. Какая у тебя видеокарта? Если старая, то неокторые "фичи" могут эмулироваться софтверно.

Ещё на форуме gamedev.ru поиском постотри, там такие топики частенько появляются. Заодно там тему создай, там гораздо быстрее тебе ответят.
---=== С наилучшими пожеланиями, Phoenics ===---
_
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.