Помощь с палитрой

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Помощь с палитрой

Сообщение RazArt » 27.02.2009 (Пт) 20:02

Мне было нечего делать и решил состряпать такую вещь, палитру как в фотошопе. У мну получилась, но скорость обновления оставляет желать лучшего... Я приложил мой проект, если сможете написать алгоритм, работующий быстрее чем у меня, то буду очень благодарен
Вложения
Color.zip
(2.54 Кб) Скачиваний: 50

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Помощь с палитрой

Сообщение Debugger » 27.02.2009 (Пт) 20:20

Поищи SetDIBits. Если влом искать - посмотри "Золотые топики", там было.
Кстати, модераторы: прилепите "золото".

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Помощь с палитрой

Сообщение RazArt » 27.02.2009 (Пт) 20:37

Чё за золотые топики? Я недавно просто на форуме :oops:

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Помощь с палитрой

Сообщение Debugger » 27.02.2009 (Пт) 20:56

viewtopic.php?f=15&t=36567
Оттуда (первый ответ Watts[]n'а)
viewtopic.php?t=26505.
Если хочешь четкий пример и описание - скачай API Guide, ищи в нем функцию SetDIBits.

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Помощь с палитрой

Сообщение RazArt » 27.02.2009 (Пт) 21:37

Я сделал через SetDIBitsToDevice(нашёл на сайте), но вот скорость не на много увеличилась =\
Вложения
Color.zip
(3.61 Кб) Скачиваний: 37

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Помощь с палитрой

Сообщение RazArt » 27.02.2009 (Пт) 23:14

Тут получается 3-4 фпс, если убрать операции по вычислению цвета, то 8-9 =\

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Помощь с палитрой

Сообщение RazArt » 28.02.2009 (Сб) 9:03

Народ, так как сделать более быстрый замен байтов цвета?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Помощь с палитрой

Сообщение Хакер » 28.02.2009 (Сб) 10:37

фпс маленький потому что код написан катастрофически криво. Ты использовал все возможности, которым можно было его замедлить.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Помощь с палитрой

Сообщение RazArt » 28.02.2009 (Сб) 11:30

Так как сделать более быстро?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Помощь с палитрой

Сообщение Хакер » 28.02.2009 (Сб) 12:04

Щас покажу.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Помощь с палитрой

Сообщение Хакер » 28.02.2009 (Сб) 12:05

Твоя задача, чтобы следующий код выполнился очень быстро:
Код: Выделить всё
Dim bi24BitInfo As BITMAPINFO, bBytes() As Byte, Cnt As Long
With bi24BitInfo.bmiHeader
    .biBitCount = 24
    .biCompression = BI_RGB
    .biPlanes = 1
    .biSize = 40
    .biWidth = 256
    .biHeight = 256
End With
ReDim bBytes(1 To bi24BitInfo.bmiHeader.biWidth * bi24BitInfo.bmiHeader.biHeight * 3) As Byte
For xc = 0 To 255
    For yc = 0 To 255
        NewRed = (0 * yc + ((255 * xc + usecolor.rgbRed * (255 - xc)) \ 255) * (255 - yc)) \ 255
        NewGreen = (0 * yc + ((255 * xc + usecolor.rgbGreen * (255 - xc)) \ 255) * (255 - yc)) \ 255
        NewBlue = (0 * yc + ((255 * xc + usecolor.rgbBlue * (255 - xc)) \ 255) * (255 - yc)) \ 255
        GFX_SET_PIXEL_DIB bBytes, xc, yc, RGB(NewRed, NewGreen, NewBlue), bi24BitInfo.bmiHeader.biWidth
    Next yc
Next xc
SetDIBitsToDevice Picture.hdc, 0, 0, bi24BitInfo.bmiHeader.biWidth, bi24BitInfo.bmiHeader.biHeight, 0, 0, 0, bi24BitInfo.bmiHeader.biHeight, bBytes(1), bi24BitInfo, DIB_RGB_COLORS


Теперь по полочкам:
  • Код: Выделить всё
    With bi24BitInfo.bmiHeader
        .biBitCount = 24
        .biCompression = BI_RGB
        .biPlanes = 1
        .biSize = 40
        .biWidth = 256
        .biHeight = 256
    End With

    Зачем каждый раз заполнять эту структуру, если можно заполнить один раз в самом начале? (Это малосущественно, но всё же)
  • Код: Выделить всё
    ReDim bBytes(1 To bi24BitInfo.bmiHeader.biWidth * bi24BitInfo.bmiHeader.biHeight * 3) As Byte

    Зачем использоваться динамический массив (медленный очень который по своей природе), если четко известен (и вообще константен) его размер? Даже если плюнуть константность размера, зачем ReDim-ить (а значит выделять блок памяти в heap) при каждом вызове? :shock:
  • Код: Выделить всё
    For xc = 0 To 255
        For yc = 0 To 255

    Круто! xc и yc нигде не объявлены, а значит имеют тип Variant. Variant — медленный тип (что не умаляет его крутости в рамках OLE Automation, как и крутости IDispatch) и поэтому цикл с ним — медленный. А у тебя два вложенных цикла с использованием Variant-переменной. А значит у тебя медленность в квадрате.
  • Код: Выделить всё
            NewRed = (0 * yc + ((255 * xc + usecolor.rgbRed * (255 - xc)) \ 255) * (255 - yc)) \ 255
            NewGreen = (0 * yc + ((255 * xc + usecolor.rgbGreen * (255 - xc)) \ 255) * (255 - yc)) \ 255
            NewBlue = (0 * yc + ((255 * xc + usecolor.rgbBlue * (255 - xc)) \ 255) * (255 - yc)) \ 255

    0 * yc — это конечно круто, и это действительно достойное действие, чтобы совершать его в цикле 196608 раз. (И он ещё спрашивает, почему так медленно? :roll:) Особенно учитывая, что это не просто умножение, а умножение Variant-переменной, а значит обязательно проверится vartype и умножение будет совершено не процессором (быстрым), а Variant-функциями (медленными).

    Второе. Variant-математика — медленная. А здесь у тебя её полно. Здесь у тебя Неимоверное количество Variant-математики. Одного только объявления переменных с xc, yc, NewXXX будет достаточно чтобы увеличить скорость в 1,5 раза.

    Третье. Математика для построения матрицы у тебя такая: по горизонтале цвет фейдирует (fading) от выбранного к белому. По вертикали — теряется интенсивность. Так что математику нужно переделывать.

  • Код: Выделить всё
    GFX_SET_PIXEL_DIB bBytes, xc, yc, RGB(NewRed, NewGreen, NewBlue), bi24BitInfo.bmiHeader.biWidth

    Ага. Вызов функции в цикле, да ещё и такое страшное название функции. Знаешь почему вариант с SetDIBitsToDevice, когда нужно вывести очень много точек, быстрее, чем PSet или SetPixel? Потому что в первом случае тебе даруется возможность сразу же выставить много пикселей, исключая неизбежность совершения множества лишних действий. Но ты же, воспользовавшись первым вариантом, сам "компенсирол медленность", добавив в код совершение кучи лишних действий :)

    Вобщем, вызов функции в цикле это немного не то, что сочетается с понятием скорость. Но это тоже не настолько значительно.

    Если заглянуть внутрь GFX_SET_PIXEL_DIB, то там можно увидеть нечто ужасное:
    Код: Выделить всё
        R = zColor \ 65536
        G = (zColor And 65535) \ 256
        B = zColor And 255

    Зачем, скажи мне, сначала запаковывать три цветовых компоненты в Long-число, а потом их распаковывать? Не иначе, как чтобы потратить драгоценное время.

    Плюс, там внутри есть ещё и кривенький расчёт курсора-указателя для заполнения массива.

    Плюс, ByRef/ByVal, судя по всему, расставлялись в случайном порядке.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Помощь с палитрой

