Конференция "Игры" » как выловить начало кадровой развертки. [D7, WinXP]
 
  • ol'ka (20.06.08 16:22) [20]

    > TransparentBlt
    > В качестве одного из параметров идет цвет, который должен
    > быть прозрачным.
    > Blendinga(насколько мне известно) у канваса можно только
    > вручную добиться.

    т.е. что-то руками приделывать нада? это жуть, я наверное сделаю 2 битмапа один со статикой а в другой буду статику каждый раз копировать и дорисовывать остальное ну и на канвас его потом ... как вам такое видится?
  • Sapersky (20.06.08 16:36) [21]
    я наверное сделаю 2 битмапа один со статикой а в другой буду статику каждый раз копировать и дорисовывать остальное ну и на канвас его потом ... как вам такое видится?.

    Нормально, хотя не факт, что копирование будет быстрее чем перерисовка, смотря что там рисуется. Если всякая мелочь вроде линий - наверняка быстрее будет перерисовать.

    Blendinga(насколько мне известно) у канваса можно только вручную добиться.

    AlphaBlend
  • ol'ka (20.06.08 16:46) [22]
    сетка из точечных линий там рисуется, средней густоты, впрочем оба метода легко можно будет проверить на деле и судить по факту, хотя судя по тому что даже на 800-м селероне загрузка проца на нуле разница несущественная
  • ol'ka (20.06.08 16:54) [23]
    и еще, может проще будет для формы:
       Canvas.Draw(0,0,BitMap1); вместо этого ужасного BitBlt .... ?
  • @!!ex © (20.06.08 18:04) [24]
    > [23] ol'ka   (20.06.08 16:54)

    Блитинг быстрее. че в нем ужаснее?
  • ol'ka (20.06.08 18:24) [25]
    да ниче в принципе, как говорится "слишкам многа букаф", но если быстрее работает, то это аргумент ... кстати прога уже переписана и чета черен канвас форменный как ворон, пытаюсь побороть ...
  • ol'ka (20.06.08 18:56) [26]
    Я смотрю устали от меня все ...

    Проблему поборол - битмапам размеры не были заданы, теперь вопрос стоит как битмапу задать черный фон по умолчанию и оказывается BitBlt не трет канвас формы а накладывает изображение поверх почемуто ...
    полезные советы вовремя приветствуются!
  • @!!ex © (20.06.08 19:07) [27]
    > [26] ol'ka   (20.06.08 18:56)

    А почему он должен тереть Кэнвас формы?
    Черный цвет задается с помощью:
    Canvas.Brush.Color := clBlack;
    Canvas.FillRect(RECT(0,0,Width,Height));
  • Sapersky (20.06.08 19:26) [28]
    Блитинг быстрее. че в нем ужаснее?

    Примерно на 3%, по моим измерениям :)
    Хотя Canvas.Draw использует StretchBlt, он, видимо, соображает вызвать BitBlt при DstSize = SrcSize.
  • ol'ka (20.06.08 19:46) [29]

    > А почему он должен тереть Кэнвас формы?

    нет, таки трет, ибо с канвасом формы работает, ведь так и должно быть ... а иначе ерунда какая-то получится

    > Черный цвет задается с помощью:
    > Canvas.Brush.Color := clBlack;
    > Canvas.FillRect(RECT(0,0,Width,Height));


    да, да , все именно так и было сделано, пришлось догадаться, и влепить ето для bitmap1 в обработке TForm.onCreate, там же и статика прорисована.

    Короче все работает, облом был когда мне показалось что BitMap1:=BitMap2 скопирует статику из BitMap1 в BitMap2, уж чего оно там натворило разбираться вломы, и чтобы недалеко ходить BitBlt рулит 2 раза - когда BitMap1 в BitMap2 загоняем и когда BitMap2 на канвас формы скидываем. А DoubleBuffer в принципе отдыхает все так быстро происходит что независимо от его значения все проблемы с которых началась тема ушли сами по себе.

    Низкий вам поклон господа крутые програмеры, респект и все такое!
  • ol'ka (20.06.08 19:56) [30]
    P.S. ... забавно было бы все-таки узнать как перехватить прерывание от видеокарты, так чтобы попроще, без всяких там OpenGl, ведь это же всего лишь навсего прерывание, коих в системе много разных, так что вопрос выходит за рамки решенной теперь уже задачи ...
  • @!!ex © (20.06.08 20:39) [31]
    > мне показалось что BitMap1:=BitMap2 скопирует статику из
    > BitMap1 в BitMap2, уж чего оно там натворило разбираться
    > вломы

    Переменная классовая - это указатель.
    Есть два экземпляра класса, на которые указывают переменные BitMap1 и BitMap2.
    А вы взяли и сказали, что BitMap1 указывает не на свой экземпляер, а на BitMap2.
    Если выражаться метафорически, есть два города, Питер и Москва. И есть на дороге два указателя: На Питер и на Москву. А вы взяли и сказали, нифига... Указатель с надписью Питер путь показывает на Москву.. И стали оба указателя указывать на Москву... Хотя написано на них разное... А Питер оказался вообще без указателей... и к нему больше никак не приехать... ибо непонятно куда ехать...


    > чтобы недалеко ходить BitBlt рулит 2 раза - когда BitMap1
    > в BitMap2 загоняем и когда BitMap2 на канвас формы скидываем.
    > А DoubleBuffer в принципе отдыхает все так быстро происходит
    > что независимо от его значения все проблемы с которых началась
    > тема ушли сами по себе.

    Я не понял фразы. :) Так Даблбуффер рулит, или без даблбуффера?
  • ol'ka (20.06.08 21:12) [32]

    > Я не понял фразы. :) Так Даблбуффер рулит, или без даблбуффера?

    даблбуфер получается не при делах, рулит рисование в битмап как мне тут посоветовали он и есть наш буфер! рисуй себе что хочешь и сколько хочешь (по времени), а когда это нада отобразить просто кидаешь на Form.Canvas и ниче не нада буферить, переброска изображения из битмапа на экран происходит мгновенно, значительно быстрее чем движется развертка потому ниче не рвет и не моргает, на маленьких размерах по крайней мере так, а что там будет на больших кто его там знает, но уж если рвать будет то и даблбуфер не решит проблему ведь он тоже суть область памяти в которую все рисуется допустим медленно а потом вся область насколько позволяет скорость шины и частота проца скидывается в видеопамять ...
  • ol'ka (20.06.08 21:24) [33]
    А что касается BitBtl хоть он и быстрее - все же не прижился, выражение громоздкое, тяжелочитаемое, значительно красивее и понятнее с Draw получается а разницы не видно вообще.
  • Сергей М. © (20.06.08 21:29) [34]

    > как перехватить прерывание от видеокарты


    Оч просто - написать драйвер режима ядра)
  • @!!ex © (20.06.08 21:48) [35]
    > [32] ol'ka   (20.06.08 21:12)

    Гы. ЛОЛ.
    Это и есть двойная буфферизация. :)))
    Когда рисуешь в памяти(на битмапе), а потом одной командой выкидываешь это на экран. :))))
  • ol'ka (20.06.08 21:49) [36]
    to @!!ex

    специально чтобы разобраться с DoubleBuffer подменяем в процедуре работу с Bitmap2.Canvas на Form.Canvas с включенным и выключенным DoubleBuffer и разницы не видно, рисует на экране со всеми первоначальными траблами, т.е. нет никакой буферизации все на экране происходит так что загадкой для меня пока остался DoubleBuffer ...
  • @!!ex © (20.06.08 22:14) [37]
    > [36] ol'ka   (20.06.08 21:49)

    Тк хрень, которая называется DoubleBuffer у компонентов - она хрень и есть.
    Я описал что есть двойная буфферизация. :) А вы ее успешно реализовали.
  • @!!ex © (20.06.08 22:23) [38]
    Я когда писал о двойной буфферизации ни словом не обмолвился об компонентах и их свойствах...
    Сказал лишь, что рисовать надо на битмапе. :__
  • ol'ka (20.06.08 22:24) [39]
    да уж "ручной даблбуффер получился" ...

    вот цитата из хелпа на аглицком диалекте :)

    DoubleBuffered property (TWinControl)
    Determines whether the control’s image is rendered directly to the window or painted to an in-memory bitmap first.

    When DoubleBuffered is false, the windowed control paints itself directly to the window. When DoubleBuffered is true, the windowed control paints itself to an in-memory bitmap that is then used to paint the window. Double buffering reduces the amount of flicker when the control repaints, but is more memory intensive.

    When a windowed control is a dock site and has an associated dock manager, it must be double-buffered.

    Note: Some controls, such as TRichEdit, can’t paint themselves into a bitmap. For such controls, DoubleBuffered must be set to false.

    ... из текста следует что даблбуффер работает для объектов которые мы помещаем на форму а саму форму не буферит ... может если влепить на форму панельку тогда ее канвас будет буфериться автоматом, стоит ли проверять?
 
Конференция "Игры" » как выловить начало кадровой развертки. [D7, WinXP]
Есть новые Нет новых   [119107   +102][b:0][p:0.001]