|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
24.01.2020, 11:20 | #1 |
Форумчанин
Регистрация: 13.02.2012
Сообщений: 867
|
OpenGL проседает FPS при выборе объектов
Здравствуйте.
Написал программу с использованием OpenGL, в которой рендерятся кубы. Количество кубов составляет 256х256х16. Теперь необходимо сделать выбор объектов. Чтобы когда камера смотрит на какую-то грань куба, эта грань подсвечивалась другим цветом (или текстурой - не важно). Перечитав много информации на эту тему, до меня наконец дошло как это делается. Один из способов - это использование буфера выбора. Смысл в том, что надо переключиться в режим GL_SELECT и нарисовать невидимые грани кубов (без текстуры и без цвета). Желательно рисовать только объекты близкие к камере, иначе FPS упадет до нуля. Потом переключиться обратно в режим GL_RENDER и нарисовать всё то же самое, но с текстурами или просто разными цветами. Потом нужно проанализировать получившийся буфер выбора, найти ближайшую к камере грань куба и подсветить ее. Всё просто. Но при такой операции сильно проседает FPS. Но проблема не именно в том, что он проседает. А в том, что если написать такую же программу на Java, то там FPS проседает не так сильно. То есть, получается странная хрень. Один и тот же код, написанный на Java / C++ выдает разный FPS (при одинаковой позиции камеры). На Java это ~80 FPS, на C++ ~60 FPS. Почему такая большая разница, да к тому же в пользу Java, а не наоборот? Причем, проседает именно на рисовании квадов в режиме GL_SELECT. Если отключить выбор объектов, то на обоих языках FPS примерно одинаковый - ~120 FPS. Это значит, что проблема где-то в коде выбора. код: Код:
|
25.01.2020, 21:07 | #2 |
фрилансер
Форумчанин
Регистрация: 11.10.2019
Сообщений: 980
|
в функции RenderGhostCubeSide тормозить нечему. Разве что внутри функций (я понятия не имею, что это за функции, и что в них)
IsBlockSolid AddVertexQuad Ещё, может, запускаешь дебаг, а не релиз? |
26.01.2020, 11:08 | #3 |
Форумчанин
Регистрация: 13.02.2012
Сообщений: 867
|
Достаёт число (0..255) из массива char*
Смотрите код тесселятора в конце поста. Там кода не много и всё довольно просто. Эта фунеция просто добавляет числа в массив, который потом передается в glDrawArrays(). Это вообще на FPS не влияет. Даже если в консоли вручную компилировать. Выдает примерно 60 FPS. Хотя я флаг оптимизации скорости не ставил (забыл). Сейчас попробую. P.S. Не помогло. Я понимаю. Но куда-то ведь эти 20 FPS деваются. Последний раз редактировалось BLACK_RAIN; 26.01.2020 в 11:58. |
27.01.2020, 10:22 | #4 |
фрилансер
Форумчанин
Регистрация: 11.10.2019
Сообщений: 980
|
упрощай (облегчай) сцену , проверь, поднимется ли при этом fps. Если от количества графики скорость не зависит, может где-то какая-то хитрая настройка, ограничивающая скорость принудительно. Тогда можно не обращать внимания, 60 кадров - этого достаточно для глаз
|
27.01.2020, 16:13 | #5 | |
Форумчанин
Регистрация: 13.02.2012
Сообщений: 867
|
Это и так почти тестовый проект. Там просто массив кубов с текстурой рендерится. Там упрощать нечего. Если отключить выбор объектов, то выдаёт 120 FPS на обоих языках.
Может в тектуре дело? Я не уверен, правильно ли я ее загружаю в С++ но ведь без выбора объектов FPS одинаковый. Цитата:
для глаз-то и 40 достаточно. Но если вводить в сцену дополнительные вычисления, то 20 FPS лишними быть не могут. Последний раз редактировалось BLACK_RAIN; 27.01.2020 в 16:20. |
|
28.01.2020, 08:27 | #6 |
Старожил
Регистрация: 25.08.2011
Сообщений: 2,841
|
Избавляйтесь от циклов. В RenderGhostCubeSides дичь какая то. Есть же glList. Создайте списки рендеринга и потом только их и вызывайте. Удивительно что всего 20 фпс потеряли..
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два. |
28.01.2020, 11:44 | #7 | |
Форумчанин
Регистрация: 13.02.2012
Сообщений: 867
|
Почему дичь? А как тогда перебирать кубы вокруг камеры, если не циклом?
Цитата:
Но на Java тот же самый код эти 20 кадров не теряет. А если отключить выбор объектов, то FPS одинаковый. Тогда не пойму, зачем что-то менять. Ведь тогда в сравении не будет смысла. |
|
28.01.2020, 12:02 | #8 |
Старожил
Регистрация: 25.08.2011
Сообщений: 2,841
|
И что? Видимо разработчики сильно ошиблись когда придумали этот механизм. Движение камеры в 3д это ведь такая редкость.
У меня пару проектов в прошлом с листами сделано где по 500 000 точек рендерится и фпс стабильный. Действительно. Тогда непонятны ваши жалобы. Выбор же очевиден - возьмите жабу и пишите на ней.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два. Последний раз редактировалось WorldMaster; 28.01.2020 в 12:05. |
28.01.2020, 12:09 | #9 | |
фрилансер
Форумчанин
Регистрация: 11.10.2019
Сообщений: 980
|
BLACK_RAIN,
Цитата:
Код:
|
|
28.01.2020, 13:45 | #10 |
Форумчанин
Регистрация: 13.02.2012
Сообщений: 867
|
покажите, где именно я жаловался.
А если менять код, как тогда можно сравнивать FPS? Если их не вызывать, тогда в буфер выбора имена не добавляются. К сожалению. Я же предварительно переключаюсь в режим GL_SELECT. Иначе, как бы тогда выбор объектов вообще работал? Последний раз редактировалось BLACK_RAIN; 28.01.2020 в 14:28. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Перемещение объектов в opengl | Chester751 | Общие вопросы Delphi | 1 | 20.09.2013 20:49 |
Пересечение объектов OpenGL | saggy | Мультимедиа в Delphi | 1 | 02.07.2010 17:02 |
OpenGL. Независимое движение объектов. | Krechet | Мультимедиа в Delphi | 7 | 24.04.2010 21:37 |
Проблема при использовании прозрачности объектов в OpenGL | Gwaeron | Помощь студентам | 0 | 22.04.2010 11:18 |
динамическое создание объектов OpenGl | Seran4ek | Помощь студентам | 2 | 26.11.2009 17:04 |