@CVadymT

Почему попиксельное рисование квадрата 100 на 100 занимает больше времени чем примитив 100 на 100?

Всем привет! Я задался вопросом, почему когда я рисую квадрат функцией rect(x, y, 1, 1, color) в цикле по одному пикселю:
for y = 0; y <= 100; y++ {
   for x = 0; x <= 100; x++ {
       rect(x, y, 1, 1, color)
   }
}

это занимает НАМНОГО больше времени, чем просто нарисовать квадрат без цикла, с размером 100 на 100: rect(x, y, 100, 100, color)

Возможно, это глупый вопрос, но плиз объясните пожалуйста, почему так происходит.
Ведь видеокарта тоже рисует по одному пикселю всё на экране.

Вы спросите зачем мне так рисовать, нужно чтобы считать по формуле для каждого пикселя свой цвет. А этих пикселей сотни тысяч... Чтобы получить готовое изображение. Требование 60 раз просчитывать новые пиксели.

Заранее спасибо!
  • Вопрос задан
  • 160 просмотров
Пригласить эксперта
Ответы на вопрос 4
tsklab
@tsklab
Системный администратор, программист
Ведь видеокарта тоже рисует по одному пикселю всё на экране.
Нет, видео-карта рисует квадрат.
2D рендеринг
5a809d4189f26786992986.png
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
1. Программное рисование примитивов так оптимизируют, что круче некуда. И я этим тоже слегка занимался.
2. Нарисовать примитив на форме — это системный вызов. А чем их меньше, тем лучше.
UPD. Сложные рисунки делают, рисуя что-то во внеэкранный буфер и выводя его на экран одним махом.
3. Многие из примитивов рисуются аппаратно на уровне видеоплаты. Ещё с конца 90-х! И прямоугольник тоже.
Ответ написан
rdifb0
@rdifb0
Программист, реалист
Возможно, это глупый вопрос, но плиз объясните пожалуйста, почему так происходит.
Интересный вопрос, сделать что-то один раз или 10000 раз.

Ведь видеокарта тоже рисует по одному пикселю всё на экране.
Краткий ответ нет.
Даже если взять кратчайший путь то ваше приложение делает вызов апи directx/opengl/vulkan, directx/opengl/vulkan обращается к драйверу видеокарты, а драйвер видеокарты уже собственно к видеокарте. И даже после это видеокарта не спешить отобразить ваш пиксель, а только устанавливает его (или группу пикселей если вы рисуете крвадрат) в своем буфере для отображения.
Ответ написан
@AlexSku
Программист по автоматике
Рисование в GDI всегда медленный процесс, т.к. видеопроцессор выводит форму и не даёт главному процессору менять видеопамять. Обычно идёт привязка к 60 (или больше) Гц. Поэтому сначала рисуют битмап в обычной памяти, а затем переносят его в видеопамять.
Но можно, конечно, подключиться к Direct3D и 2D, тогда пойдёт ещё быстрее.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы