Вверх ↑
Этот топик читают: Гость
Ответов: 2125
Рейтинг: 159
#121: 2008-01-30 15:12:24 ЛС | профиль | цитата
Galkov писал(а):
Мигание возникает, когда несколько раз, по разному, рисуют на контексте окна - одну и ту же область

Ага, если вспомнить, что InvalidateRect вызывает не одно событие WM_PAINT, а впридачу ещё и WM_ERASEBKGND до него, которое в DefWindowProc по умолчанию закрашивает область кистью, установленной в классе окна...
карма: 1

0
Ответов: 9906
Рейтинг: 351
#122: 2008-01-30 15:41:57 ЛС | профиль | цитата
Ну если вспомнить, то кисть наверное придется "прозрачной" делать.
Или InvalidateRect с false вызывать...
------------ Дoбавленo:

Имеется ввиду

#pas
procedure THIWinTools._work_doRedraw;
begin
InvalidateRect(ReadInteger(_Data,_data_Handle,0),nil,true);
end;
Может, действительно, последний аргумент из потока прочитать как ReadBool(_Data) ...
карма: 9

0
Голосовали:Астрамак, temp
Разработчик
Ответов: 26151
Рейтинг: 2127
#123: 2008-01-30 15:44:11 ЛС | профиль | цитата
Galkov писал(а):
И не припомню там никаких копирований, чего-то

Ну да, конечно, а BitBlt, это -- не копирование, а так мимо проходило. Почитай-ка литературу, тот же MSDN.
Про двойную буферизацию, ссылку кинуть, или сам найдешь.
Galkov писал(а):
рисование на битмапе, это рисование на совместимом с ним контексте
Да, так оно и есть, что не скажешь про контекст окна, где этот bitmap, еще назначить надо этому контексту, чтобы он на нем рисовал.

Galkov, у меня складывается впечетление, что только ты один у нас читать умеешь, остальные мимо проходили. И твои речи -- это истина в первой инстанции. Нельзя так, не правильно это.

Мне нафиг не нужена эта двойная буферизация, и спорить я не собираюсь, надоело просто, считай как хочешь.

карма: 22

0
Ответов: 9906
Рейтинг: 351
#124: 2008-01-30 17:13:52 ЛС | профиль | цитата
nesco писал(а):
Ну да, конечно, а BitBlt, это -- не копирование, а так мимо проходило.

nesco, тебя же спросили: по-русски, пожалуйста
А ты вместо того чтобы прочитать эти два слова (не говоря уже про ответить), продолжаешь опять на иностранном...

Ты вообще про какое BitBlt говоришь-то
Если это есть рисование из битмапа в контекст окна, то разговор о нем бессмысленнен, это содержится в самом термине "двойная буферизация"
Он содержится во всех реализациях этой "двойной буферизации"
В тех что ты уже придумал, и в тех, что еще собираешься придумать.
Т.е., он везде содержится, но ты употребляешь "Да, но..."
nesco писал(а):
Да это bitmap, но отрисовывается он в памяти с последующим копировании

Т.е., имеется дополнительное копирование.
Мое предположение было, что ты считаешь, что копирование происходит при создании совместимого контекста -- именно там я его не заметил
Если тебе известна ссылка на MSDN, говорящая про обратное - давай
Что это лишь предположение, отмечено словами "на всякий случай"
Не хочешь слушать про "на всякий случай", так все в твоих руках: ГОВОРИ ПО РУССКИ, и всего делов

nesco писал(а):
Почитай-ка литературу, тот же MSDN.
Про двойную буферизацию, ссылку кинуть, или сам найдешь.

Как бы, я смогу обойтись без ссылок от коллеги, употребляющего термины "закрепление рисования на хэндле"

nesco писал(а):
Galkov, у меня складывается впечетление, что только ты один у нас читать умеешь, остальные мимо проходили. И твои речи -- это истина в первой инстанции. Нельзя так, не правильно это

1) Простите, чего-то я недопонял, наверное: а где тогда проходили эти "остальные", когда делали по пять рисований вместо одного. "Аргументация" на форуме осталась - можно прочитать еще раз.

2) Если у "нас" - это у тебя, я справлюсь с этой бедой.

3) Мои речи, это изложение знания, у меня же и возникшего. Это немножко отличается от "везде написано". Оно может быть правильным, может - нет. Оно может измениться. Но уж точно, не в результате сообщения "я где-то слышал".

