![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#491 | ||
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
![]() Цитата:
Давайте же будем нажимать на "кнопку" без посредников! ...если Вася был мертвецки пьян, то "вагон" разгружен не будет ) Я сейчас не использую ни PaintBox, ни Image, ...рисую сразу на содержимое формы. Как стало известно, в Windows без разницы куда выводить графику, хоть в окно, хоть в кнопку, ...нужен лишь контекст. Цитата:
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
||
![]() |
![]() |
![]() |
#492 | |
Телепат с дипломом
Старожил
Регистрация: 10.06.2007
Сообщений: 4,929
|
![]() Цитата:
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог |
|
![]() |
![]() |
![]() |
#493 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
![]()
Думаю, мы вместе найдем наибыстрейшую формулу работы с графикой в окне Windows )
Пока структура такая: 1) подготовка заднего фона, запись в буфер в ОЗУ; 2) перенос буфера заднего фона в буфер построения кадра (в ОЗУ, на ASM); 3) построение кадра в буфере (в ОЗУ); 4) вывод кадра на экран через контекст (WMPaint); Если позволите, предложу вместе подумать над алгоритмом построения кадра, в частности - отрисовкой текстур с учетом выхода за пределы экрана. Наверняка можно сделать эффективнее.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
![]() |
![]() |
![]() |
#494 | |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
![]() Цитата:
- Как это сделано сейчас ? - и кадр и текстура - это ссылки, полученные вызовами CreateDIBSection ? и нужен аналог bitBlt для этих структур ? |
|
![]() |
![]() |
![]() |
#495 |
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
![]()
Текстуры - это обычные Bitmap картинки, загруженные в массив через LoadFromFile, ...текстура содержит в себе и маску, это два одинаковых по размеру изображения, расположенных друг под другом, ...верхнее в цвете, нижнее - маска прозрачности.
Как бы не запутать в конец, ...придется немного упростить, пусть будет как для одного объекта y_up - начальная строка выборки изображения (по-ScanLine); y_down - конечная строка выборки; y_zone - начальная строка выборки изображения в DrawBuf; x_left - начальный пиксел (слева); x_right - конечный пиксел (справа); x_zone - начальный пиксел в DrawBuf; TexDispX - смещение по-X объекта на карте к центру его координат; TexDispY - смещение по-Y объекта на карте к центру его координат; TexW - ширина текстуры (в сборе ровно половина исходного изображения); TexH - высота текстуры; W - Ширина экрана; H - Высота экрана; dt - клетка карты, Y-координата; dz - клетка карты, X-координата; TexLine - точная длина строки изображения для текстуры. Вот так выглядит обрезка текстур, в алгоритме, который выполняется один раз после смещения координат карты, и параметры обрезки сохраняются в массив для каждого объекта (экономим ресурсы): Код:
Код:
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
![]() |
![]() |
![]() |
#496 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
![]()
Да, будем.
................................... ............................ Предложения и вопросы в readme.txt Последний раз редактировалось alexBlack; 15.05.2008 в 11:34. |
![]() |
![]() |
![]() |
#497 | ||
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
![]() Цитата:
По поводу ScanLine, ...и в моем случае он берется один раз после изменения на игровом поле (сдвинулась карта в нужное место, можно передвигать персонажа, участвовать в схватке и пр., и пока на экране эта область ScanLine "отдыает"), так что в цикле он не участвует. Если есть возможность вообще от него отказаться, то я за! Цитата:
Постоянно преследуют мысли заменить весь цикл отрисовки в DrawBuf с известными границами данных на ASM-код, только не силен в этом, искал примеры, не смог понять ![]()
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
|
||
![]() |
![]() |
![]() |
#498 | |||||
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
![]() Цитата:
Цитата:
Код:
Код:
Код:
Цитата:
Цитата:
Видел другой вариант - см.ниже. Если не трудно, приведите и исходную формулу. Будет больше простора при реализации на ассемблере. Цитата:
улучшить в лоб то, что генерирует компилятор. Максимум можно выкинуть shr. Нужно менять подход. Поэтому я спрашивал нельзя ли изменить формулу на работу с байтами и словами. Сейчас компилятор делает так: byte(R) + byte ((integer(R)-integer(R)) * integer(R) shr 8) из статьи: http://www.wl.unn.ru/~ragozin/diff/mmx.htm попробовал вставить кусок кода на mmx-командах. В принципе работает, хотя и не сильно быстрее, но формула немного другая, поэтому и результат отличается. a = b + (a - b) * alpha Еще вопрос по условию. if (MapPixel.R>0) And (MapPixel.G>0) And (MapPixel.B>0) then begin т.е. если ВСЕ составляющие отличны от нуля, то смешивать. Не нарушит логику, если будет другое условие : "если ВСЕ компоненты = 0, то НЕ смешивать" ? Пока все. С asm'мом буду пробовать. |
|||||
![]() |
![]() |
![]() |
#499 |
Участник клуба
Регистрация: 12.10.2007
Сообщений: 1,204
|
![]()
Добил ассемблерные вставки. Выводы:
Исходный вариант (время выполнения ~1.7 единиц): Код:
Вот это уже есть смысл использовать. Некоторые замечания по коду. Во первых обработка идет по 4 байта, а не по три. (можно обрабатывать по 8 байт - время уменьшается до ~1.4) Здесь нужно еще подумать. Или сделать размер текстур кратным 4-м или дополнительно обрабатывать оставшиеся байты. Из-за этого я несколько вольно обошелся с условием. Смешение цветов делается для всех байт. Просто умножение на 0 дает 0 и ничего не вносит в исходную картинку. Это не соответствует исходному условию при котором смешение не производится, если хотя бы один цвет =0. Код:
(не буду приводить код) Наоборот, время выполнения стало еще больше. т.е. Delphi генерирует код лучше меня ![]() Последний раз редактировалось alexBlack; 15.05.2008 в 22:03. |
![]() |
![]() |
![]() |
#500 | ||||||
Инженер ИС
Старожил
Регистрация: 13.12.2006
Сообщений: 2,671
|
![]()
alexBlack, ну что же, не получилось так не получилось, и на том спасибо за помощь
![]() Цитата:
Код:
Код:
Код:
Цитата:
Result = Source * (Alpha/256) * (SelfAlpha/256) + Dest * (1 - (Alpha/256) * (SelfAlpha/256)) SelfAlpha - это общая прозрачность полученного результата (кроме прозрачности для каждого пиксела Alpha). Этот параметр я выкинул, после упрощения получилось более просто, ...кроме того читал, что A shr 8 выполниться быстрее и всегда целочисленно, чем А/256, тут еще и Round придется использовать к тому же, ...вот упрощенная формула: Result := Dest + (Source - Dest) * Alpha shr 8; Цитата:
Цитата:
Цитата:
![]() Спасибо за старания, очень ценю!
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Последний раз редактировалось Beermonza; 16.05.2008 в 00:17. |
||||||
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Уроки по созданию игр для новичков... | -=DeS=- | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 750 | 14.11.2017 20:26 |
Музыка программистов - как вы относитесь к АРИИ? | Весёлый Жека | Свободное общение | 46 | 10.10.2008 22:32 |
Конкурсы по созданию игр на Delphi | mutabor | Свободное общение | 0 | 15.06.2007 12:40 |
Работа по созданию ПО | remix | Фриланс | 3 | 22.04.2007 11:00 |