| Скроллинг изображения на Direct2D | |
| От: | Leninax | ||
| Дата: | 09.02.10 07:16 |
| Уважаемые, Пытаюсь проскроллить картинку, да при том сделать это быстро (Direct2D). Использую Delphi 2010. То, что получается, скроллится оч медленно, фактически как при использовании GDI. Как быть? Где же хардварное ускорение и всё такое?
Enjoy your body! |
| Re: Скроллинг изображения на Direct2D | |
| От: | Onorin | ||
| Дата: | 09.02.10 11:47 |
| Здравствуйте, Leninax, Вы писали: L>Уважаемые, L>Пытаюсь проскроллить картинку, да при том сделать это быстро (Direct2D). Использую Delphi 2010. L>То, что получается, скроллится оч медленно, фактически как при использовании GDI. L>Как быть? Где же хардварное ускорение и всё такое? L>
Рискну предположить, что может зависит от того, как ты создаешь RenderTarget? ICQ 190053033 |
| Re[2]: Скроллинг изображения на Direct2D | |
| От: | Leninax | ||
| Дата: | 09.02.10 12:11 |
| Здравствуйте, Onorin, Вы писали: O>Здравствуйте, Leninax, Вы писали: L>>Уважаемые, L>>Пытаюсь проскроллить картинку, да при том сделать это быстро (Direct2D). Использую Delphi 2010. L>>То, что получается, скроллится оч медленно, фактически как при использовании GDI. L>>Как быть? Где же хардварное ускорение и всё такое?
L>>
O>Рискну предположить, что может зависит от того, как ты создаешь RenderTarget? В классе TDirect2DCanvas есть 3 перегруженных конструктора: — Create(Canvas: TCanvas; …) — так скролл не работает; — Create(DC: HDC; …) — так скролл тоже не работает; — Create(Handle: HWND) — так скролл как-то работает. Enjoy your body! |
| Re[3]: Скроллинг изображения на Direct2D | |
| От: | Onorin | ||
| Дата: | 09.02.10 13:02 |
| Здравствуйте, Leninax, Вы писали: L>Здравствуйте, Onorin, Вы писали: O>>Здравствуйте, Leninax, Вы писали: L>>>Уважаемые, L>>>Пытаюсь проскроллить картинку, да при том сделать это быстро (Direct2D). Использую Delphi 2010. L>>>То, что получается, скроллится оч медленно, фактически как при использовании GDI. L>>>Как быть? Где же хардварное ускорение и всё такое? L>
L>>>
O>>Рискну предположить, что может зависит от того, как ты создаешь RenderTarget? L>В классе TDirect2DCanvas есть 3 перегруженных конструктора: L>- Create(Canvas: TCanvas; …) — так скролл не работает; L>- Create(DC: HDC; …) — так скролл тоже не работает; L>- Create(Handle: HWND) — так скролл как-то работает. Не знаю как в Delphi, но у D2D1Factory есть метод CreateHwndRenderTarget, где мы сообщаем, то как будем рисовать софтварно или хардварно ICQ 190053033 |
| Re[4]: Скроллинг изображения на Direct2D | |
| От: | Leninax | ||
| Дата: | 10.02.10 07:54 |
| O>>>Рискну предположить, что может зависит от того, как ты создаешь RenderTarget? O>Не знаю как в Delphi, но у D2D1Factory есть метод CreateHwndRenderTarget, где мы сообщаем, то как будем рисовать софтварно или хардварно Вызываю CreateHwndRenderTarget с хардваром — ускорения нет, скроллит как раньше. Создал с софтварным — скролл на той же скорости (ничего не изменилось). Попробовал RenderTarget с параметром Default (т.е. система сама решает, сможет ли использовать хардварное ускорение) — результат не изменился. Enjoy your body! |
| Re[5]: Скроллинг изображения на Direct2D | |
| От: | Sapersky | ||
| Дата: | 10.02.10 15:07 |
| Наверное, чтобы было ускорение, битмап тоже должен быть директ2D-шным (поверхность или как это теперь называется). Железо-то работает одинаково, через какой API его ни дёргай. Если картинка в системной памяти — для перегона в видео в любом случае потребуется время. |
| Re[6]: Скроллинг изображения на Direct2D | |
| От: | Leninax | ||
| Дата: | 11.02.10 12:38 |
| Здравствуйте, Sapersky, Вы писали: S>Наверное, чтобы было ускорение, битмап тоже должен быть директ2D-шным (поверхность или как это теперь называется). S>Железо-то работает одинаково, через какой API его ни дёргай. Если картинка в системной памяти — для перегона в видео в любом случае потребуется время. 1. Создал D2DBitmap и загрузил в него моё изображение (куда оно легло — в видеопамять? надеюсь). Скорость скролла осталась такой же (см. код снизу). 2. Через CreateCompatibleRenderTarget создал ID2D1BitmapRenderTarget, из которого создал Brush с картинкой (чтобы заливать картинкой). Ну уж кисть-то точно будет в видеопамяти лежать. Закрашиваю этой кистью перемещающийся прямоугольник (о как можно изобр скроллить!) — скорость перемещения такая же маленькая. У меня такое чувство, что тормозит не рисование, а вызовы [BeginDraw, EndDraw], так как если их вынести за цикл, то рисует мгновенно, но нет движения (видно только конечное положение изображения).
Enjoy your body! |
| Теги: | Direct2D |
| Re[7]: Скроллинг изображения на Direct2D | |
| От: | Sapersky | ||
| Дата: | 12.02.10 13:18 |
| Здравствуйте, Leninax, Вы писали: L>У меня такое чувство, что тормозит не рисование, а вызовы [BeginDraw, EndDraw], так как если их вынести за цикл, то рисует мгновенно, но нет движения (видно только конечное положение изображения). В MSDN написано, что в EndDraw делается вывод бэкбуфера на экран. Т.е. имеем при этом либо какую-то конверсию форматов, либо ресайз, либо бэкбуфер в системной памяти. Скорее последнее — аппаратные конверсия/ресайз должны быть достаточно быстрыми. Пробуй разные параметры создания RenderTarget — Usage, minLevel, PixelFormat и т.д. |
| Re[8]: Скроллинг изображения на Direct2D | |
| От: | Leninax | ||
| Дата: | 15.02.10 08:35 |
| Здравствуйте, Sapersky, Вы писали: S>Здравствуйте, Leninax, Вы писали: L>>У меня такое чувство, что тормозит не рисование, а вызовы [BeginDraw, EndDraw], так как если их вынести за цикл, то рисует мгновенно, но нет движения (видно только конечное положение изображения). S>В MSDN написано, что в EndDraw делается вывод бэкбуфера на экран. Т.е. имеем при этом либо какую-то конверсию форматов, либо ресайз, либо бэкбуфер в системной памяти. Скорее последнее — аппаратные конверсия/ресайз должны быть достаточно быстрыми. S>Пробуй разные параметры создания RenderTarget — Usage, minLevel, PixelFormat и т.д. Моё чувство меня не подвело, но вам так же большое спасибо за подсказку. Если D2D1_PRESENT_OPTIONS выставить в D2D1_PRESENT_OPTIONS_IMMEDIATELY, то «The render target does not wait until the display refreshes to present» и отрисовывает мой скролл намного быстрее, чем было (см. код ниже). В принципе, для моей задачи хватит полученной скорости прокрутки изображения, но предполагаю, что это не предел производительности Директа (если скроллить полноэкранное изображение, то скорость скролла в данной реализации всё-равно достаточно низкая).
Enjoy your body! |
| Re[9]: Скроллинг изображения на Direct2D | |
| От: | Sapersky | ||
| Дата: | 15.02.10 12:31 |
| Здравствуйте, Leninax, Вы писали: L>«The render target does not wait until the display refreshes to present» Т.е. вертикальная синхронизация отключена. В принципе, VSync не такая уж бесполезная штука, всё равно отрисованные между обновлениями монитора кадры не будут видны. По идее, точно такого же "ускорения" можно достичь увеличением шага скроллинга, хотя может пострадать равномерность вывода. |
| Re[10]: Скроллинг изображения на Direct2D | |
| От: | Leninax | ||
| Дата: | 15.02.10 13:31 |
| Здравствуйте, Sapersky, Вы писали: S>Здравствуйте, Leninax, Вы писали: L>>«The render target does not wait until the display refreshes to present» S>Т.е. вертикальная синхронизация отключена. S>В принципе, VSync не такая уж бесполезная штука, всё равно отрисованные между обновлениями монитора кадры не будут видны. По идее, точно такого же "ускорения" можно достичь увеличением шага скроллинга, хотя может пострадать равномерность вывода. А есть функция, которая может делать разовый VSync (это поможет мне менять скорость скроллинга и одновременно частично синхронизировать вывод)? Когда я писал движок на DirectDraw, там можно было пользовать WaitForVerticalBlank(…). Но городить DD-огород ради одной функции сомнительно. Enjoy your body! |
| Re[11]: Скроллинг изображения на Direct2D | |
| От: | Sapersky | ||
| Дата: | 16.02.10 14:31 |
| Здравствуйте, Leninax, Вы писали: L>А есть функция, которая может делать разовый VSync (это поможет мне менять скорость скроллинга и одновременно частично синхронизировать вывод)? Не знаю, сам в D2D разбираюсь на уровне "пару раз заглядывал в MSDN". |
| Re[9]: Скроллинг изображения на Direct2D | |
| От: | Leninax | ||
| Дата: | 17.02.10 08:27 |
| L>Если D2D1_PRESENT_OPTIONS выставить в D2D1_PRESENT_OPTIONS_IMMEDIATELY, то «The render target does not wait until the display refreshes to present» и отрисовывает мой скролл намного быстрее, чем было (см. код ниже). L>
Создание d2dHwndRenderTarget позволяет использовать всё окно для рисования. Мне же нужно скроллить только часть окна. Для этого я использую CreateDCRenderTarget — создаёт RenderTarget, который позволит рисовать с помощью контекста устройства (см. ниже код инициализации). Но такая реализация не работает — ничего не отображается в пределах Image2. Почему? Код: я хочу прокручивать Image1 в месте размещения Image2 (рисовать на Image2:TImage)
Enjoy your body! |
| Re[10]: Скроллинг изображения на Direct2D | |
| От: | Sapersky | ||
| Дата: | 17.02.10 11:10 | ||
| Оценка: | +1 | ||
| Здравствуйте, Leninax, Вы писали: L>Создание d2dHwndRenderTarget позволяет использовать всё окно для рисования. Мне же нужно скроллить только часть окна. Наверняка можно как-то задать фрагмент целевого окна, в D3D можно было. Т.е. размер, видимо, указывается вторым параметром в D2D1HwndRenderTargetProperties, осталось найти ф-ю для смещения. Если найти не получится — можно (опять же по аналогии с D3D) рисовать на TPanel. Мудрить с TImage я бы не стал, поскольку фактически это рисование в битмап. При загрузке из файла (а иначе зачем вообще TImage — проще TPaintBox) битмап, если правильно помню, создаётся как DIB, а аппаратное ускорение при рисовании в DIB более чем сомнительно (он создаётся в системной памяти). В DDB (PixelFormat = pfDevice) — ещё можно предположить, что возможно, и то не факт. |
| Re[11]: Скроллинг изображения на Direct2D | |
| От: | Silver_s | ||
| Дата: | 17.02.10 13:51 |
| Здравствуйте, Leninax, Вы писали: L>А есть функция, которая может делать разовый VSync (это поможет мне менять скорость скроллинга и одновременно частично синхронизировать вывод)? L>Когда я писал движок на DirectDraw, там можно было пользовать WaitForVerticalBlank(…). Но городить DD-огород ради одной функции сомнительно. Если D2D используется, то должен быть доступ и DXGI. Эта функция блокируется пока VSync не произойдет: IDXGIOutput::WaitForVBlank |