Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Как оптимизировать анимацию в OpenGL


Автор: AntZ 22.1.2008, 13:02
Вобщем уже давно пользуюсь библиотекой glut.h и для анимации использовал функцию IdleFunc + таймер делал используя библиотеку time.h, а позже нашел TimerFunc. Но проблема одна и та же! Всегда идет загрузка процессора на 100%...

Однако, если написать программку в Win32, то используя тамошний таймер загрузки процессора почти что нету!!! Я бы так и делал если бы у нас в университете не приходилось компилировать программы на Linux... В этом случае независимый ОС глют незаменим.

Вот вобщем-то и вопрос:
Как можно оптимизировать работу глютовских программ, чтобы они не грузили проц???

P.S. В архиве glut и программка, которая рисует шахматные фигуры линиями, б-сплайнами и безье и вертит их. Если даже выводить одну шахматную фигуру или даже ничего не рисовать (в функции myDisplay только очищать экранчик и свапать буффер), то все равно идет загрузка процессора на 100%!!! Что делать? Ума не приложу...

P.P.S. Я программирую полностью на glut.h не используя операционно зависимые библиотеки. Потому-что компилирую дома под Виндовс, в универе под Линукс.

Автор: Lazin 22.1.2008, 13:12
а в библиотеке glut нет чего-нибудь вроде Sleep?

Автор: AntZ 22.1.2008, 16:44
Цитата(Lazin @  22.1.2008,  13:12 Найти цитируемый пост)
а в библиотеке glut нет чего-нибудь вроде Sleep? 

Гадать и я могу... А вот есть кто-нибудь кто знает как с ОпенГЛ обращаться? Или в этом разделе только с ДиректомИКС умеют работать?????

p.s. Слипа нету... Для этого таймер вобщем-то и придумали...

Автор: sgi1981 22.1.2008, 20:58
Программируй используя Wiggle.
И таймер можно не использовать. Просто в конце кода по обработке сообщения о необходимости перерисовки указываешь InvalidateRect(hWnd ,NULL, 0); то есть требуется повторная перерисовка, и Windows через некоторое время снова вызовет оконную функцию с сообщением о том что нужна перерисовка. 

Автор: AntZ 22.1.2008, 21:55
Цитата(sgi1981 @  22.1.2008,  20:58 Найти цитируемый пост)
Программируй используя Wiggle.
И таймер можно не использовать. Просто в конце кода по обработке сообщения о необходимости перерисовки указываешь InvalidateRect(hWnd ,NULL, 0); то есть требуется повторная перерисовка, и Windows через некоторое время снова вызовет оконную функцию с сообщением о том что нужна перерисовка.  

Как я понял Wiggle это библиотека под Винду. Но мне нельзя использовать что-то от винды, т.к. в универе я сдаю прогу под Линуксом. А GLUT позволяет компилировать код и в Винде и в Линуксе ничего в нем не меняя.

В Win32 приложении я и так могу понизить загрузку проца, даже устранить, но мне нужен универсальный код.

P.S. В glut-программе нету обработчика событий все спрятано внутри GLUT'а. Пользватель лишь указывает какую функцию в каких случаях запускать.

Автор: antropod 23.1.2008, 10:27
Могу я как вариант кросс-платформенной библиотеки предложить http://libsdl.org?
Цитата

P.S. В glut-программе нету обработчика событий все спрятано внутри GLUT'а. Пользватель лишь указывает какую функцию в каких случаях запускать.
В SDL тебе самому предстоит обрабатывать события, поэтому возможностей больше.

Вместо glutDisplayFunc обрабатываешь сообщение SDL_VIDEOEXPOSE, вместо glutReshapeFunc - SDL_VIDEORESIZE.
Вместо glutPostRedisplay
Код

void PushRedisplay
{
    SDL_Event redisplay_event;
    event.type = SDL_VIDEOEXPOSE;
    SDL_PushEvent( &redisplay_event );
}


Ну и так далее.

Самое главное - есть функция SDL_Delay(..)
Код

bool running = true;
while ( running )
{
    SDL_Event Event;
    while( SDL_PollEvent( &Event ) > 0 )
    {
         if ( Event.type == SDL_QUIT )
             running = false;
         else
             HandleEvents( &Event );
    }
    SDL_Delay(1);
}

Автор: AntZ 24.1.2008, 00:11
2 antropod.
Спасибо за совет!!! Пожалуй посмотрю что можно сделать с ее помощью... Единственное но... Преподы знают тока ОпенГЛ, точнее лишь Глют... Поэтому SDL буду использовать только для себя smile
Однако, может, я его еще не знаю... Вдруг это решение...

Вопрос еще открыт...

Автор: Rickert 28.1.2008, 08:12
AntZ, мой совет, не использовать glut. Я всегда его обхожу. Стандартная Xlib библиотека и прикручивай к ней OpenGL.
Не вижу необходимости в использовании glut.
Поставь на машину vmware и разверни на ней линукс, там и кодь.

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