|
|
|
Sprite картинка, внутри |
|
|
ivanTu |
17.3.2017, 14:57
|
Apprentice
Сообщений: 128
Регистрация: 2.2.2015 Группа: Пользователи Наличность: 0
Пользователь №: 17.276
Возраст: 27
|
Доброго времени суток, у меня собственно вопрос, можно ли объединить несколько десяток мелких картинок в одну большую, и искать непосредственно задавая координаты маленькой картинки внутри большого изображения, ускорит ли это программу в целом? Или может можно как то оптимизировать загрузку картинок в память, а то у меня уже около 30ти, грузится, и параллельно вопрос, если я при каждом запуске гружу картинки в память, они перезаписываются, или загружаются в новые участки памяти не очищая предыдущие, тем самым грузя оперативку?
|
|
|
|
ivanTu |
23.3.2017, 11:39
|
Apprentice
Сообщений: 128
Регистрация: 2.2.2015 Группа: Пользователи Наличность: 0
Пользователь №: 17.276
Возраст: 27
|
Цитата(Cockney @ 17.3.2017, 16:05) Справку открыть уже совсем лень ? ВикиТребуется пилот 2.39 П.С. И это еще полностью на луа не перешли.... Пользуюсь ей постоянно... вы поняли вопрос? Вы знаете что такое спрайт изображений? Вот к примеру картинка содержит в себе множество картинок. Как ее одну можно использовать в разных ситуациях? cirus, спасибо подсказал.
Эскизы прикрепленных изображений
|
|
|
|
Cockney |
24.3.2017, 10:34
|
Master
Сообщений: 1.395
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 21045
Пользователь №: 16.156
|
Заморочился Обработка спрайта
Код //Работа с мульти-изображением
//Чистка лога log clear
//Установка константных значений
//Ширина одного спрайта в писклелах: set #sprite_size_x 5 //Высота одного спрайта в пикселах: set #sprite_size_y 5 //Имя файла set $filename sprite.bmp
//Рабочая часть
//Загрузка изображения set %sprite[1] LoadImage($filename) if (size(%sprite) = 0) log Ошибка загрузки файла $filename end_if
//Если ширина загруженного изображения не кратна #sprite_size_x if (mod(%sprite[1 2] #sprite_size_x) > 0) log Изображение имеет некорректную ширину. set $rf DeleteImage(%sprite[1 1]) //обработка ошибок if ($rf < 0) log Ошибка освобождения ресурсов. end_if end_if //Таже проверка для высоты if (mod(%sprite[1 3] #sprite_size_y) > 0) log Изображение имеет некорректную высоту. set $rf DeleteImage(%sprite[1 1]) //обработка ошибок if ($rf < 0) log Ошибка освобождения ресурсов. end_if end_if
//Изображение загружено, теперь нужно вычислить длину строки спрайта в байтах set #sprite_raw_size #sprite_size_x * 3
//Получили размер строки спрайта, теперь остается разбить исходную картинку на зоны спрайтов //Картинка по сути похожа на массив : //[1][2][3][4][5] //[6][7][8][9][10] //и тд. //Только вместо индексов лежат мини-картинки. //LoadImage дает нам адрес всей картинки, начиная с 1 байта, т.е. адрес указывает на первый спрайт. //Для расчета адресов всех спрайтов у нас есть все что нужно : размеры спрайта, размер строки байт спрайта и начальный адрес
//Кол-во индексов X set #sprite_cnt_x %sprite[1 2] / #sprite_size_x //Кол-во индексов Y set #sprite_cnt_y %sprite[1 3] / #sprite_size_y //Последний рассчитанный адрес, начальное значение адрес, вернувшийся из LoadImage set #last_sprite_addr %sprite[1 1]
//Формируем спрайты //Спрайты расположены в виде матрицы, как описано выше //Запускаем перебор всей матрицы с шагами раными размерам одного спрайта for #y 1 #sprite_cnt_y #sprite_size_y for #x 1 #sprite_cnt_x #sprite_size_x //рассчитаем индекс(для массива с результатом) обрабатываемого спрайта set #array_index #sprite_cnt_x * (#y - 1) + #x //Заполним его
//ТУТ Я ЗАПУТАЛСЯ, НАДО ГДЕ-ТО ИСПРАВИТЬ
//(#SPRITE_RAW_SIZE * #sprite_cnt_x) * (#y - 1) + ((#x - 1) * #sprite_raw_size) //set #last_sprite_addr #last_sprite_addr + (#sprite_raw_size * #sprite_cnt_x) * (#y - 1) + (((#x - 1) * #sprite_raw_size) * #sprite_size_y) set #last_sprite_addr #last_sprite_addr + ((#y - 1) * #sprite_size_y) * (#sprite_raw_size * #sprite_cnt_x) + (#x - 1) + #sprite_raw_size set %sprites[#array_index 1] #last_sprite_addr set %sprites[#array_index 2] #sprite_size_x set %sprites[#array_index 3] #sprite_size_y set %sprites[#array_index 4] #sprite_raw_size end_for end_for
//Теперь %sprites содержит список всех загруженных спрайтов (в изображении-примере их 2601) //Получить доступ к конкретному спрайту можно через индекс, расчитывается так : //<кол-во столбцов массива> * (#y - 1) + #x //#x, #y - начальные координаты нужного спрайта
end_script Идея в том, чтобы все искомые картинки слепить в один bmp, дальше их раздербанить и использовать. В одном изображении 255х255 содержится 2601 спрайт размером 5х5, если я правильно посчитал. Работу не тестил, кто сможет - отпишитесь. Так же там я поставил небольшую пометку что я ошибся в формуле, правильный вариант написан (вроде), но я не помню какой. Не знаю, сколько времени займет вызов 2600 LoadImage, но такой скрипт отрабатывает за пару секунд без оптимизаций.
|
|
|
|
DarkMaster |
27.3.2017, 16:15
|
Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27679
Пользователь №: 11.279
|
Цитата Если подсунуть findimage адрес не левого верхнего пикселя, то результатом будет -5, ошибка обработки искомого изображения. Вообще по идее такая фишка не должно прокатывать по той причине, что обязательным атрибутом для бмп является его размер, т.к. определить его невозможно по каким-либо косвенным признаком(например, как для строки \0). Битовая маска может содержать в себе любой порядок байт, соответственно пилоту необходимо задание размера. Бмп в памяти выглядит примерно так: атрибут атрибут атрибут атрибут размер количество байт атрибутов(для вычисления адреса начала битовой маски)атрибут атрибут атрибут битовая маскаПоскольку пилот скорее всего приводит бмп к единообразию либо допускает использование только определенный формата бмп (их много, из-за этого кстати могли быть проблемы возникавшие с другими редакторами.), то количество байт между: размер количество байт атрибутов(для вычисления адреса начала битовой маски)и битовая маскаскорее всего статично и отсылая в пилот адрес начала битовой маски, он просчитывает смещение и получает размер. Если же мы просто уведем в сторону от первого пикселя адрес, то размер мы уже не получим нормальны и пойдет бред.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
WKnight |
27.3.2017, 20:55
|
Разработчик UO Pilot'а
Сообщений: 1.639
Регистрация: 9.1.2006 Группа: Пользователи Наличность: 0
Пользователь №: 4.688
|
Цитата Просто пересохранит загруженную картинку под другим именем. Скорее последнюю загруженную\сохраненную. Бага. Не должно сохранять вообще. Исправил сохранение изображения в файл в функции 'SaveImage', при указании неправильного адреса. Добавил код ошибки '-7' - не нашли указанное изображение. Цитата а зачем тогда гемор с возвратом адреса и размеров загруженного бмп, если с ними ничего нельзя сделать Сделать можно, где то упоминалось что это в основном для плагинов, если кому-то понадобится. Возвращаемых данных как раз достаточно для сохранения маски в читабельный файл. С другой стороны адрес в пилоте используется помимо адреса еще и как идентификатор. Поэтому во всякие финдимиджы адрес нужно передавать не измененным. Цитата init_arr %b (1) #adres 3 4 12 // адрес, ширина, высота, длина строки set #a findimage(0 0 1920 1080 (%b [1 1]) %arr) Массив "%b" создавать не обязательно, пилот не использует ничего из его содержимого кроме адреса. Остальные параметры он и так помнит. Если нужно брать кусочки из загруженной картинки, проще наверно будет доработать функцию GetImage.
|
|
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|