4) Я был бы рад, наоборот - получить знания, и обойтись без "изложения", и без перетряхивания кодов.
А просто воспользоваться результатами работы коллеги.
Если бы волосы после этого дыбом не вставали.

карма: 9

0
Голосовали:Астрамак, temp
Разработчик
Ответов: 26151
Рейтинг: 2127
#125: 2008-01-30 18:39:12 ЛС | профиль | цитата
Galkov, вот это не я писал:

tsdima писал(а):
Только не забывайте, что делать это желательно не прямо на экране, а в памяти, а потом готовый кусочек картинки быстренько поместить на экран. Иначе моргать будет.
Многие 2D игры, однако, подготавливают весь экран в памяти, иначе, если много спрайтов, возня с каждым в отдельности будет накладной.

А выходит, и его предложение не является аргументом, ну извините, тогда я пас. Я еще раз скажу, пусть будет по твоему. Никаких аргументов, или ссылок на аргументы от тебя я не видел, а твоя позиция -- есть твоя позиция, пусть она твоей и останется.

А вот это выдержка из книги по KOL'у

Кладов писал(а):
DoubleBuffered - определяет, используется двойная буферизация ли для рисования окна
(и всех окон, дочерних по отношению к данному объекту). Двойная буферизация повышает
скорость перерисовки визуального объекта. В KOL, практически любой визуальный объект
(и в том числе форма) может использовать двойную буферизацию. Исключение: rich edit;
DblBufTopParent - возвращает родительский визуальный объект со свойством двойной
буферизацией самого верхнего уровня;


И только в одном единственном месте, у нас в пакете, применяется двойная буферизация в контроле, это -- ListEdit, и больше ни где.



карма: 22

0
Ответов: 9906
Рейтинг: 351
#126: 2008-01-30 20:06:22 ЛС | профиль | цитата
Офигеть

tsdima, ну ты думай тогда, кому и чего говорить
Оказывается, что следствием именно твоих слов - являются коды:

#pas
procedure THiImageLoader.Stretch;
var memDC: HDC;
bm: HBITMAP;
begin

memDC := CreateCompatibleDC(DC);
bm := CreateCompatibleBitmap(DC, w1-x1, h1-y1);
SelectObject(memDC, bm);
FImgCtx.StretchBlt(memDC, 0,0,w1-x1,h1-y1,x3,y3,w3,h3, SRCCOPY);
BitBlt(DC, x1, y1, w1-x1, h1-y1, memDC, 0,0, SRCCOPY);
DeleteDC(memDC);
DeleteObject(bm);

// FImgCtx.StretchBlt(DC, x1,y1,w1,h1,x3,y3,w3,h3, SRCCOPY);
end;
Выяснять, почему крайним оказался именно ImageLoader, а не все элементы со св-ом DrawSource - СИЛ МОИХ БАБСКИХ БОЛЬШЕ НЕТУ
Теперь я - ПАС

tsdima, твоя очередь
А я посмотрю спокойно, какая истина родится в вашем споре
карма: 9

0
Голосовали:Астрамак, temp
Разработчик
Ответов: 26151
Рейтинг: 2127
#127: 2008-01-30 22:23:59 ЛС | профиль | цитата
Galkov, ну не ругайся ты сильно на меня

Этот код, действительно нельзя считать двойной буферизацией, его считают обычным ускорителем вывода на контекст, хотя, как работает StretchBlt COM-объекта, тоже не известно. Для того, чтобы он стал действительно нормальным ускорителем с двойным буфером, необходимо, что бы функция BitBlt стояла в обработчике onPaint, что для этого компонента неприменимо.

Да и не настаивал я на применении именно этих кодов, я просто хотел показать надобность двойной буферизации, а какая должна быть реализация, то вопрос этот уже второй. Двойной буфер можно включить проще, назначив тому же PaintBox'y DoubleBuffer=true при инициализации свойств контролу, и посмотреть, что из этого получится.

Насчет ускорителя мне еще Dilma говорил, что применять его не стоит в компонентах -- слишком ресурсоемкий метод.
карма: 22

1
Голосовали:Астрамак
Ответов: 9906
Рейтинг: 351
#128: 2008-01-30 23:04:16 ЛС | профиль | цитата
А я не ругаюсь, я сообщаю информацию.

