Здравствуйте, гость ( Вход | Регистрация )

> Sprite картинка, внутри
ivanTu
сообщение 17.3.2017, 14:57
Сообщение #1


****

Apprentice
Сообщений: 128
Регистрация: 2.2.2015
Группа: Пользователи
Наличность: 0
Пользователь №: 17.276
Возраст: 27



Доброго времени суток, у меня собственно вопрос, можно ли объединить несколько десяток мелких картинок в одну большую, и искать непосредственно задавая координаты маленькой картинки внутри большого изображения, ускорит ли это программу в целом?
Или может можно как то оптимизировать загрузку картинок в память, а то у меня уже около 30ти, грузится,
и параллельно вопрос, если я при каждом запуске гружу картинки в память, они перезаписываются, или загружаются в новые участки памяти не очищая предыдущие, тем самым грузя оперативку?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
Cockney
сообщение 24.3.2017, 10:34
Сообщение #2


********

Master
Сообщений: 1.404
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 22549
Пользователь №: 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, но такой скрипт отрабатывает за пару секунд без оптимизаций.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме
ivanTu   Sprite картинка   17.3.2017, 14:57
Cockney   Справку открыть уже совсем лень ? Вики Требуетс...   17.3.2017, 15:05
ivanTu   Справку открыть уже совсем лень ? Вики Требуется...   23.3.2017, 11:39
cirus   // загрузка картинок в память LoadImage LoadImag...   17.3.2017, 15:21
cirus   Проще потратить время и сделать эти изображения от...   23.3.2017, 12:13
ivanTu   Оно и есть отдельно, просто я искал производительн...   23.3.2017, 16:40
DarkMaster   Загрузить все в память в начале скрипта.   23.3.2017, 22:10
cirus   Загрузка картинок происходит 1 раз вначале скрипт...   24.3.2017, 11:30
Cockney   Загрузка картинок происходит 1 раз вначале скрипт...   24.3.2017, 13:08
cirus   Длина строки должна быть кратна 4.   24.3.2017, 15:08
Cockney   Это выравнивание для записи в файл. При работе с п...   24.3.2017, 15:39
ivanTu   Cockney , огромное спасибо за потраченное время, б...   27.3.2017, 10:50
cirus   Получение адресов это не самая большая проблема. Е...   27.3.2017, 11:19
Cockney   Думал проблема в выходе за границы памяти. set %...   27.3.2017, 12:17
DarkMaster   Вообще по идее такая фишка не должно прокатывать ...   27.3.2017, 16:15
Cockney   а зачем тогда гемор с возвратом адреса и размеров ...   27.3.2017, 17:43
WKnight   Скорее последнюю загруженную\сохраненную. Баг...   27.3.2017, 20:55


Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 18.7.2025, 3:55
Designed by Nickostyle