|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
14.01.2010, 21:47 | #1 |
Форумчанин
Регистрация: 25.06.2009
Сообщений: 163
|
BitBlt
Подскажите, пожалуйста, кто знает, как через функцию BitBlt рисовать прозрачность? У меня такой код:
BitBlt(BmpBuf.Canvas.Handle, X + j * 50 - 50, Y + i * 50 - 50, 50, 50, Textures[0].Canvas.Handle, 0, 0, SrcCopy); И на той текстуре есть пиксели, закрашенные белым цветом, при выводе которые должны быть прозрачными. Рисовал через Canvas.Draw, и все было нормально, но через BitBlt пиксели рисуются белыми. |
15.01.2010, 14:37 | #2 | |
Участник клуба
Регистрация: 06.03.2009
Сообщений: 1,346
|
А зачем рисовать через bitbit если можно через canvas.draw, ведь сами говорите с ним нет проблем. BitBit полезно использовать с различными флагами а SrcCopy - простое копирование без учета цвета прозрачности. Вот остальные флаги:
Цитата:
|
|
15.01.2010, 15:04 | #3 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
ZotaC, для чего конкретно применяется BitBlt? ...судя по параметрам, в цикле выстраивается картинка из кусочков 50х50. Уточните.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
15.01.2010, 21:17 | #4 |
Форумчанин
Регистрация: 25.06.2009
Сообщений: 163
|
Когда я рисовал через Canvas.Draw, то игра занимала у меня 20-25% ЦП, а когда стал рисовать через BitBlt, она занимает 0-2%.
|
15.01.2010, 21:33 | #5 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Естественно, флаг SrcCopy работает очень быстро, это банальный переброс без манипуляций. В Canvas.Draw с прозрачностью Transparent есть условия, это тормозит процесс.
BitBlt эффективен при выводе готового кадра на форму, или куда вам нужно. Саму подложку лучше "собрать" один раз, и хранить как большой кусок экрана, ...загоняя его сначала в буфер, потом поверх динамические объекты. Как только обстановка в кадре меняется, снова выполняется сбор подложки, и она используется как задний фон. Опишите вашу игру, как вы выполняете цикл отрисовки.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
15.01.2010, 21:53 | #6 |
Форумчанин
Регистрация: 25.06.2009
Сообщений: 163
|
Ну, во-первых, все рисуется в таймере (25 мс, так как если поставить 10, то загрузка будет еще больше). Первым идет цикл, который рисует текстуры (через case, проверяя по номерам текстур те, которые должны рисоваться в данных ячейках). Естесственно, рисуется только та часть, которая в данный момент находится на экране.
Далее рисуется игрок, потом идет цикл, который рисует врагов, потом определенные спецэффекты на карте (у меня массив карты типа TMap - запись, поэтому некоторые спецэффекты присваиваются определенным ячейкам массива, на что пришлось завести еще одно поле). Ну, далее - надписи (вывод статистики вверху экрана - сколько у игрока жизней, сколько врагов на карте и т.д.). Сама игра разворачивается на весь экран, меняя разрешение на 800х600. |
15.01.2010, 22:10 | #7 |
Участник клуба
Регистрация: 06.03.2009
Сообщений: 1,346
|
Это не первая и не последняя тема про скорость работы Canvas. Идеального результата не объешься, но можешь выводить сначала фон на буффер а потом фон+динамические объекты на другой буффер, а потом SRCCopy на форму как тебе Beermonza говорит. Он в своей игре добился нормальной скорости, но там оптимизизация . Если хочется без глюков учи DX/GL или бери двиг на них.
|
15.01.2010, 22:27 | #8 | |
Форумчанин
Регистрация: 25.06.2009
Сообщений: 163
|
Цитата:
А на DX/GL я еще перейду, всему ведь свое время, да? Вы только скажите мне, какая примерно загрузка ЦП считается нормальной для игр на canvas? Тут, конечно же, зависит от характеристик компьютера, но хоть примерно. |
|
16.01.2010, 00:50 | #9 | ||||
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
Ускорение отрисовки графики
"Как вы относитесь к созданию игр на Delphi?" - тема в которой история "крупного проекта" с примерами и фишками оптимизации, с дельными советами, скринами и многим другим.
"Уроки по созданию игр для новичков" - там масса примеров игр на канве, аркадные тоже есть, разборка кодов, пояснения, ...почитайте, поможет. Цитата:
Цитата:
Как только персонаж или что там у вас, шагнет за пределы экрана, флаг update станет True, кроме того изменится и диапазон сканирования массива карты, а процедура сбора подложки соберет новый задник и снова отправит его в кадр. Таким образом один полный экран подложки выводится через BitBlt просто копированием, и в 100 раз быстрее чем аналогично, но каждый такт собирая задник по кускам. Цитата:
Цитата:
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
||||
16.01.2010, 01:32 | #10 | ||
Студент, не
Старожил
Регистрация: 29.01.2009
Сообщений: 2,067
|
Цитата:
Вот основные WinAPI функции: BitBlt - вывод изображения; StretchBlt - вывод изображения с растягиванием; PlgBlt - вывод изображения с параллельной проекцией (поворот); TransparentBlt - вывод изображения с прозрачным фоном; MaskBlt - вывод изображения по маске; AlphaBlend - вывод изображения с полупрозрачностью; Цитата:
I am the First of Cyber Evolution...
I am the First to Program your Future... |
||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
BitBlt на контекст DC и его альтернатива | notHaker | Мультимедиа в Delphi | 7 | 03.12.2009 01:04 |