Здравствуйте, c-smile, Вы писали:
CS>>>У CPU вообще нет доступа к видео памяти в том же виде что и основной памяти. _>>Безусловно его нет. Более того, если бы обмен данными между обычной памятью и видео-памятью происходил с помощью инструкций CPU, то это было бы катастрофически медленно. Однако в CPU (и не только — сейчас это уже даже в копеечных МК присутствует) имеется такой механизм работы с периферией как DMA, который позволяет периферийным устройствам обмениваться с памятью процессора в фоне (без его прямых команд). Соответственно при включение этого механизма запись в определённые разделы оперативной памяти по сути полностью аналогична записи в видео-память. И думаю что большинство участников дискуссии имели в виду именно это, просто не расшифровывая очевидные детали. CS>Всё верно, только оппоненты в дискуссии имели в виду именно "DDB это video память" и "GDI hardware accelerated". CS>Я же говорю (и MSDN) что у GDI hardware accelerated только BitBlt (фактически это и есть DMA). CS>Также я говорю (и Фень Юань) что DDB это область RAM а не video RAM. То есть DDB это и есть твои "определённые разделы оперативной памяти". CS>Вышеизложенное означает что GDI в принципе не может иметь per primitives hardware accelerated drawing.
Нуу насчёт в принципе не может — это спорный вопрос. ) Но если говорить насчёт GDI в винде, то наверное так и есть. Во всяком случае я не припомню информации насчёт их аппаратного ускорения.
CS>Т.е. DrawLine(hdc, ...) это банальный Брезенхем исполняемый CPU и изменяющий RAM. Т.е. этот механизм есть O(N) где N это количество пикселей на экране. Т.е. sucks on high-dpi monitors. CS>В Direct2D, DirectX, OpenGL же DrawLine() это (условно) посылка quad (четырех координат) на GPU для отрисовки его процессорами (shaders, etc). CS>Т.е. этот механизм для CPU есть O(1) complex — на зависит от размера экрана.
С Direct2D я не знаком на практике, но если говорить о рисование через шейдеры, то там вывод линии тоже является далеко не тривиальной операцией типа вызова функции LineTo. )))