Модераторы: Rickert

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ускорение прорисовки в OpenGL, Много сложных объектов 
V
    Опции темы
Anyone
Дата 21.5.2009, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Использую С#+OpenTK.
С помощью OpenGL нужно нарисовать наперед не известное множество относительно сложных объектов и они отличаются), которые можно перемещать по форме. Объекты состоят из линий, закрашенных областей (причем с полу прозрачностью), текста, при их прорисовки используются циклы. В общем пока их не много - меня скорость работы графики устраивает, но если их больше чем штук 30, то при перемещении объекта(ов) (при этом рисую его как полупрозрачный прямоугольник) заметны тормоза. Я так понимаю что это из-за загрузки процессора (грузится наполовину где-то). Можно как нибудь ускорить процесс прорисовки? На ум приходит только одно: все объекты, которые не нужно перемещать сохранить как один фоновый рисунок, а поверх него уже прорисовывать перемещаемые. Или есть другие варианты? Гугл особо не помог, пушо в какую сторону гуглить - я не знаю. 

ЗЫ Что примерно рисую можно посмотреть здесь
PM MAIL   Вверх
kemiisto
  Дата 21.5.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: нет
Всего: 160



Цитата(Anyone @  21.5.2009,  11:35 Найти цитируемый пост)
в какую сторону гуглить - я не знаю

Гуглить "списки отображения opengl" ("opengl display list"). В уроках NeHe - урок 12, в OpenGL "Red Book" - глава 7.


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Anyone
Дата 21.5.2009, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



kemiisto
Спасибо, буду разбираться.
У меня возник другой вопрос, немного не по теме, но спрошу.
Я хотел бы в своем приложении использовать несколько слоев для прорисовки (к примеру фоновый, статические элементы, динамические элементы). Для этих целей можно использовать списки отображения, или есть более подходящие решения?
PM MAIL   Вверх
Anyone
Дата 21.5.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Проблемка возникла.
Вот моя функция создания списков отображения:
Код

        void BuildLists()
        {
            _genList = GL.GenLists(3);
            GL.NewList(_genList, ListMode.Compile);
            DrawGradientBackGround(Color.DarkSeaGreen, Color.DarkGreen, 4);
            GL.EndList();
            
            GL.NewList(_genList + 1, ListMode.Compile);
            DrawGrid(20.0f, 20.0f, Color.White);
            GL.EndList();
            
            GL.NewList(_genList + 2, ListMode.Compile);
            for (int i = 0; i < blockPointsHelper.Length; i++)
                blockPointsHelper[i].Draw();
            GL.EndList();
        }


То что она долго выполняется при запуске программы - стерпеть еще можно. Но вот вызов 3го списка - это уже не допустимо:
            GL.CallList(_genList+2);
Вызываю все списки при перемещении мыши. Использование первых 2х - дают большой прирост производительности, но вот третий приводит к сильной загрузке процессора и неимоверным тормозам. Количество объектов - 50, но даже один дает большие тормоза. BuildLists() вызывается всего лишь 1 раз. Что я делаю не так?

Это сообщение отредактировал(а) Anyone - 21.5.2009, 15:59
PM MAIL   Вверх
Anyone
Дата 24.5.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



С причиною тормозов разобрался - много текста прорисовываю. Но это мне очень нужно. Какой наилучший способ быстрого вывода текста с возможностью масштабирования, желательно с заданным шрифтом? При этом для меня важна кроссплатформенность.

Это сообщение отредактировал(а) Anyone - 24.5.2009, 22:13
PM MAIL   Вверх
Nofate
Дата 27.5.2009, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 13.10.2008

Репутация: нет
Всего: 8



Freetype http://www.freetype.org
GLTT http://gltt.sourceforge.net

а чем сейчас текст рисуется?


--------------------
The future is not set, there is no fate but what we make for ourselves.
Нофейтово пространство и смежные области 
PM MAIL WWW ICQ   Вверх
Anyone
Дата 27.5.2009, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Цитата(Nofate @  27.5.2009,  12:10 Найти цитируемый пост)
а чем сейчас текст рисуется? 


          _printer.Begin();
            _printer.Print("Block", _font, Color.Black,
                _rectTitle, TextPrinterOptions.Default, TextAlignment.Center);
            _printer.Print(Left.ToString() + ";" + Top.ToString(), _font, Color.Black,
                _rectFooter, TextPrinterOptions.Default, TextAlignment.Center);
          _printer.End();

