Модераторы: Snowy, Alexeis, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прорисовка массива пикселей на граф. компонент 
:(
    Опции темы
x128
Дата 8.12.2010, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 29.9.2009

Репутация: 5
Всего: 7



Цитата

Полностью обновляется >90 раз в секунду. Массив может менять свои размеры в зависимости от заданного масштаба. В програме так же доступен скроллинг. По-этому при выводе компонент должен менять свой размер, а при скроллинге - позицию.

Если массив обновляется >90 раз в секунду (более 3гб в сек.), это уже за приделами производительности для большинства компьютеров даже при обычном копировании не говоря о прочих операциях. Самый разумный подход, это обновлять только видимую часть изображения(массива) и выводить этот участок на экран, при таком подходе нагрузка будет минимальная.
PM MAIL WWW   Вверх
RESIN
Дата 8.12.2010, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.10.2010

Репутация: нет
Всего: нет



Цитата(Alexeis @ 8.12.2010,  09:00)
+ отказаться от floating poing для вычисления точки откуда брать цвет.

Не понял? Вещественные числа для вычисления координат пикселей, рисуемых на экран под масштабом? Итак использую целочисленный алгоритм (спер идею у Брезентхамма).
PM MAIL   Вверх
AntonN
Дата 8.12.2010, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



Цитата

Да, и при скроллинге боюсь появления мерцаний и "артефактов", если вывод не будет скроллы догонять... 

А у меня видел мерцание? =)

Затестил с ресайзом из fastlib, файсресайз и билинейный, оба позволяют отресайзить поле 1024*786 почти без тормозов (первый так вообще без них). Правда на линиях при таком ресайзе даже биленейного мало для качества. http://desksoft.ru/index.php?downloads=att...ents&id=305


--------------------
user posted image
PM MAIL WWW   Вверх
RESIN
Дата 8.12.2010, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.10.2010

Репутация: нет
Всего: нет



Цитата(AntonN @ 8.12.2010,  14:11)
А у меня видел мерцание? =)

Так понимаю, делиться тем, как ты этого добился не собираешься? smile 
Кстати, если не менять размера, позиции Пеинтбокса, у меня тоже не мерцает. Но вот скорость не ахти...

Это сообщение отредактировал(а) RESIN - 8.12.2010, 14:29
PM MAIL   Вверх
AntonN
Дата 8.12.2010, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



В onpaint рисуй буферный битмап на контрол, и не будет мерцания.
мне пока некогда выпилить из класса вещи, которые я не могу показывать smile к тому же массив линейный, а не двумерный (хз как он в памяти лежит).


--------------------
user posted image
PM MAIL WWW   Вверх
RESIN
Дата 9.12.2010, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.10.2010

Репутация: нет
Всего: нет



Цитата(AntonN @ 8.12.2010,  16:55)
к тому же массив линейный, а не двумерный (хз как он в памяти лежит).

Так и лежит smile В памяти все массивы линейны )
А проблема то в том и состоит, что буферный битмап долго рисуется даже со сканлайном. Ищу сейчас методы быстрого формирования битмапа...
PM MAIL   Вверх
AntonN
Дата 9.12.2010, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



рисуется или формируется?


--------------------
user posted image
PM MAIL WWW   Вверх
RESIN
Дата 9.12.2010, 05:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.10.2010

Репутация: нет
Всего: нет



Не так выразился, справедливое замечание ). Формируется медленно. BitBlt куда быстрее на канву Пейнтбокса происходит, в сравнении с самим формированием битмапа.
PM MAIL   Вверх
Alexeis
Дата 9.12.2010, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(RESIN @  9.12.2010,  06:13 Найти цитируемый пост)
 Формируется медленно. BitBlt куда быстрее на канву Пейнтбокса происходит, в сравнении с самим формированием битмапа. 

  Не может быть! Совсем наоборот ScanLine дает адрес обычной памяти. При помощи него я за секунду могу создать несколько тысяч кадров, но отрисовать лишь несколько десятков.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
AntonN
Дата 9.12.2010, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



Цитата

Не может быть! Совсем наоборот ScanLine дает адрес обычной памяти. 

может, сканлайн дает адрес, а мы кроме того что берем адрес еще им и манипулируем, вот тут и затык - как быстро заполнить данными битмап


--------------------
user posted image
PM MAIL WWW   Вверх
Alexeis
Дата 9.12.2010, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(AntonN @  9.12.2010,  20:42 Найти цитируемый пост)
а мы кроме того что берем адрес еще им и манипулируем

  Адресация по указателю никак не медленнее чем элемента массива, так что не вижу ни каких оснований для тормозов. Кстати построчная обработка быстрее чем послолбцовая.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RESIN
Дата 10.12.2010, 03:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.10.2010

Репутация: нет
Всего: нет