Сообщение RazArt » 28.02.2009 (Сб) 12:17

Так, большое спасибо, скорость действительно увеличилась до 8 фпс, но как в фотошопе сделали, там всё мгновенно происходит :?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Помощь с палитрой

Сообщение Хакер » 28.02.2009 (Сб) 12:56

До 8? :?

А у меня получилось 32—64 (очень грубая оценка).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Помощь с палитрой

Сообщение RazArt » 28.02.2009 (Сб) 13:02

Именно 8, я приложил проект проект...
Вложения
Color.zip
(10.08 Кб) Скачиваний: 33

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Помощь с палитрой

Сообщение Хакер » 28.02.2009 (Сб) 13:32

Ну конечно, если половину советов пропускать мимо ушей.
Посмотри в аттаче мой вариант. Я там избавил твой код от всякой дряни, только не трогал рисование спектра.
Вложения
Color__NEW.rar
(2.56 Кб) Скачиваний: 49
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Помощь с палитрой

Сообщение RazArt » 28.02.2009 (Сб) 13:36

Я делал всё по пунктам, эм... а где ваш аттач? оО

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Помощь с палитрой

Сообщение Хакер » 28.02.2009 (Сб) 13:44

Прилепил.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Помощь с палитрой

Сообщение RazArt » 28.02.2009 (Сб) 14:12