Которая заключается в следующем:
  • Приведенный код есть не более, чем бред сивой кобылы (не говоря уже о буферизации). Это из серии: "что делает кот, когда ему делать нефиг..."
  • Двойная буферизация и св-во DoubleBuffered для контролла - это не тождественные вещи. Второе является всего лишь одним из способов реализации первого.
  • Если читать не только "колобок", но и исходные коды, то можно обратить внимание на то, что механизм DoubleBuffered основан на том, что по onPaint в аргументе передается не контекст окна, а совместимый с неким главным битмэпом. Который одним махом и выкидывается потом на контекст окна. И исключение для RichEdit как раз и связано с тем, что эта зараза (говоря словами Кладова) при default-рисовании пользует не параметр от WM_PAINT, а самостоятельно (видимо, как и мы) добывает его независимым путем.
  • Именно по этой причине в HiAsm эту фишку в KOL с маху использовать нельзя: мы можем рисовать не на контексте (поэтому и не получаем его нигде), а "на хэндле окна"
  • Опять же, если читать не только "колобок", но и исходные коды, то можно понять, что установка св-ва Transparent автоматически включает DoubleBuffered. Таковое (к сожалению) встречается не только в ListEdit
  • А рисование в Image и PaintBox - это чистейшей воды двойная буферизация, хоть и не имеющая никакого отношения к DoubleBuffered . Как бы не было противно окружающим.
    Потому и не мигает, кстати говоря.

  • карма: 9

    2
    Голосовали:nesco, temp
    Разработчик
    Ответов: 26151
    Рейтинг: 2127
    #129: 2008-01-30 23:39:33 ЛС | профиль | цитата
    Со всем, что ты сейчас написал, можно полностью согласиться. Этот код, кстати, не мой, я его из инэта выдернул, как ускоритель вывода с буферизацией.
    А DoubleBuffered в контролах я уже успел проверить (на градиентном ListBoxEx'e) -- моргание при Resize напрочь пропадает (внизу остается небольшое подергивание), но и отрисованный текст, тоже начинает исчезать при перемещении курсора. Видимо действительно:
    Galkov писал(а):
    в HiAsm эту фишку в KOL с маху использовать нельзя

    Galkov писал(а):
    А рисование в Image и PaintBox - это чистейшей воды двойная буферизация
    Я на них тоже проверял -- никакого толку от включения двойной буферизации не наблюдалось.

    Galkov писал(а):
    Как бы не было противно окружающим
    Совершенно обратная реакция.

    Galkov, и всеже, я скажу тебе спасибо, что не пожалел времени и показал, где искать истину.



    карма: 22

    1
    Голосовали:Эдик
    Ответов: 9906
    Рейтинг: 351
    #130: 2008-01-31 10:05:03 ЛС | профиль | цитата
    nesco писал(а):
    Я на них тоже проверял -- никакого толку от включения двойной буферизации не наблюдалось

    Двойная буферизация, это не есть DoubleBuffered, это есть рисование (возможно многократное по одним и тем же местам) в промежуточный буфер (в данном случае в bmp.canvas.handle), и однократный вывод этого буфера в целевой контекст.
    И все
    Galkov писал(а):
  • Двойная буферизация и св-во DoubleBuffered для контролла - это не тождественные вещи. Второе является всего лишь одним из способов реализации первого.
  • карма: 9

    1
    Голосовали:temp
    Ответов: 2125
    Рейтинг: 159
    #131: 2008-01-31 11:18:13 ЛС | профиль | цитата
    Galkov писал(а):
    tsdima, твоя очередь

    С некоторых пор эта тема стала больше походить на личку. Я бы на вашем месте выяснял отношения именно там, а публике сообщил лишь конечный результат дискуссии.
    Честное слово, устал читать.

    З.Ы. А Васька слушает, да ест.
    карма: 1

    0
    Ответов: 9906
    Рейтинг: 351
    #132: 2008-01-31 11:31:00 ЛС | профиль | цитата
    УРА, я понял

    Преодоление чужих заблуждений, это исключительно моя прерогатива
    Поэтому и два автора, а, следовательно - личка
    Все логично
    карма: 9

    2
    Голосовали:Stasie, temp
    132
    Сообщение
    ...
    Прикрепленные файлы
    (файлы не залиты)