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

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


****

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



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


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21045
Пользователь №: 16.156



Справку открыть уже совсем лень ?

Вики


Требуется пилот 2.39


П.С. И это еще полностью на луа не перешли....
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 17.3.2017, 15:21
Сообщение #3


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26691
Пользователь №: 16.971
Возраст: 29



Цитата
параллельно вопрос, если я при каждом запуске гружу картинки в память, они перезаписываются, или загружаются в новые участки памяти не очищая предыдущие, тем самым грузя оперативку?

Код
// загрузка картинок в память
LoadImage
LoadImage

:start
   // скрипт
goto start

При остановке скрипта память освобождается.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ivanTu
сообщение 23.3.2017, 11:39
Сообщение #4


****

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



Цитата(Cockney @ 17.3.2017, 16:05) *

Справку открыть уже совсем лень ?

Вики
Требуется пилот 2.39
П.С. И это еще полностью на луа не перешли....


Пользуюсь ей постоянно... вы поняли вопрос?
Вы знаете что такое спрайт изображений?

Вот к примеру картинка содержит в себе множество картинок.
Как ее одну можно использовать в разных ситуациях?

cirus, спасибо подсказал.


Эскизы прикрепленных изображений
Прикрепленное изображение
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 23.3.2017, 12:13
Сообщение #5


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26691
Пользователь №: 16.971
Возраст: 29



Проще потратить время и сделать эти изображения отдельно. Формат картинки изначально должен быть bmp или png.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ivanTu
сообщение 23.3.2017, 16:40
Сообщение #6


****

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



Оно и есть отдельно, просто я искал производительный вариант, ну да ладно не буду заморачиваться ))) Спасибо всем за помощь.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 23.3.2017, 22:10
Сообщение #7


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27679
Пользователь №: 11.279



Цитата
Оно и есть отдельно, просто я искал производительный вариант

Загрузить все в память в начале скрипта.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 24.3.2017, 10:34
Сообщение #8


********

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, но такой скрипт отрабатывает за пару секунд без оптимизаций.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 24.3.2017, 11:30
Сообщение #9


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26691
Пользователь №: 16.971
Возраст: 29



Цитата
Не знаю, сколько времени займет вызов 2600 LoadImage, но такой скрипт отрабатывает за пару секунд без оптимизаций.

Загрузка картинок происходит 1 раз вначале скрипта. Будут они загружаться секунду или 3 разницы нет.
Проще закинуть картинки в 1 папку и загрузить циклом.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 24.3.2017, 13:08
Сообщение #10


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21045
Пользователь №: 16.156



Цитата(cirus @ 24.3.2017, 11:30) *

Загрузка картинок происходит 1 раз вначале скрипта. Будут они загружаться секунду или 3 разницы нет.
Проще закинуть картинки в 1 папку и загрузить циклом.



2600 вызовов LoadImage против одного. Разница думаю есть. Просто проверить лень.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 24.3.2017, 15:08
Сообщение #11


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26691
Пользователь №: 16.971
Возраст: 29



Цитата
//Изображение загружено, теперь нужно вычислить длину строки спрайта в байтах
set #sprite_raw_size #sprite_size_x * 3

Длина строки должна быть кратна 4.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 24.3.2017, 15:39
Сообщение #12


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21045
Пользователь №: 16.156



Это выравнивание для записи в файл. При работе с памятью оно обходится и не используется. Утверждать точно не могу,надо проверять.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
ivanTu
сообщение 27.3.2017, 10:50
Сообщение #13


****

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



Cockney , огромное спасибо за потраченное время, буду тестировать, и еще раз всем спасибо кто откликнулся!
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 27.3.2017, 11:19
Сообщение #14


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26691
Пользователь №: 16.971
Возраст: 29



Получение адресов это не самая большая проблема. Если подсунуть findimage адрес не левого верхнего пикселя, то результатом будет -5, ошибка обработки искомого изображения.
Например, загружаем картинку 4*4 пикселя. Подставляем в findimage адрес второго пикселя, т. е. как будто ищем картинку 3*4.
Код
set %a [1] LoadImage(C:\1.bmp)    // загрузить картинку
set #adres %a [1 1] + 3                 // адрес второго пикселя
init_arr %b (1) #adres 3 4 12          // адрес, ширина, высота, длина строки  
set #a findimage(0 0 1920 1080 (%b [1 1]) %arr)
log #a         // получили -5
end_script

Или я где-то накосячил?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 27.3.2017, 12:17
Сообщение #15


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21045
Пользователь №: 16.156



Думал проблема в выходе за границы памяти.

Код

set %a [1] LoadImage(sprite.bmp)    // загрузить картинку
set #adres %a [1 1] + 3                 // адрес второго пикселя
init_arr %b (1) #adres 3 4 12          // адрес, ширина, высота, длина строки
set $k SaveImage(%b[1 1] lol.bmp)


Просто пересохранит загруженную картинку под другим именем. Как это понимать хз. Возможно, загруженные области как то контролируются пилотом, отсюда и -5 и сохранение файла. Адрес %b может быть любым числом, SaveImage запишет все равно %a. Похоже, что адресами нельзя играть, только данными.

Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 27.3.2017, 16:15
Сообщение #16


***********

Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27679
Пользователь №: 11.279



Цитата
Если подсунуть findimage адрес не левого верхнего пикселя, то результатом будет -5, ошибка обработки искомого изображения.

Вообще по идее такая фишка не должно прокатывать по той причине, что обязательным атрибутом для бмп является его размер, т.к. определить его невозможно по каким-либо косвенным признаком(например, как для строки \0). Битовая маска может содержать в себе любой порядок байт, соответственно пилоту необходимо задание размера. Бмп в памяти выглядит примерно так:
атрибут
атрибут
атрибут
атрибут
размер
количество байт атрибутов(для вычисления адреса начала битовой маски)

атрибут
атрибут
атрибут
битовая маска
Поскольку пилот скорее всего приводит бмп к единообразию либо допускает использование только определенный формата бмп (их много, из-за этого кстати могли быть проблемы возникавшие с другими редакторами.), то количество байт между:
размер
количество байт атрибутов(для вычисления адреса начала битовой маски)

и
битовая маска
скорее всего статично и отсылая в пилот адрес начала битовой маски, он просчитывает смещение и получает размер. Если же мы просто уведем в сторону от первого пикселя адрес, то размер мы уже не получим нормальны и пойдет бред.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 27.3.2017, 17:43
Сообщение #17


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21045
Пользователь №: 16.156



а зачем тогда гемор с возвратом адреса и размеров загруженного бмп, если с ними ничего нельзя сделать ? Зачем эти атрибуты(они нужны только для файла, а не поиска) ? Да и как-то глупо получать адрес (вместо хендла полной структуры файла) и еще высчитывать смещения на поля. Напомню , нам же файл уже не нужен. У нас ищется кусок памяти. Адрес указывает на маску, а не на хедеры файла.

Нужен комментарий кнайта.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
WKnight
сообщение 27.3.2017, 20:55
Сообщение #18


********

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

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

 

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