-
Добрый день, искав заголовочные файлы для directx, наткнулся на одну стать на сайте эмбаркадеро, а именно на заявление разработчиков что в делфи2010 появился новый класс TDirect2DCanvas, который является заменой GDI, с одним отличием, обработка видео картой а не процессором. Почитав-посмотрев составил такого рода код:
var
D2DCanvas : TDirect2DCanvas;
begin
D2DCanvas := TDirect2DCanvas.Create(Canvas, ClientRect);
try
D2DCanvas.BeginDraw;
D2DCanvas.Draw(0, 0, Image1.Picture.Bitmap);
D2DCanvas.EndDraw;
finally
D2DCanvas.free;
end;
end;
Этот код выдает 65 fps, переделал этот код под GDI. Получил те же 65 кадров. Кто разбирался уже, объясните пожалуйста как собственно все это должно работать? Почему нет разницы в производительности?
-
кде код подсчета fps? где рисуешь? если через таймер, то выше фпс и не будет ;)
-
> Почему нет разницы в производительности?
1) Рисовать надо в OnIdle. 2) Не нужно заниматься созданием каждый раз. 3) Может быть включена вертикальная синхронизация, если она там есть.
-
C D2D не работал, но по опыту с DDraw/D3D: чтобы получить какое-то ускорение, выводимый битмап должен быть поверхностью (или как они называются) D2D, созданной в видеопамяти.
-
Да, ошибочка есть, признаюсь считал в таймере. Переписал код:
procedure TForm1.Button1Click(Sender: TObject);
var
D2DCanvas : TDirect2DCanvas;
begin
D2DCanvas := TDirect2DCanvas.Create(Canvas, ClientRect);
try
while 1=1 do begin
D2DCanvas.BeginDraw;
D2DCanvas.Draw(0, 0, Image1.Picture.Bitmap);
D2DCanvas.EndDraw;
Application.ProcessMessages;
inc(fps);
end;
finally
D2DCanvas.free;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Caption := IntToStr(fps) + ' fps';
fps := 0;
end;
Получил 220 кадров примерно, при этом же способе но для TBitmap, счетчик показал 8.ххх.ххх кадров. Если BeginDraw и EndDraw делать до и после цикла с Draw, прирост кадров примерно получается +1.ххх fps. Но почему такая разница, и почему Direct2D такой медленный? > Не нужно заниматься созданием каждый раз.
... и т.д. идея не получить макс производительность, а понять разницу в скорости между GDI и Direct2D. В теории второе должно выигрывать, но на практике что-то не получается.
-
Ещё раз: [3]. Можно посмотреть примеры от MS, как они рекомендуют делать. Но вообще сравнивать на таких задачах смысла мало, просто рисовать битмапы и GDI умеет достаточно быстро. Аппаратная графика выигрывает на мало-мальски сложных спецэффектах - сравни с AlphaBlend или StretchBlt. BeginDraw/EndDraw (наследие D3D) нужно дёргать как можно реже, и рисовать между ними как можно больше. Так уж работают видеокарты - задал большой массив данных, отправил на обработку - она отмолотила. А по одной картинке/треугольнику "капать" - производительность падает в сотни раз. Возможно, в EndDraw ещё делается вывод бэкбуфера на экран, что дополнительно тормозит, но точно не в курсе.
-
>capirurso (01.03.11 15:56) [4] Да, ошибочка есть, признаюсь считал в таймере. Переписал код:
И что этот код делает? Гонит бесконечный цикл, пока ты его не прервёшь? Это не подсчёт FPS, или производительности, это жуть какая-то.
Сделай цикл на 100000 выводов битмапа. Замерь время, затрачиваемое на это директом и GDI. Это даст тебе производительность. А этот дерьмокод спрячь и никому не показывай.
PS: Время считай хотя бы gettickcount, a не секундомером и не таймером.
-
Да ладно, не всё так страшно. Просто FPS получается с учётом обработки сообщений, не думаю, что они так уж сильно влияют. Таймер, если непонятно, тикает раз в секунду, это вполне доступный для него интервал. Хотя с замером интервала получится точнее, конечно.
-
да пусть таймером фпс считает, имхо этого достаточно +- 1..3 кадра не критично если
-
> JRTeston (02.03.11 01:36) [6] > >capirurso (01.03.11 15:56) [4]Да, ошибочка есть, признаюсь > считал в таймере. Переписал код:И что этот код делает? Гонит > бесконечный цикл, пока ты его не прервёшь?Это не подсчёт > FPS, или производительности, это жуть какая-то.Сделай цикл > на 100000 выводов битмапа. Замерь время, затрачиваемое на > это директом и GDI. Это даст тебе производительность. А > этот дерьмокод спрячь и никому не показывай.PS: Время считай > хотя бы gettickcount, a не секундомером и не таймером.
Обычно игнорирую такие сообщения, но накипело, ибо реально достали такие люди. Выше описанный код, голый пример измеряющий примерное кол-во отрисовок в секунду, никто тебе не доказывает что код идеальный и т.д. Хотя-бы немного понимающий человек не будет использовать GDI как решение, задач, в которых необходимо 100к выводов картинки. Вопрос был поставлен не на счет кода, имхо поверь, я не нуждаюсь в помощи написания подобного. Из выше написанного по теме я ничего от тебя не узнал. А писать на стенку кто выше я не собираюсь.
Повторюсь, для меня TDirect2DCanvas это новое в делфях, хочу узнать разницу в работе и производительности. На текущий момент во тестах GDI выигрывает в разы. Если нечего по теме сказать не засоряй топ.
-
Хотя-бы немного понимающий человек не будет использовать GDI как решение, задач, в которых необходимо 100к выводов картинки.
Сразу возникают "крамольные" мысли - кому и зачем нужны эти 100k?
На текущий момент во тестах GDI выигрывает в разы.
Потенциально аппаратная графика при работе через 3D - быстрее, именно на больших объёмах данных. Видеокарты специально под это затачивают. Т.е. просто на текущий момент не умеем их готовить :)
-
> Т.е. просто на текущий момент не умеем их готовить :)
так на GDI и не сможем)
-
> Обычно игнорирую такие сообщения, но накипело, ибо реально > достали такие люди. Выше описанный код, голый пример измеряющий > примерное кол-во отрисовок в секунду, никто тебе не доказывает > что код идеальный и т.д. Хотя-бы немного понимающий человек > не будет использовать GDI как решение, задач, в которых > необходимо 100к выводов картинки. Вопрос был поставлен не > на счет кода, имхо поверь, я не нуждаюсь в помощи написания > подобного. Из выше написанного по теме я ничего от тебя > не узнал. А писать на стенку кто выше я не собираюсь.
Странно видеть. Человек делает ляпы. Ему на это указали, а он говорит что умеет.
> Этот код выдает 65 fps, переделал этот код под GDI. Получил > те же 65 кадров. Кто разбирался уже, объясните пожалуйста > как собственно все это должно работать? Почему нет разницы > в производительности?
А откуда она возьмется разница в производительности? Что в GDI что в DirectX выводом занимается видо карта. Неоткуда она не возьмется.
-
А какая у вас винда стоит? Из справки: The Direct2D canvas is only supported on Windows 7, so be sure that you are developing your Direct2D-enabled application on this version of Windows.
-
> А откуда она возьмется разница в производительности? Что > в GDI что в DirectX выводом занимается видо карта. Неоткуда > она не возьмется.
Вообще-то DirectX аппаратное ускорение юзает, GDI же предполагает живучесть в любых условиях, разница ощутима.
-
GDI тоже использует аппаратное ускорение. Правда в меньшей степени. А BitBlt ускорен везде. Без этой функции видео карты выпускали только в 80 годах. А в 90-ых уже все поголовно поддерживали её. Так что в приведенном примере вы разницы не заметите. А если хотите ускорения. Вот почитайте. http://msdn.microsoft.com/en-us/library/ff729480(v=vs.85).aspx#gdi_and_direct2d_hardware_acceleration
|