![]() |
Модераторы: Snowy, Alexeis, MetalFan |
![]() ![]() ![]() |
|
gonzales |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 241 Регистрация: 13.3.2006 Репутация: 1 Всего: 2 |
Доброго времени суток, уважаемые форумчане!
Вопрос выбора технологии для отрисовки 2D графики. Необходимые функции 1. отрисовка растров с прозрачностью 2. возможность работы в альфаканалом: использовать для изображения альфаканал из стороннего файла 3. антиалайсинг 4. слои 5. поддержка windows xp Сейчас проект реализован на GDI+, но все работает достаточно медлено. Например пересчет изображения с учетом полупрозрачной маски уменьшает производительность с 94 до 43 fps, но это полбеды. Эта отрисовка происходит во внутренний буфер, а когда я делаю repain, то есть вывожу содержимое буфера на экран, fps падает до 7-10, а это уже очень критично. Вопросов собственно несколько, может кто-то сталкивался. 1. можно ли выводить битмап на канву быстрее чем
2. Можно ли каким-то образом прикрутить к GDI+ аппаратную акселерацию. 3. Можно ли использовать D2D для вывода, а GDI+ для обработки изображения одновременно В общем, задача несколько размыта, надеюсь на Ваши мысли Заранее спасибо --------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!! |
|||
|
||||
Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 1 Всего: 7 |
GLScene, Asphyre Sphinx или иной движок. Сфинкс поддерживает даже DX11, а я на нем недавно вариацию Lines сделал, на полностью заполненном поле из 240 клеток с 4-хцетными градиентными шарами у меня 200+ fps тянуло, но на днях автор объявил о закрытии проекта, ссылаясь на занятость, так что неясно что с ним будет. :( D2D под XP не работает. Вообще.
Слои, я так понимаю, та же прозрачность? В Corel Photo Paint, например, такого понятия как слой вообще нет, есть просто объекты, которыые от фотошоповых слоев неотличимы. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. ![]() Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
gonzales |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 241 Регистрация: 13.3.2006 Репутация: 1 Всего: 2 |
спасибо, покопаюсь.
а есть ли какая инфа по d2d? я так понял, что firemonkey приложения по умолчанию d2d используют. Добавлено @ 21:43 еще вопросик, по сфинксу можете что-нибудь посоветовать, литературу, примеры заранее спасибо кстати, написанные приложения работают на xp? Это сообщение отредактировал(а) gonzales - 29.5.2013, 21:47 --------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!! |
|||
|
||||
Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 1 Всего: 7 |
D2D это DirectX. Fire Monkey принципиально OpenGL иначе никакой кроссплатформенности не будет. Литература есть по DirectX, гугл решает.
По сфинксу литературы я не видел. Однако там сами исходники очень грамотно написаны и откомментированы. В простейшем случае просто берешь какой-нибудь из примеров, идущих с ним, выкидываешь, оттуда рисовку, загружаешь свои ресурсы (помимо графики он поддерживает создание упакованных ресурных и сеть) и просто вызываешь в ProcessEvent свою обработку логики, а в RenderEvent свою отрисовку. Таймер с синхронизацией там уже готовый. Если игровой подход, когда игра просто шпарит кадры насколько может, периодически вызывая обсчет логики не устраивает, то можно предельный fps ограничить и в принципе я так понимаю, просто отключить таймер и вызывать рисовку, как в GDI Refresh. Само 2D-рисование в принципе такое же, как в GDI, даже в чем-то проще, т. к. не надо 100500 свойств у канваса задавать и всякие буферные битмепы юзать, базовые примитивы есть, только есть тонкости, связанные со сбросом кеша рендеринга и просадкой fps. По крайней мере, это то, что я в простейшем 2D проекте заметил. По GLScene ничего не скажу, но у нее есть русскоязычное сообщество. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. ![]() Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
Alexeis |
|
||||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
D2D это будет Windows Vista+ . В XP эта технология не поддерживается официально.
Она и так там есть, как и в GDI, другое дело, какой уровень оптимизации. Можно и на OpenGL сделать такой вывод, но там удобных средств нет, придется поизучать хорошо и своих преобразований чуток сделать. Зато OpenGL позволит рисовать на векторном контексте с гибким масштабированием. Но вообще и у OpenGL работа с растрами не на высоком уровне. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||
|
|||||
gonzales |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 241 Регистрация: 13.3.2006 Репутация: 1 Всего: 2 |
Beltar, спасибо!!!
буду пробывать Alexeis, я писал в топике про просадку фпс при вызове repaint. Какая оптимизация еще может быть? вот что пишут официально про d2d
то есть получается, что на вин7 автоматически уже используют новую систему рендеринга Direct2D, или же это надо дополнительно подключать в самом приложении и выводить уже явно через Direct2D. К сожалению такой инфы я не нашел Это сообщение отредактировал(а) gonzales - 30.5.2013, 11:19 --------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!! |
|||
|
||||
Beltar |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 1 Всего: 7 |
Мне года 3 назад советовали GDI+. Я попробовал, оказалось, что даже медленнее, чем GDI, по крайней мере на моей задаче. DirectX и, насколько я понимаю, OpenGL напрямую для 2D-графики использовать попахивает мазохизмом, т. к. они работают с вершинами и треугольниками, а базовых примитивов для 2D-графики там нет. Т. е. или сам их делай, или юзай готовый движок.
Я так понимаю, что D2D и есть такой движок, работал бы на XP, думаю, никто бы уже на GDI не писал.
В случае Repaint ИМХО некорректно говорить об fps. Оно ведь рисуется 1 раз и потом может не перерисовываться сколь-угодно долго. Например, ты перетащишь форму, она не будет перерисована. Касательно тормозов и оптимизаций, то можно было код привести, что оптимизировать наверняка найдется.
Если приложение написано в эпоху Win9X и ничего кроме GDI не знает, то и юзать оно будет только GDI. От семерки тут ничего не зависит, она рисует каждое приложение так, как приложение запрашивает. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. ![]() Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
||||
|
|||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Драйвера видео могут оптимизировать операции с растрами даже при использовании GDI . Насколько я помню самая быстрая GDI функция для обновления SetDIBitsToDevice . -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
gonzales |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 241 Регистрация: 13.3.2006 Репутация: 1 Всего: 2 |
Beltar, пробую юзать сфикса. с подгрузкой растров из файлов я разобрался, а вот со шрифтами какая-то лажа. Сфинкс позволяет юзать системные шрифты или только с подгрузкой имиджей из своего архива?
перерисовка произходит по mousemove с изменением параметров, поэтому приходится перерисовывать многократно. код слишком громоздкий, поэтому не привожу Alexeis, спасибо за наводку, буду пробывать. --------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!! |
|||
|
||||
Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 1 Всего: 7 |
Я так понял, что использует пререндеренные, утилита для их создания прилагается. Меня для игры вполне устроил шрифт из примера Shapes. Обычные я не пробовал.
В таких случаях часто можно разделить код на 2 части, рисование ресурсоемкой подложки (например сложное изображение, график и т. п., в общем основная часть) на битмепе, потом этот битмеп копируется на другой, а нем рисуются разного рода надписи, вспомогательные линии, и уже готовый рисунок копируется на канвас (ну можно и сразу на канвас копировать и по нему дорисовать, по обстановке). И соответствено в событиях мыши вызывается только быстрая дорисовка. -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. ![]() Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
gonzales |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 241 Регистрация: 13.3.2006 Репутация: 1 Всего: 2 |
так тоже пробывал, создаю битмеп, на нем отрисовываю, потом копирую на canvas. Но все равно приходится вызывать repaint, иначе не перерисовывается. Может это из-за doublebuffer:=true? Или из-за того, что отрисовка происходит не в onPaint?
Это сообщение отредактировал(а) gonzales - 30.5.2013, 17:07 --------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!! |
||||
|
|||||
Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 1 Всего: 7 |
Я уже не помню, когда рисовал сразу по форме или чему-то еще, обычно делал свой контрол и у него просто перекрывал Paint. Repaint руками по идее вызывать не нужно, она сама вызывается при, например, Refresh.
-------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. ![]() Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Вполне вероятно. Лучше, если указать винде, что кусок области стал невалидным при помощи функции InvalidateRect , при этом желательно отключить очистку фона у окна. После вызова InvalidateRect винда сама вызовет OnPaint . Далее при помощи BeginPaint в обработчике OnPaint мы можем узнать какой же прямоугольник требует обновления и обновить только его. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
gonzales |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 241 Регистрация: 13.3.2006 Репутация: 1 Всего: 2 |
конечно я тоже сделал свой)) наследник TImage. Но я не перекрывал paint а сделал свою процедуру DrawImage которую вызываю по MouseMove. Repaint или Refrash в данном случае значения не имеет. Подскажите, принципиально перекрывать Paint, есть какое-то кардинальное отличие от любой другой процедуры вызываемой руками? Как в таком случае должен выглядеть алгоритм перерисовки OnMouseMove -> InvalidateRect -> OnPaint -> {отрисовка битмапа} -> SetDIBitsToDevice
я правильно понимаю, что я должен вызвать InvalidateRect для всей области моего контрола и тем самым вызвать OnPaint? Буду пробывать! Кстати, SetDIBitsToDevice предполагает конвертацию из TBitmap в DIB, не даст ли это обратный эффект (ухудшения оптимизации)? ЗЫ. Комрады, в любом случае спасибо, очень приятно обсуждать вопросы с нормальными людьми, ВинГрад один из немногих форумов, где можно получить реальную помощь ![]() --------------------
- мастер, мастер, запорол..., все четыре запорол!!!- я ж тебе только три давал!!!???- да я и образец запорол!!!! |
||||
|
|||||
Beltar |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 627 Регистрация: 11.1.2006 Репутация: 1 Всего: 7 |
Ну я примерно вот так делал. Проект на XE3, но там бэкапы файла проекта для 2007 и XE лежат, а сам компонент будет работать даже в D7, если все inline убрать.
Производительность довольно высокая. У меня на Core Duo 2.66 даже в Debug версии строит график по 10 сериям с 1 728 010 точками примерно за 0.3 сек. Это полная отрисовка с примерно 148000 вызовами LineTo для 1920х1080. А так можно возить по нему мышкой, подлагивает, но не сильно, если зона рисования меньше, то лага может и не быть. Первый вариант Lines на GDI с 240 клетками у меня без лага полностью перерисовывался по MouseMove. Ты что-то не так, похоже, делаешь. Присоединённый файл ( Кол-во скачиваний: 14 ) ![]() -------------------- Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. ![]() Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Звук, графика и видео" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |