Как увеличить скорость отрисовки на canvas?
Модератор: Модераторы
Как увеличить скорость отрисовки на canvas?
Приветствую, экспериментирую тут с отрисовкой различных примитивов на PaintBox(линии, прямоугольники и т.д) Нарисовал на canvas-е сетку, и рисую, также реализовал масштабирование . На данный момент рисую только линию. Проблема в том, что как-то оно субъективно, медленно отрисовывается, особенно когда минимальный коэффициент масштабирования и двигаешь полосы прокрутки. Можно ли как-нибудь увеличить производительность? Может можно как-то добавить двойную буферизацию(или она уже есть)? Во вложении добавил архив с проектом. Подскажите, что и где можно оптимизировать, чтобы не подтормаживало. Например, сейчас я сетку рисую во вложенном цикле. Была мысль заменить два цикла на один, но отрисовывать вместо точек dash line с большим расстоянием между точками. Как считаете, это увеличит производительность?
P.S. Наткнулся тут ещё на такую штуку: BGRABitmap, как думаете, можно ей заменить стандартный canvas, у неё вроде и сглаживание есть и наверняка двойная буферизация.
P.S. Наткнулся тут ещё на такую штуку: BGRABitmap, как думаете, можно ей заменить стандартный canvas, у неё вроде и сглаживание есть и наверняка двойная буферизация.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Наверно лучше OpenGL
- debi12345
- долгожитель
- Сообщения: 5761
- Зарегистрирован: 10.05.2006 23:41:15
- Откуда: Ташкент (Узбекистан)
Знакомая ситуация
В MSE сейчас Мартин делает вариант GUI-отрисовки с использованием очень хорошо хардварно оптимизированной библиотеки GraphicsMagick (внешняя С-ая ДЛЛка).
Именно так (заменяя соседние точки-пикселы на сегменты линий) делают практически все графические редакторы.
Была мысль заменить два цикла на один, но отрисовывать вместо точек dash line с большим расстоянием между точками.
Именно так (заменяя соседние точки-пикселы на сегменты линий) делают практически все графические редакторы.
Именно так (заменяя соседние точки-пикселы на сегменты линий) делают практически все графические редакторы.
Проблема в том, что canvas не умеет dash line, городить свою функцию типа DrawDashLine(x1, y1, x2, y2, dash[]), наверно даже ещё медленнее будет (
Наверно лучше OpenGL
Это я оставлю на последок, если ничего другого не поможет )
Для сетки даш будет всяко не пригоден
Попробую поиграться с OpenGLContext, хотя по сути, методы рисования, вывод сетки там будет такой же... надеюсь не будет тормозить )
С наскока и OpenGL будет тормозить нехуже канваса, чтоб рисовать много и быстро придется всяко выкручиваться))
OpenGLContext - была бы по нему ещё документация, как его завести? Кинул на форму, а дальше как с ним работать? Либо подключать какой-то Пд* модуль и дальше вызывать gl* функции... но как? 
Посмотри примеры в samples и в components
xterro писал(а):Приветствую, экспериментирую тут с отрисовкой различных примитивов на PaintBox(линии, прямоугольники и т.д) Нарисовал на canvas-е сетку, и рисую, также реализовал масштабирование . На данный момент рисую только линию. Проблема в том, что как-то оно субъективно, медленно отрисовывается, особенно когда минимальный коэффициент масштабирования и двигаешь полосы прокрутки. Можно ли как-нибудь увеличить производительность? Может можно как-то добавить двойную буферизацию(или она уже есть)? Во вложении добавил архив с проектом. Подскажите, что и где можно оптимизировать, чтобы не подтормаживало. Например, сейчас я сетку рисую во вложенном цикле. Была мысль заменить два цикла на один, но отрисовывать вместо точек dash line с большим расстоянием между точками. Как считаете, это увеличит производительность?
P.S. Наткнулся тут ещё на такую штуку: BGRABitmap, как думаете, можно ей заменить стандартный canvas, у неё вроде и сглаживание есть и наверняка двойная буферизация.
Производительность, субьективно даже, не проверишь не загрузив программу на серьезную отрисовку. Во время работы отладчика программа может тормозить больше, чем в рабочем варианте.
Попробовал, теперь вроде понятней стало, только после того, как погонял проекты, он мне при запуске какие-то предупреждения выдаёт, никак не отцепится от этих тестов. Зачем он что-то пытается удалить, как сделать так чтобы он отстал? 
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Нет прав на запись в usr\lib\lazarus. выдай их или копируй пректы в хомяка
Это я понимаю, странно что он вообще туда постоянно лезет, какие-то бэкапы хочет создать видимо. Ну загрузил пример и загрузил, Lazarus же позволяет отключить создание бэкапов?
Эначит эти файлы открыты в иде, или открыт этот проект. Закрой файлы или открой другой проект
xterro
Как только Вы меняете что-либо на форме или в программном модуле, или в окружении самого Lazarus, Lazarus сохраняет старые значения в bak-файл. Ничего тут странного нет, Delphi делает то же самое.
Отключить бэкапы можно в меню "Сервис -> Параметры -> Окружение -> Резервные копии", но это будет неразумно с Вашей стороны.
Как только Вы меняете что-либо на форме или в программном модуле, или в окружении самого Lazarus, Lazarus сохраняет старые значения в bak-файл. Ничего тут странного нет, Delphi делает то же самое.
Отключить бэкапы можно в меню "Сервис -> Параметры -> Окружение -> Резервные копии", но это будет неразумно с Вашей стороны.
