![]() |
|
Модераторы: Rickert |
![]()
|
|
| Tror |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 29.4.2005 Где: Кишинёв Репутация: нет Всего: 4 |
Доброго времени суток, уважаемые игроделы.
Программированием графики занялся недавно и поэтому вопровов пока больше чем ответов. Начал я с уроков NeHe. На днях заметил одну странную особенность программ на OpenGL -- даже каркас приложения неотображающий ничего грузит проц на все 100 %. Сначала я подумал, что хромает моя реализация программы, но потом запустил екзешник от NeHe -- картина та же самая. Почему так происходит? --------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;) |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 3 Всего: 43 |
Видеокарта без поддержки 3D, вот оно видимо и грузит проц.
|
|||
|
||||
| srd |
|
||||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: нет Всего: 49 |
Корень зла в цикле выборки сообщений. Следующая программа (заметьте, ничего общего не имеющая с OpenGL, DirectX, 3D и прочим) грузит процессор. В примерах от NeHe используется практически точно такой же код для цикла выборки оконных сообщений.
Проблема в том, что цикл крутится вхолостую даже тогда, когда нет оконных сообшений в очереди. Нагрузку можно снизить так (по мотивам примеров из DirectX SDK):
Идея в том, что когда наше приложение не активно, то очередное оконное сообщение выбирается из очереди функцией GetMessage, а не функцией PeekMessage. GetMessage() не возвращает управление, пока не будет получено оконное сообщение, благодаря чему в неактивном приложении цикл останавливается. У меня на машине первый вариант грузит проц на 100% не зависимо от того, активно ли приложение, или нет. Если работает второй вариант, то стоит переключиться на другое окно, как нагрузка падает до 0%. Это сообщение отредактировал(а) srd - 24.10.2005, 14:05 -------------------- Не смей читать мою подпись!!! |
||||
|
|||||
| Tror |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 29.4.2005 Где: Кишинёв Репутация: нет Всего: 4 |
Ну вроде кое-что проясняется. Но всё же мне не нравится тот
факт, что когда окно активно оно все равно жрёт 100%. Видюха у меня далеко не топовая (GeForce 256 32Mb + дрова от Nvidia), но насколько я знаю у неё есть 3д ускоритель. Насколько я знаю в дровах должна быть аппаратная поддержка OpenGL. Может быть по умолчанию включается софтварный режим. И как вообще это можно узнать? Заранее благодарен. --------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;) |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
а почму бы и не съедать 100%, когда человек смотри 3d эффекты
ведь производительность не просто пропадает, она используется для повышения качества... т.е. если пользователь, например, загрузит игрушку, а она ему грузит процессор на 50%, он спросит "почему не используются остальной ресурс процессора, чтобы сделать все еще красивее?" Добавлено @ 15:59 конечно, совсем другое дело, если параллельно должны работать другие потоки или процессы... тогда уже надо как-то специфически регулировать распределение времени процессора... -------------------- qqq |
|||
|
||||
| Mad |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: нет Всего: 19 |
в обоих фразах нет полного понимания принципа распределения процесорного времени между приложениями. Tror 100% загрузки - это не загрузка проца обним приложением, а показатель того, что все процесорное время занято приложениями (всеми в сумме, а не только этим), к томуже идет реч именно о времени, а не о выч. способности например, несмотря на полную загрузку проца, остальные приложения в это время выполняються у тебя без особых тормозов Добавлено @ 16:56
Режим рендера только аппаратный (софтовая эмуляция присутсвует только в DirectX, в OpenGL ее и в помине нет) |
||||||
|
|||||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
просто я имел в виду такую ситуацию:
у игры (что поделаешь, это - первое что приходит в голову один из них - поток работы с графикой но ведь другой поток вполне может оказаться более важным (ситуации всякие бывают) тогда, нужно будет приостанавливать графический поток, т.к. он работает над полезным, но не необходимым повышением качества
далеко не факт если есть приложение, которому нужно много процессорного времени (например, компиляция чего-то большого), то запуск подобного графического приложения может привести к замедлению первого раза в два... это я и подразумевал под специальными ситуациями... -------------------- qqq |
|||
|
||||
| Mad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: нет Всего: 19 |
опять таки, не стоит путать понятия процессорное время,и нагрузка процессора, это разные вещи |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
да, выразился не очень хорошо просто у меня сейчас, например, есть одно приложеньице, которое компилится куча времени и занимает процессор, как может, и это, конечно, сказываетя если я, например решу в это время поархивировать что-нибудь... так что имелось в виду и нагрузка и время -------------------- qqq |
|||
|
||||
| Tror |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 29.4.2005 Где: Кишинёв Репутация: нет Всего: 4 |
Да, признаюсь что тоже выразился не совсем корректно по
поводу процессорного времени, но ситуация для меня потихоньку проясняется. Спасибо всем кто не прошёл мимо и постарался помочь. Но тут по ходу чтения у меня возник ещё один вопросец: Как я понимаю основная ф-ция render() выполняется в отсутствие каких бы то ни было сообщений, т.е. всё свободное время уходит на отрисовку сцены и чем больше раз выполняется render(), тем больше fps. Собственно вопрос: если имеется довольно мощная видюха и проц, то fps бывает зашкаливает за нормальные 50-60(сам видел у друга на X850 fps = 500), т.е. мощность тратится впустую. Можно ли ограничивать fps каким то определённым значением, а всё оставшееся время использовать для расчётов. И, вообще, целесообразно ли исползовать многопоточность в графических приложениях. Если что не так поправьте. Заранее благодарен. --------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;) |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
очень просто: 1. делаешь WaitableTimer на 1/50 секунды (для 50 fps) 2. вызываешь render() 3. вызываешь WaitForSingleObject если render() отработала быстрее, оставшееся время поток будет заморожен и процессор ним использоваться не будет если за 1/50 не успела, WaitForSingleObject сразу возвратится, и сразу начнется обработка следующего кадра P.S. про все, что связано с WaitableTimer и WaitForSingleObject можно почитать в MSDN... -------------------- qqq |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: нет Всего: 49 |
maxim1000
А есть гарантия, что в результате "замораживания" основного потока с помощью WaitForSingleObject() активизируются другие потоки именно нашего приложения, а не какого-нибудь постороннего? -------------------- Не смей читать мою подпись!!! |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
я не знаю тонкостей алгоритмов распределения процессорного времени между потоками и процессами Windows, но думаю, такой гарантии не будет с другой стороны, если в это время не будет запущено каких-то "все время что-то делающих" приложений, наверное, бОльшая часть отойдет нашим (если они не будут замороженны, конечно) Добавлено @ 14:17 можно, конечно, чего-нибудь поколдовать с приоритетами, но я с ними не работал... -------------------- qqq |
|||
|
||||
| DENNN |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 3 Всего: 43 |
Вы вообще как себе многозадачность представляете? Это все равно что сравнивать линейное программирование и ООП. На ваш процес выделяется некоторое количество квантов процессорного времени. Другие процессы выполняются теоретически "параллельно". Если ваша задача не будет требовательна к ресурсам, а их в системе будет нехватка, то процеесороное время будет отданно процессу с большим приоритетом. Внутри процееса квант распеределяется между потоками. Не считая того, что процов может быть два или пень с HP. Тогды часть процессов в некоторыемоменты времени может выполняться одновременно для двух разных задач.
Честно говоря в лом разбираться в коде, но нужно иметь в виду, что в хорошем OGL приложении сцена перерисовывается в двух случаях: 1)По требованию ОС перерисовать часть окна или все окно целиком. 2)Если изображение изменилось |
||||
|
|||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: нет Всего: 49 |
Тут я запутался. "Квант" выделяется именно процессу, а не потоку? Т.е. под "квантом" подразумевают обычно нечто неделимое, как он может распределяться между потоками? -------------------- Не смей читать мою подпись!!! |
|||
|
||||
| srd |
|
|||
![]() Нереварин ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 951 Регистрация: 30.8.2003 Где: Владивосток Репутация: нет Всего: 49 |
У Рихтера:
-------------------- Не смей читать мою подпись!!! |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 3 Всего: 43 |
Под квантом понимается временной отрезок, в течении которого управление будет переданно процессу и не будет выполняться проверка о необходимости передачи управления другому процессу. Как расперделяется время медлу потоками внутри процесса - вопрос немножко другой. Неделимым может быть отрезок и в 2 кванта и более. Обычно квант - верменной промежуток, меньше которого квантовать время не отимально. Это все грубо и достаточно неточно, но как суме, так и сказал. ...
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 7 Всего: 232 |
Почитал тут посты, возникло предложение (не пинайте ногами сильно): что мешает перерисовывать кадр только когда это надо ? Например, мышка не двигалась, объекты в сцене не изменили своё положение, эффекты "молчат" -- нафига рисовать "поверх" того же самого ?
З.Ы, можно простым способом сделать: глобальная статическая переменная типа HANDLE с каким-нибудь объектом синхронизации, и ждущий поток. Поток рендерит кадр, потом "засыпает" в WaitForSingleObject. Если другие потоки, к примеру, передвинули камеру или объект в сцене - они сигналят первому потоку, он просыпается и рендерит ещё один кадр
Именно это и получится, если сделать как я предложил. Сигналить-то можно с любой требуемой скоростью. -------------------- ![]() |
|||
|
||||
| Tror |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 29.4.2005 Где: Кишинёв Репутация: нет Всего: 4 |
Даа
здесь написали. Большое всем спасибо -- дали пищу для размышлений. Всё, пошёл разбираться. --------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;) |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 2 Всего: 110 |
о распределении времени:
я просто представил себе два возможных способа распределения времени: 1. глобально между процессами (независимо от количества активных потоков) и внутри них уже свои локальные шедулеры, которые делят полученное время между потоками 2. просто между процессами в первом случае от замораживания потока доля процесса в использовании процессора не меняется, значит, при замораживании одного из потоков, его время будет распределено между остальными потоками этого же процесса во втором случае усыпление одного из потоков приведет к распределению его части процессорного времени между всеми потоками в системе, а значит к потокам нашего процесса попадет только часть
насколько я понимаю, речь идет именно о моментах, когда что-то меняется, например, летят ут... пули, чем чаще будем менять картинку, тем плавнее они будут лететь... и если моментов, когда вообще ничего не меняется становится ощутимая часть, тогда стоит подумать о какой-то специальной обработке (т.е. отключении отрисовки) этой ситуации... другой вопрос - а часто ли такие моменты встречаются? -------------------- qqq |
|||
|
||||
| DENNN |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 3 Всего: 43 |
Читаем внимательно пердыдущую страницу:
|
||||
|
|||||
| Tror |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 29.4.2005 Где: Кишинёв Репутация: нет Всего: 4 |
сообщения из очереди. Если использовать PeekMessage, то в таскмане отображается использование проца на 100%, если же использовать GetMessage, то всё в порядке. Но тут возникает проблемка: при использовании PeekMessage всё в норме, а при GetMessage рабочая область программы закрашивается тем что было до нее на экране(окна, десктоп и тд). Посмотрел в win32sdk help, там в ремарках к PeekMessage написано только то что он не ждёт окончания обработки сообщения в отличие от GetMessage. Глубже мне не удалось разобраться ввиду отсутствия MSDN(но вроде обещали подогнать), а пользоваься им в онлайне нет возможности. То maxim1000: С днём рождения Это сообщение отредактировал(а) Tror - 26.10.2005, 21:01 --------------------
Не говори всегда что знаешь, но знай всегда что говоришь. /Клавдий/============================================Кто может -- тот делает. Кто не может... тот получает сертификат MCSE ;) |
|||
|
||||
![]()
|
| Правила форума "Программирование игр, графики и искуственного интеллекта" | |
|
|
НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |