Быстрое 2D рисование линий

Несколько месяцев назад я написал на C++ плагиат (высокое качество) дзен фотон и хочу начать с нуля. Было довольно весело, и мне удалось получить немного хорошие результаты. Самым большим узким местом в производительности была часть рисования линий, поскольку мне нужно было нарисовать миллионы линий, чтобы «отследить лучи».

В итоге я использовал Кодекс Мики Элизабет Скотт непосредственно для ее github, что было быстрее, чем все методы, которые я пробовал. Но мне было интересно, как я могу рисовать линии еще быстрее. Дело в том, что мне нужно не только нарисовать миллионы линий, но мне нужно их «сложить».

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

Второй частью было рисование линий. Окончательное изображение представлялось в виде простого двойного вектора (3x64 бита на каждый пиксель), а рисование линии заключалось в добавлении значений к этому вектору. Конкретно, когда я использовал алгоритм Брезенхема, я сделал +=1 ячейкам вектора, которые соответствовали пикселям, по которым проходит линия.

Изображение было визуализировано путем сопоставления значений этого массива с [0,255]. Затем я мог играть с яркостью, делать гамма-коррекцию и т. д.

Я попробовал демонстрационные коды OpenGL и Cairo для рисования линий. Но я не мог получить желаемое поведение: добавление линий в массив пикселей (или поверхность, или буфер, или что-то еще) с хорошей точностью, а затем рендеринг изображения из этого массива.

Есть ли у вас какие-либо идеи о том, как я мог бы быстро рисовать линии друг над другом, чтобы я мог манипулировать ими, как я только что описал?

Вы уверены, что нужен double, а float не подходит?

geza 17.02.2019 19:56

Эту процедуру рисования линий можно было бы ускорить, если бы внутренний цикл работал только с целыми числами (преобразования double в int можно убрать). И, возможно, развёртывание цикла несколько раз тоже помогает.

geza 17.02.2019 20:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
285
0

Другие вопросы по теме