Использую библиотеку OpenTK.
На форме может быть много объектов, которые, в свою очередь, содержат в себе несколько текстовых блоков, котрые выводятся в цикле.
PM MAIL   Вверх
arilou
Дата 29.5.2009, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



Цитата(Anyone @  27.5.2009,  12:18 Найти цитируемый пост)
    _printer.Begin();
            _printer.Print("Block", _font, Color.Black,
                _rectTitle, TextPrinterOptions.Default, TextAlignment.Center);
            _printer.Print(Left.ToString() + ";" + Top.ToString(), _font, Color.Black,
                _rectFooter, TextPrinterOptions.Default, TextAlignment.Center);
          _printer.End();


Предлагаю вывод всего текста врапить в один Begin/End (или группировать в несколько по используемым стилям). Проблема стопудово в том, что ты для каждого блока отдельный цикл делаешь. Это ведет к переключению render states, а это напрямую влияет на производительность.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Anyone
Дата 29.5.2009, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Цитата(arilou @  29.5.2009,  01:26 Найти цитируемый пост)
Предлагаю вывод всего текста врапить в один Begin/End 

Если бы это было возможным, я бы так и сделал.

Цитата(arilou @  29.5.2009,  01:26 Найти цитируемый пост)
Проблема стопудово в том, что ты для каждого блока отдельный цикл делаешь. 

Это не проблема, а всего лишь не значительная потеря производительности.
Сам проверял и это я обсудил на форуме офф сайта враппера.

Думаю текстурные шрифты намного бы улучшили производительность, но насколько я понял (опять же из того форума), обертка не позволяет этого сделать, по крайней мере так, как это обычно делается.

Есть ли какие-нибудь способы создания текстурных шрифтов без привязки к платформе?
Ну или накрайняк загрузить текстуры в списки отображения?

Я только начал изучение OpenGL, так что не судите меня строго  smile 
PM MAIL   Вверх
arilou
Дата 29.5.2009, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



Anyone, м.б. имеет смысл попробовать CEGUI# для GUI? там вроде как реализованы текстурные шрифты. 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Anyone
Дата 29.5.2009, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Цитата(arilou @  29.5.2009,  20:27 Найти цитируемый пост)
м.б. имеет смысл попробовать CEGUI# для GUI?

Мне нужна максимальная производительность, так как мне придется перерисовывать окно при перемещении мыши, чем тупее либа - тем лучше, потому не хочу еще что-либо дополнительно ставить
PM MAIL   Вверх
arilou
Дата 30.5.2009, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



Anyone, ну тогда засучивай рукава -- тебя ждет много интересного при реализации всего этого самостоятельно  smile 


Цитата(Anyone @  29.5.2009,  22:26 Найти цитируемый пост)
, чем тупее либа - тем лучше, потому не хочу еще что-либо дополнительно ставить 

перечитал 2 раза, ничего не понял


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Nofate
Дата 31.5.2009, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 266
Регистрация: 13.10.2008

Репутация: нет
Всего: 8



arilou, видимо имелось ввиду, что чем меньше в библиотеке "обвеса" и наворотов, тем шустрее все будет в конечном счете работать.


--------------------
The future is not set, there is no fate but what we make for ourselves.
Нофейтово пространство и смежные области 
PM MAIL WWW ICQ   Вверх
arilou
Дата 1.6.2009, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



Nofate, разработчики middleware врядли согласятся  smile 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Anyone
Дата 1.6.2009, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Попробывал все тоже самое реализовать с Tao.Framework и Tao.FreeType. Скачал враппер для работы с шрифтами 
отсюда FTclass.cs и меня, в принципе, все устраивает, кроме одного - не могу загрузить шрифт, используется стандартный я так понял, потому что даже если задать не правильное имя - шрифт такой же. При этом некоторые буквы вообще выглядят странно.
Вот как я использую:
ftFont = new FTFont(@"D:\WINDOWS\Fonts\TAHOMA.TTF", out Success);
ftFont.ftRenderToTexture(10, 300);

Есть идеи?

ЗЫ. Писал в саппорт ОпенТК по поводу скорости работы текста. Добавили кеширование с помощью списков отображения при использовании TextPrinter, работает заметно быстрее, гдето так же, как и в Tao.Framework + Tao.FreeType, но последняя связка мне больше нравится, потому что текст хорошо масштабируется и работает все таки быстрее (особенно при загрузке формы и изменении ее размеров).

ЗЫ2. Мой вопрос по поводу FTFont.Write() отпал, потому запостил в этой теме.
PM MAIL   Вверх
Anyone
Дата 1.6.2009, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Разобрался с предыдущим вопросом.
Ждите следующие  smile 

Это сообщение отредактировал(а) Anyone - 1.6.2009, 18:55
PM MAIL   Вверх
fomich0ff
Дата 19.6.2009, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.6.2009

Репутация: нет
Всего: нет



Anyone, позвольте полюбопытствовать вы ушли все-таки от использования OpenTK или используете TAO и OpenTK совместно? И как процесс? продвигается?

Это сообщение отредактировал(а) fomich0ff - 19.6.2009, 08:14
PM MAIL   Вверх
Anyone
Дата 19.6.2009, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Я использую сейчас ТАО - как по мне - быстрее работает, кроме того команды выглядят как по стандарту, легко переносить из других языков программирования.

Задачу решил частично, пушо мне некогда было сидеть над ней.
Пока обошелся рисованием реверсивных объектов, если их нужно перемещать.
Дальше в планах попытаться седлать скриншет статических объектов, создать такую вот текстуру, и поверх нее рисовать уже объекты, которые перемещаются, такой пример на другом форуме я нашел.
PM MAIL   Вверх
fomich0ff
Дата 1.7.2009, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.6.2009

Репутация: нет
Всего: нет



Anyone, не могли бы Вы ткнуть носом что я делаю не так?
Сейчас я пытаюсь вывести хоть какой-нибудь текст с помощью Tao + FTclass. Скачал пример отсюда, но почему-то у меня весь текст выводится в виде пустых квадратиков (и английский и русский). Я пробовал делать как Вы указывали чуть выше, но результат такой же - квадратики. Вы с такой проблемой не сталкивались? Может надо включить какой-то режим?

ЗЫ. Кстати все пути к шрифтам я изменил на соответствующие для моей машины.

Это сообщение отредактировал(а) fomich0ff - 1.7.2009, 12:43
PM MAIL   Вверх
Anyone
Дата 1.7.2009, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Таких проблем у меня не было.
Нужно код смотреть.
PM MAIL   Вверх
fomich0ff
Дата 1.7.2009, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.6.2009

Репутация: нет
Всего: нет



Ну вобщем-то в коде примера я изменил только пути к шрифтам и все. Единственное на что я могу грешить - на библиотеку freetype6.dll. Она требовалась для запуска примера. Я ее нашел в либах TeX'a. Может версия не та. Может еще что...
PM MAIL   Вверх
Anyone
Дата 1.7.2009, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Я сделал так.
Библиотеку скачал тут
Кинул в папки проекта Debug, Release файлы со шрифтами и такие dll-ки: freetype6.dll, Tao.FreeType.dll, zlib1.dll.
После этого все стало нормально работать.

Добавлено через 2 минуты и 18 секунд
zlib1.dll можно посмотреть тут: \Program Files\TaoFramework\lib
PM MAIL   Вверх
fomich0ff
Дата 1.7.2009, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.6.2009

Репутация: нет
Всего: нет



Спасибо. Завтра попробую.
PM MAIL   Вверх
fomich0ff
Дата 22.7.2009, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.6.2009

Репутация: нет
Всего: нет



