Конференция "Игры" » TDirect2DCanvas [Delphi, Windows]
 
  • capirurso (27.02.11 17:45) [0]
    Добрый день, искав заголовочные файлы для 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 кадров. Кто разбирался уже, объясните пожалуйста как собственно все это должно работать? Почему нет разницы в производительности?
  • brother © (28.02.11 05:30) [1]
    кде код подсчета fps? где рисуешь? если через таймер, то выше фпс и не будет ;)
  • IPranker © (28.02.11 05:49) [2]

    > Почему нет разницы в производительности?


    1) Рисовать надо в OnIdle.
    2) Не нужно заниматься созданием каждый раз.
    3) Может быть включена вертикальная синхронизация, если она там есть.
  • Sapersky (28.02.11 15:40) [3]
    C D2D не работал, но по опыту с DDraw/D3D: чтобы получить какое-то ускорение, выводимый битмап должен быть поверхностью (или как они называются) D2D, созданной в видеопамяти.
  • capirurso (01.03.11 15:56) [4]
    Да, ошибочка есть, признаюсь считал в таймере. Переписал код:

    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. В теории второе должно выигрывать, но на практике что-то не получается.
  • Sapersky (01.03.11 20:20) [5]
    Ещё раз: [3]. Можно посмотреть примеры от MS, как они рекомендуют делать.
    Но вообще сравнивать на таких задачах смысла мало, просто рисовать битмапы и GDI умеет достаточно быстро. Аппаратная графика выигрывает на мало-мальски сложных спецэффектах - сравни с AlphaBlend или StretchBlt.
    BeginDraw/EndDraw (наследие D3D) нужно дёргать как можно реже, и рисовать между ними как можно больше. Так уж работают видеокарты - задал большой массив данных, отправил на обработку - она отмолотила. А по одной картинке/треугольнику "капать" - производительность падает в сотни раз. Возможно, в EndDraw ещё делается вывод бэкбуфера на экран, что дополнительно тормозит, но точно не в курсе.
  • JRTeston (02.03.11 01:36) [6]
    >capirurso   (01.03.11 15:56) [4]
    Да, ошибочка есть, признаюсь считал в таймере. Переписал код:


    И что этот код делает? Гонит  бесконечный цикл, пока ты его не прервёшь?
    Это не подсчёт FPS, или производительности, это жуть какая-то.

    Сделай цикл на 100000 выводов битмапа. Замерь время, затрачиваемое на это директом и GDI. Это даст тебе производительность. А этот дерьмокод спрячь и никому не показывай.

    PS: Время считай хотя бы gettickcount, a не секундомером и не таймером.
  • Sapersky (02.03.11 17:17) [7]
    Да ладно, не всё так страшно. Просто FPS получается с учётом обработки сообщений, не думаю, что они так уж сильно влияют. Таймер, если непонятно, тикает раз в секунду, это вполне доступный для него интервал.
    Хотя с замером интервала получится точнее, конечно.
  • brother © (03.03.11 07:06) [8]
    да пусть таймером фпс считает, имхо этого достаточно +- 1..3 кадра не критично если
  • capirurso (04.03.11 07:00) [9]

    > JRTeston   (02.03.11 01:36) [6]
    >  >capirurso   (01.03.11 15:56) [4]Да, ошибочка есть, признаюсь
    > считал в таймере. Переписал код:И что этот код делает? Гонит
    >  бесконечный цикл, пока ты его не прервёшь?Это не подсчёт
    > FPS, или производительности, это жуть какая-то.Сделай цикл
    > на 100000 выводов битмапа. Замерь время, затрачиваемое на
    > это директом и GDI. Это даст тебе производительность. А
    > этот дерьмокод спрячь и никому не показывай.PS: Время считай
    > хотя бы gettickcount, a не секундомером и не таймером.


    Обычно игнорирую такие сообщения, но накипело, ибо реально достали такие люди. Выше описанный код, голый пример измеряющий примерное кол-во отрисовок в секунду, никто тебе не доказывает что код идеальный и т.д. Хотя-бы немного понимающий человек не будет использовать GDI как решение, задач, в которых необходимо 100к выводов картинки. Вопрос был поставлен не на счет кода, имхо поверь, я не нуждаюсь в помощи написания подобного. Из выше написанного по теме я ничего от тебя не узнал. А писать на стенку кто выше я не собираюсь.

    Повторюсь, для меня TDirect2DCanvas это новое в делфях, хочу узнать разницу в работе и производительности. На текущий момент во тестах GDI выигрывает в разы. Если нечего по теме сказать не засоряй топ.
  • Sapersky (04.03.11 16:49) [10]
    Хотя-бы немного понимающий человек не будет использовать GDI как решение, задач, в которых необходимо 100к выводов картинки.

    Сразу возникают "крамольные" мысли - кому и зачем нужны эти 100k?

    На текущий момент во тестах GDI выигрывает в разы.

    Потенциально аппаратная графика при работе через 3D - быстрее, именно на больших объёмах данных. Видеокарты специально под это затачивают. Т.е. просто на текущий момент не умеем их готовить :)
  • brother © (10.03.11 12:13) [11]
    > Т.е. просто на текущий момент не умеем их готовить :)

    так на GDI и не сможем)
  • Pavia © (12.03.11 11:45) [12]

    > Обычно игнорирую такие сообщения, но накипело, ибо реально
    > достали такие люди. Выше описанный код, голый пример измеряющий
    > примерное кол-во отрисовок в секунду, никто тебе не доказывает
    > что код идеальный и т.д. Хотя-бы немного понимающий человек
    > не будет использовать GDI как решение, задач, в которых
    > необходимо 100к выводов картинки. Вопрос был поставлен не
    > на счет кода, имхо поверь, я не нуждаюсь в помощи написания
    > подобного. Из выше написанного по теме я ничего от тебя
    > не узнал. А писать на стенку кто выше я не собираюсь.

    Странно видеть. Человек делает ляпы.  Ему на это указали, а он говорит что умеет.


    > Этот код выдает 65 fps, переделал этот код под GDI. Получил
    > те же 65 кадров. Кто разбирался уже, объясните пожалуйста
    > как собственно все это должно работать? Почему нет разницы
    > в производительности?


    А откуда она возьмется разница в производительности? Что в GDI что в DirectX выводом занимается видо карта. Неоткуда она не возьмется.
  • Чайник © (13.03.11 12:33) [13]
    А какая у вас винда стоит?
    Из справки: 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.
  • xmen (14.03.11 22:19) [14]

    > А откуда она возьмется разница в производительности? Что
    > в GDI что в DirectX выводом занимается видо карта. Неоткуда
    > она не возьмется.


    Вообще-то DirectX аппаратное ускорение юзает, GDI же предполагает живучесть в любых условиях, разница ощутима.
  • Pavia © (14.03.11 23:41) [15]
    GDI тоже использует аппаратное ускорение. Правда в меньшей степени. А BitBlt ускорен везде. Без этой функции видео карты выпускали только в 80 годах. А в 90-ых уже все поголовно поддерживали её.

    Так что в приведенном примере вы разницы не заметите.

    А если хотите ускорения. Вот почитайте.

    http://msdn.microsoft.com/en-us/library/ff729480(v=vs.85).aspx#gdi_and_direct2d_hardware_acceleration
 
Конференция "Игры" » TDirect2DCanvas [Delphi, Windows]
Есть новые Нет новых   [134427   +38][b:0][p:0.001]