Всё, биг спс, доходит до 25 фпс (я щас добавил немного функций, так как кроме палитры там есть и другие функции ;))

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Помощь с палитрой

Сообщение Хакер » 28.02.2009 (Сб) 14:14

Ты что не скачивал аттач?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Помощь с палитрой

Сообщение RazArt » 28.02.2009 (Сб) 16:15

Я старый скачивал, тебе просто мега респект, не думал что авто редро стока памяти занимает, тебя тоже в соавторстве указал ;)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Помощь с палитрой

Сообщение Хакер » 28.02.2009 (Сб) 16:16

Скачивать надо самый последний, в старом содержались грубые ошибки. Экономия памяти не причём вообще.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Помощь с палитрой

Сообщение RazArt » 28.02.2009 (Сб) 16:27

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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Помощь с палитрой

Сообщение Хакер » 28.02.2009 (Сб) 17:18

Когда его убрали скорость не изменилась.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Помощь с палитрой

Сообщение RazArt » 28.02.2009 (Сб) 23:39

Здравствуйте ещё раз, теперь я захотел добавить в палитру веб цвета, написал функцию, но быстродействие упало. Как можно её оптимизировать?
Код: Выделить всё
Function ConverColor(bColor As Byte) As Byte
If bColor >= 0 And bColor <= 25 Then ConverColor = 15: Exit Function
If bColor >= 26 And bColor <= 50 Then ConverColor = 40: Exit Function
If bColor >= 51 And bColor <= 100 Then ConverColor = 75: Exit Function
If bColor >= 101 And bColor <= 150 Then ConverColor = 125: Exit Function
If bColor >= 151 And bColor <= 200 Then ConverColor = 175: Exit Function
If bColor >= 201 And bColor <= 255 Then ConverColor = 225: Exit Function
End Function

и вызывается она так:
Код: Выделить всё
For v = 0 To 255
    For X = 0 To 255
        bBytes(pCursor).rgbRed = ConverColor(SatLine(X).r * v)
        bBytes(pCursor).rgbGreen = ConverColor(SatLine(X).g * v)
        bBytes(pCursor).rgbBlue = ConverColor(SatLine(X).b * v)
        pCursor = pCursor + 1
    Next X
Next v

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Помощь с палитрой

Сообщение Хакер » 01.03.2009 (Вс) 0:03

Что, совсем, абсолютно, ни капельки не очевидно, что для веб-палитры надо применять другой алгоритм?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

RazArt
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 118
Зарегистрирован: 08.09.2008 (Пн) 14:55
Откуда: Н.Новгород

Re: Помощь с палитрой

Сообщение RazArt » 01.03.2009 (Вс) 0:16

Эм... Ну а как её ещё сделать? оО


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 58

    TopList  
cron