Долго отсутствовал, потому что не было инета. Значит пишу отчет: на моем компе вывод текста не работает. На других компах все работает нормально. Грешу на то что у меня встроенная видюха и, возможно, кривые дрова. На остальных копмах все карточки внешние. Вобщем засада.
PM MAIL   Вверх
Anyone
Дата 22.7.2009, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Цитата(fomich0ff @  22.7.2009,  10:12 Найти цитируемый пост)
Грешу на то что у меня встроенная видюха и, возможно, кривые дрова.

Не работает только текст, или графика вообще?
У меня тоже слабенькая видяха в ноуте, многие расширения не держит.
PM MAIL   Вверх
fomich0ff
Дата 22.7.2009, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.6.2009

Репутация: нет
Всего: нет



Графика работает. Медленно, но работает. А вот с текстом чудеса - вместо букв выводит прямоугольники. На других компах буквы видны.
PM MAIL   Вверх
Anyone
Дата 22.7.2009, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Цитата(fomich0ff @  22.7.2009,  12:57 Найти цитируемый пост)
 А вот с текстом чудеса - вместо букв выводит прямоугольники. 

Насколько я помню, у других тоже были такие проблемы.
Попробуй кинуть файл шрифта в папку с ехе-файлом и проверить статус успешности инициализации библиотеки.
А еще лучше обратится на форуме OpenTK - там обычно помогают решить проблемы, если есть знание английского канеш.

Это сообщение отредактировал(а) Anyone - 22.7.2009, 14:11
PM MAIL   Вверх
fomich0ff
Дата 22.7.2009, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.6.2009

Репутация: нет
Всего: нет



Ага, спасибо. Попробую.
За этот месяц я чего только не перепробовал. Пока отрисовку текста отложил в сторону. 
У меня возник такой вопрос:
Предположим на экране рисуются несколько тысяч примтивов (треугольники, квадраты, звездочки и т.п.). Все имеют одинаковый видимы размер (например 20х20 пикселей). Как сделать так чтобы при масштабировании (glScaled) всей сцены все эти примитивы не изменяли видимых размеров (т.е. на экране они оставались так же 20х20 пикселей). Пример может быть таким: предположим есть карта какой-нибудь страны. На этой карте звездочками помечены крупные города. Так вот надо, чтобы карта страны масштабировалась, а звездочки - нет (т.е. всегда оставались одного и того же размера).
Надеюсь я понятно объяснил суть проблемы.

PM MAIL   Вверх
Anyone
Дата 22.7.2009, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Цитата(fomich0ff @  22.7.2009,  16:07 Найти цитируемый пост)
ак сделать так чтобы при масштабировании (glScaled) всей сцены все эти примитивы не изменяли видимых размеров

Очень просто. Если вся сцена масштабируется в n раз, то те примитивы, которые не должны масштабироваться, нужно промасштабировать в 1/n раз
PM MAIL   Вверх
fomich0ff
Дата 22.7.2009, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.6.2009

Репутация: нет
Всего: нет



Цитата(Anyone @ 22.7.2009,  16:10)
Очень просто. Если вся сцена масштабируется в n раз, то те примитивы, которые не должны масштабироваться, нужно промасштабировать в 1/n раз

Значит я правильно думал =) Я так понимаю, что с текстом точно так же? Т.е. чтобы он оставался всегда одного и того же размера нужно масштабировать его в 1/n раз? Я надеялся, что есть какие-то скрытые возможности у OpenGL.
Тогда такой вопрос: есть ли быстрый способ проверить попадает ли рисуемый объект (точка, треугольник, полигон и т.д.) в видимую область или нет? т.е. стоит его рисовать или можно перейти к следующему объекту? Потому что если у меня на схеме 40000 элементов, а отрисовать надо только 1000, то зачем тратить время на остальные 39000.
А! Вот при изучении списков у меня возник такой вопрос (уж не знаю сможете ли Вы на него ответить): я так понял, что каждый конкретный список компилируется в набор команд, понимаемых видеокартой (возможно он при этом еще и оптимизируется). А где все эти откомпилированные списки хранятся? И есть ли какое-нибудь ограничение на количество списков?

Это сообщение отредактировал(а) fomich0ff - 22.7.2009, 16:47
PM MAIL   Вверх
Anyone
Дата 22.7.2009, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



