LINUX.ORG.RU

[C][OpenGL]Программа тормозит при закрытом stderr

 ,


0

0

Написал программу на C с использованием OpenGL под X Window.
Программа рисует вращающийся треугольник.

Если запускать её из консоли - работает замечательно.
Если - из файлового менеджера (PCManFM, Konqueror) - подтормаживает.
Если запустить из консоли с перенаправлением stderr в /dev/null (2>/dev/null) или в самой программе закрыть stderr (fclose(stderr)) - эффект тот же.
Тормоза выглядят так - падает FPS и скорость реакции на нажатия клавиш на клавиатура/закрытия окна.

Воспроизводится на 32-х битном Debian Lenny под VirualBox и 64-х битном openSUSE 11.0 c ATI X800 видеокартой с последними драйверами.
На openSUSE 11.1 с nVidia 6600 - не воспроизводится (возможно это связано с тем, что процессор на этом компе более быстрый).

Есть идеи почему так происходить и как это исправить?

Если запустить из консоли с перенаправлением stderr в /dev/null (2>/dev/null) или в самой программе закрыть stderr (fclose(stderr)) - эффект тот же.

При перенаправлении в /dev/null дескрипторы не закрывается. Так что тут видимо дело не в том, что stderr закрыт.

Тормоза выглядят так - падает FPS

Как смотреть FPS в твоей программе?

и скорость реакции на нажатия клавиш на клавиатура/закрытия окна.

Fedora 11 amd64, nVidia Corporation GeForce 9500M GS [10de:0405] (rev a1) - проблема не наблюдается.

Вопрос: у тебя KDE? А там спецэффекты случайно не включены?

Deleted
()
Ответ на: комментарий от Deleted

FPS никак нельзя посмотреть, он падал чисто визуально.

Там где я сейчас - LXDE в Debain Lenny в VirtualBox без эффектов. Там где ATI X800 - KDE в openSUSE 11.0 без эффектов. Там где nVidia 6600 - KDE в openSUSE 11.1 без эффектов.

У меня есть ещё другая аналогичная программа, в ней такой проблемы не наблюдается. Отличаются они тем что в той в которой проблема - один поток. В которой проблемы нету - два потока - один рисует, другой эвэнты обрабатывает. Может это как-то связано?

LinuxUser ★★★
() автор топика
Ответ на: комментарий от LinuxUser

У меня есть ещё другая аналогичная программа, в ней такой проблемы не наблюдается. Отличаются они тем что в той в которой проблема - один поток. В которой проблемы нету - два потока - один рисует, другой эвэнты обрабатывает. Может это как-то связано?

Может и связано, а может и нет. Попробуй запустить через strace и сохранить весь вывод двух случаях - когда тормозит и когда не тормозит. Может будут какие-то заметные различия...

И кстати, у меня дебажная версия не запускается:

$ ./build/debug/x-window_opengl 
X Error of failed request:  GLXBadDrawable
  Major opcode of failed request:  135 (GLX)
  Minor opcode of failed request:  11 (X_GLXSwapBuffers)
  Serial number of failed request:  21
  Current serial number in output stream:  21

Deleted
()
Ответ на: комментарий от Deleted

У strace вывод одинаковый с перенаправлением и без. Повторяется вот это:

gettimeofday({1253872919, 935733}, NULL) = 0
select(4, [2 3], NULL, NULL, {0, 34367}) = 1 (in [2], left {0, 34367})
read(3, 0x845c8a4, 4096)                = -1 EAGAIN (Resource temporarily unavailable)
gettimeofday({1253872919, 938177}, NULL) = 0
select(4, [3], [3], NULL, NULL)         = 1 (out [3])
writev(3, [{"\217\1\"\0\1\0\0\0\24\0\202\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\200?\10\0\177\0\0"..., 136}], 1) = 136
select(4, [3], [3], NULL, NULL)         = 1 (out [3])
writev(3, [{"\217\v\3\0\1\0\0\0\2\0\340\1"..., 12}], 1) = 12
read(3, 0x845c8a4, 4096)                = -1 EAGAIN (Resource temporarily unavailable)

Сейчас заметил следующее. Если релиз компилить с флагом -O2, а не -Os как было, то проблема не воспроизводится. А в дебажной версии нужно ещё stdout в /dev/null перенаправить чтоб воспроизводилось.

Почему у тебя дебажная версия не запустилась ума не приложу. Она от релиза отличается дебажным выводом и оптимизацией при компиляции.

Мистика какая-то.

LinuxUser ★★★
() автор топика
Ответ на: комментарий от LinuxUser
select(4, [2 3], NULL, NULL, {0, 34367}) = 1 (in [2], left {0, 34367})
           ^
           а откуда тут stderr?

<телепат_моде> Похоже проблема в том, что у тебя fd_set_read в engine_main_loop() не проинициализирован вызовом FD_ZERO() и туда попадают случайные дескрипторы. (Программу не запускал.) </телепат_моде>

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.