Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > *NIX системы: Общие вопросы > Непонятности с OpenGL


Автор: Cheloveck 14.6.2010, 18:05
Не знаю, в каком разделе написать, напишу тут.
В общем, решил поизучать OpenGL. Обложился статьями, книгами. В частности http://pmg.org.ru/nehe/index.html переводом статей с http://nehe.gamedev.net/. 
Беру любой пример, например http://nehe.gamedev.net/data/lessons/linux/lesson02.tar.gz, компилирую, запускаю, и 70% CPU отъедается. 

Давал скомпилированный бинарник двум людям. У одного Gentoo с ATI'шной картоочкой - 87%, а у другого debian lenny c intel'овской интегрированной картой на ноуте - 1%. То есть, из этого можно сделать два вывода:
  • Пример работает
  • Проблема носит массовый характер
Кроме того, на Java с использованием JOGL, как написано http://forum.vingrad.ru/forum/topic-161042/kw-opengl-java-jogl.html та же самая история.
 Интересно, что все примеры из Qt занимают не более 3%.

Пробовал две видеокарты GeForce 6600 и GeForce 8600GT . Драйверы официальные, последней версии.  ОС Debian Squeeze.
Файл xorg.conf, будь то мой личный или сгенерированный инсталятором дров NVIDIA не влияет на результат. Вот, что генерирует инсталлер
Код

# nvidia-xconfig: X configuration file generated by nvidia-xconfig
# nvidia-xconfig:  version 1.0  (buildmeister@builder75)  Wed Jun  2 00:20:35 PDT 2010

Section "ServerLayout"
    Identifier     "Layout0"
    Screen      0  "Screen0"
    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Mouse0" "CorePointer"
EndSection

Section "Files"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Mouse0"
    Driver         "mouse"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/psaux"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"
    # generated from default
    Identifier     "Keyboard0"
    Driver         "kbd"
EndSection

Section "Monitor"
    Identifier     "Monitor0"
    VendorName     "Unknown"
    ModelName      "Unknown"
    HorizSync       28.0 - 33.0
    VertRefresh     43.0 - 72.0
    Option         "DPMS"
EndSection

Section "Device"
    Identifier     "Device0"                                                                                                                                 
    Driver         "nvidia"                                                                                                                                  
    VendorName     "NVIDIA Corporation"                                                                                                                      
EndSection                                                                                                                                                   
                                                                                                                                                             
Section "Screen"                                                                                                                                             
    Identifier     "Screen0"                                                                                                                                 
    Device         "Device0"                                                                                                                                 
    Monitor        "Monitor0"                                                                                                                                
    DefaultDepth    24                                                                                                                                       
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection


GLUT представлен пакетами freeglut3 и freeglut3-dev. Установка или удаление mesa дело не изменяет. OpenGL устанавливается вместе с дровами NVIDIA.

У меня больше нет мыслей, куда капать?

PS все примеры под M$ Windows работают нормально.

Автор: Cheloveck 15.6.2010, 21:23
Раскуривание OpenGL дальше привело к, как мне кажется, ответу, во всём виновата обработка событий Idle. Если сделать как-то так
Код

void Timer(bool start)
{
    static struct timeval tv_begin;
    if(start)
        gettimeofday(&tv_begin, 0);
    else
    {
        struct timeval tv_end;
        gettimeofday(&tv_end, 0);

        if(tv_begin.tv_sec == tv_end.tv_sec)
        {
            time_t diff = 40000 - (tv_end.tv_usec - tv_begin.tv_usec);
            if(diff > 0)
            {
                timespec ts = { 0, diff * 1000 };
                nanosleep(&ts, 0);
            }
        }
    }
}

void DisplayHandler()
{
    Timer(true);

    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POLYGON);
    glVertex2f(0.0, 1.0);
    glVertex2f(1.0, -1.0);
    glVertex2f(-1.0, -1.0);
    glEnd();

    glutSwapBuffers();

    Timer(false);
}

то всё становится на круги своя.
PS этот код ограничивает количество кадров до 25-ти в секунду

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)