К сожалению, я не могу ответить на все вопросы, поскольку я лишь поверхностно изучал OpenGL и вскоре и вовсе понял что это не то, что мне нужно, и прекратил изучение данной технологии.

По поводу текста в OpenGL вообще нету встроенной поддержки, потому приходится извращаться разными способами, и они не позволяют выводить быстро изменяющийся текст в больших масштабах, что мне очень нужно. 

Поэтому советую по своим вопросам создавать отдельные темы - больше шансов что кто-нибудь ответит  smile 


Цитата(fomich0ff @  22.7.2009,  16:41 Найти цитируемый пост)
Я так понимаю, что с текстом точно так же?

Естессно
PM MAIL   Вверх
fomich0ff
Дата 22.7.2009, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.6.2009

Репутация: нет
Всего: нет



в любом случае большое спасибо ;)
PM MAIL   Вверх
ShellRaiser
Дата 23.7.2009, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


еще чуть и закоммичу
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 20.7.2007
Где: Белaрусь, Гродно

Репутация: 1
Всего: 1



Anyone, я конечно понимаю что тема уже закрыта, но добавлю что отрисовывая списками ты нехило теряешь производительность, лучше отрисовывай массивами а ещё если их отрисовывать через VBO (Vertex Buffer Object). Он даст сильный прирост производительности при отрисовке сложных моделей (в плане количества полигонов)
темболее если у тебя видиокарта начиная от mx440 то всё должно поддерживаться =)

Это сообщение отредактировал(а) ShellRaiser - 23.7.2009, 15:19
PM MAIL ICQ Skype   Вверх
Anyone
Дата 23.7.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



ShellRaiser
Во-первых, от OpenGL я давно отказался в пользу WPF, потому я ничего не теряю в производительности  smile . 
Во-вторых, моя видяха/дрова не держат FBO и VBO.

Это сообщение отредактировал(а) Anyone - 23.7.2009, 15:26
PM MAIL   Вверх
ShellRaiser
Дата 23.7.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


еще чуть и закоммичу
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 20.7.2007
Где: Белaрусь, Гродно

Репутация: 1
Всего: 1



Anyone, я просто видел что ктото советовал через списки выводить, и решил предложить пример по-лучше;)
а WPF на OpenGL основанна? или обёртка хорошая?smile
PM MAIL ICQ Skype   Вверх
Anyone
Дата 23.7.2009, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Цитата(ShellRaiser @  23.7.2009,  15:46 Найти цитируемый пост)
а WPF на OpenGL основанна? или обёртка хорошая?

На DirectX. Это не обертка, это новая технология от Microsoft для создания интерфейса на основании языка xaml.
PM MAIL   Вверх
ShellRaiser
Дата 24.7.2009, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


еще чуть и закоммичу
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 20.7.2007
Где: Белaрусь, Гродно

Репутация: 1
Всего: 1



Спасибо, буду знать;)
PM MAIL ICQ Skype   Вверх
VC15
Дата 6.8.2009, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 4.8.2009

Репутация: нет
Всего: нет



Цитата

 Как сделать так чтобы при масштабировании (glScaled) всей сцены все эти примитивы не изменяли видимых размеров


Ну я бы сделал так:
Код

glPushMatrix();
  glScaled(4, 4, 4);
  outputScene();
glPopMatrix();
outputPrimitives();


Команды glPushMatrix и glPopMatrix очень полезны для таких вещей, которые тебе нужны.

Цитата

есть ли быстрый способ проверить попадает ли рисуемый объект (точка, треугольник, полигон и т.д.) в видимую область или нет?

Что значит быстрый способ? "Быстрый" - понятие относительное. Сразу могу ответить вот что. Если ты выводишь 3D-сцену, то ты задаёшь видимый объём командой glFrustum (или glOrtho, или gluPerspective). Можешь у себя в проге при выводе каждого примитива проверять, попадает ли он в видидмый объём. Правда эту же проверку осуществляет OpenGL, так что не знаю, что быстрее. Вообще, есть разные способы сокращения числа выводимых примитивов, я их не очень хорошо знаю. Мне приходилось пользоваться только отсечением по расстоянию. То есть ты считаешь расстояние от точки взгляда до выводимого примитива, и если оно больше некоторой константы, то не выводишь этот примитив.
PM MAIL   Вверх
fomich0ff
Дата 6.8.2009, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.6.2009