Цитата(Alexeis @ 9.12.2010,  20:14)
Кстати построчная обработка быстрее чем послолбцовая.

100% вы правы! Только вот сама функция Scanline, видимо не очень быстро адрес возвращает.
PM MAIL   Вверх
RESIN
Дата 10.12.2010, 04:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 8.10.2010

Репутация: нет
Всего: нет



Вот так я сейчас отрисовываю, используя библиотеку QuickPixels с мастеров делфи: http://www.delphimaster.ru/articles/pixels/

Код

  BMP:=TBitmap.Create;
  BMP.PixelFormat:=pf24bit; // !!!
  BMP.SetSize(Texture.Width, Texture.Height);
  QP:=TQuickPixels.Create;
  QP.Attach(BMP);
  for y:=0 to Texture.Height-1 do
  begin
    Scanline:[email protected][y];
    for x:=0 to Texture.Width-1 do
    begin
      pix:=Scanline^[x];
      QP.SetPixel(x, y, ((pix shl 8) shr 24)+(((pix shl 16) shr 24) shl 8)+((pix shl 24) shr 8));
    end;
  end;
  BitBlt(PAINT_BOX.Canvas.Handle, 0, 0, Screen.Texture.Width, Screen.Texture.Height, BMP.Canvas.Handle, 0, 0, srccopy);
  BMP.Free;


Или вот так, со сканлайном, без QuickPixels:

Код

  BMP:=TBitmap.Create;
  BMP.PixelFormat:=pf32bit; // !!!
  BMP.SetSize(Texture.Width, Texture.Height);
  for y:=0 to Texture.Height-1 do
  begin
    Scanline:[email protected][y];
    BMP_Scanline:=BMP.ScanLine[y];
    for x:=0 to Texture.Width-1 do
      BMP_Scanline[x]:=Scanline^[x];
  end;
  BitBlt(PAINT_BOX.Canvas.Handle, 0, 0, Screen.Texture.Width, Screen.Texture.Height, BMP.Canvas.Handle, 0, 0, srccopy);
  BMP.Free;


Разници на своем E8600 не заметил.
Если есть идеи, как это можно улучшить, делитесь, пожалуйста smile Так же интересно ваше мнение о том, какой из способов лучше.

Это сообщение отредактировал(а) RESIN - 10.12.2010, 04:43
PM MAIL   Вверх
AntonN
Дата 10.12.2010, 09:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



Цитата

Адресация по указателю никак не медленнее чем элемента массива, так что не вижу ни каких оснований для тормозов. Кстати построчная обработка быстрее чем послолбцовая.

Преобразование типов при изменении байта по указателю, операции над longint при изменении байта по указателю smile
В то время как у меня "пиксели" напрямую копируются через регистр MMX в две операции. Вот о чем я - мало адрес получить, важно какими операциями в него писать.


RESIN, у меня там было два массива, один 3000*3000, второй по размеру битмапа вывода (он потом 1:1 выводился в битмап, который и рисовался). Быстрый ресайз (fast который, без качества) на меньший массив (так проще было сделать переключалку на полный показ массива и только на его часть), потом вывод. Постараюсь сегодня выпилить пример.

Добавлено через 1 минуту и 16 секунд
Ах да, самое главное - битмап создавать только один раз, а не при каждом выводе


--------------------
user posted image
PM MAIL WWW   Вверх
Alexeis
Дата 10.12.2010, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(RESIN @  10.12.2010,  04:02 Найти цитируемый пост)
 Только вот сама функция Scanline, видимо не очень быстро адрес возвращает. 

  Так зачем же вызывать ее каждый раз? На самом деле ее достаточно вызывать всего 1 раз, после создания битмапа для получения адреса последней строки, что и будет адресом начала всего битмапа. Дальше строки идут одна за другой.

Цитата(AntonN @  10.12.2010,  10:12 Найти цитируемый пост)

Преобразование типов при изменении байта по указателю, операции над longint при изменении байта по указателю

  А я и не говорил что нужно адресовать байты.
Цитата(AntonN @  10.12.2010,  10:12 Найти цитируемый пост)
В то время как у меня "пиксели" напрямую копируются через регистр MMX в две операции. 

  А смысл? Запись в регистры mmx и вывод из них в память займет дополнительное время, в результате выигрыш от такого копирования будет исчезающе мал (по сравнению с той же CopyMemory). 

 smile 
Цитата(AntonN @  10.12.2010,  10:12 Найти цитируемый пост)
Ах да, самое главное - битмап создавать только один раз, а не при каждом выводе 

  Интересно, что такой же косяк я заметил в коде в механизме двойной буферизации VCL  smile . Подозреваю, что отрисовка юзер интерфейса не столь частая, поэтому тормоза не так заметны. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0579 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.