Репутация: нет
Всего: нет



VC15, спасибо.


Цитата(VC15 @  6.8.2009,  16:01 Найти цитируемый пост)
Что значит быстрый способ? "Быстрый" - понятие относительное. Сразу могу ответить вот что. Если ты выводишь 3D-сцену, то ты задаёшь видимый объём командой glFrustum (или glOrtho, или gluPerspective). Можешь у себя в проге при выводе каждого примитива проверять, попадает ли он в видидмый объём. Правда эту же проверку осуществляет OpenGL, так что не знаю, что быстрее.


У меня что-то типа векторного графического редактора. Назначение: проектирование схем трубопроводов. Там не надо 3D. Там все на плоскости. Так вот практически все графические объекты в течении своей жизни не меняются, а стало быть их удобно выводить в виде списка отображения (или дисплейного списка). Так вот я тестил производительность на 20000 полигонов. Если пробегать весь массив и тупо рисовать каждый полигон (независимо от того виден он или нет), то такой способ работает медленнее чем если выводить только те несколько сотен полигонов, которые видны. Так вот основная загвоздка заключается в том - как быстро выбрать из общего массива полигонов те, которые необходимо рисовать. Т.е. не тупым перебором, а спомощью какого-нить хитрого алгоритма. ;)
Эту проблему я пока не решил.  smile 

PM MAIL   Вверх
arilou
Дата 6.8.2009, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



fomich0ff, а какие условия выборки?


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
fomich0ff
Дата 7.8.2009, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.6.2009

Репутация: нет
Всего: нет



arilou, я, если честно, не очень понял, что от меня требуется =)
Вобщем у меня есть массив примитивов (допустим это произвольные полигоны). У каждого примитива есть прямоугольная область (в мировых координатах), в которую он вписан. Естественно известны всякие параметры типа цвет примитива, цвет его границы, толщина границы и т.д. Так вот я так думаю, что выбирать примитивы надо используя именно эту прямоугольную область. Вот только как это сделать не используя прямой перебор? Не знаю. Буквально минут 20 назад нашел статью про octree. Думаю попробовать. Может есть еще подобные алгоритмы?
PM MAIL   Вверх
arilou
Дата 7.8.2009, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



fomich0ff, так тебе нужно определить, какие полигоны не попадают в экранную область? я бы держал список видимых объектов и обновлял его только когда меняется положение камеры.

а вообще, если полное 2Д -- зачем тогда OGL?


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
fomich0ff
Дата 7.8.2009, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.6.2009

Репутация: нет
Всего: нет



Цитата(arilou @  7.8.2009,  11:22 Найти цитируемый пост)
fomich0ff, так тебе нужно определить, какие полигоны не попадают в экранную область? я бы держал список видимых объектов и обновлял его только когда меняется положение камеры.

Ну вобщем-то это я и пытаюсь сейчас реализовать с помощью octree.

Цитата(arilou @  7.8.2009,  11:22 Найти цитируемый пост)
а вообще, если полное 2Д -- зачем тогда OGL? 

GDI/GDI+ работают медленно. Особенно когда сложная сцена с большим количеством полигонов с большим количеством вершин. Уже испытано. После долгих поисков/экспериментов остановился на OGL 
PM MAIL   Вверх
arilou
Дата 7.8.2009, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



Цитата(fomich0ff @  7.8.2009,  11:30 Найти цитируемый пост)
Ну вобщем-то это я и пытаюсь сейчас реализовать с помощью octree.

так у тебя же плоский список и фактически 2D сцена? octree - это больше для 3D используют, когда глубина присутствует. например, в террейнах для оптимизации кол-ва полигонов и отсечении невидимых.
т.е. в твоем случае, имхо, простой перебор по запросу вполне должен проканать. 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
fomich0ff
Дата 7.8.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 19.6.2009

Репутация: нет
Всего: нет



arilou, должен, но не канает - медленно =(
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.1439 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.