Список форумов shedevr.org.ru shedevr.org.ru
Группа перевода приставочных игр "ШЕДЕВР"
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Оптимизация графики

 
Начать новую тему   Ответить на тему    Список форумов shedevr.org.ru -> Экстремальный ромхакинг
Предыдущая тема :: Следующая тема  
Автор Сообщение
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Вс Ноя 18, 2007 6:39 pm    Заголовок сообщения: Оптимизация графики Ответить с цитатой

Люди, хелп! Кто работал с жёсткой оптимизацией тайловой графики?
В общем, сабж:
Имеется два изображения: 1920x1088 и 860x544. Нужно укомлектовать их тайлы 16x16 в изображение 512x512, координаты могут быть любыми. Но проблема в том, что чтобы это сделать, нужно жёстко всё оптимизировать, т.е. не просто уложить тайлы по сетке, а учесть схожесть каждого тайла со всеми остальными, и исходя не только из этого, но и ещё из оптимальности каждого варианта укладки, сгенерить тайлсет.
Делал ли кто-нибудь что-нибудь подобное? У меня в голове зарождаются мысли, как это сделать, но, боюсь, алгоритм будет очень тормознутым и не даст нужного эффекта...
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Shiru



Зарегистрирован: 25.10.2006
Сообщения: 295
Откуда: Russia, Moscow

СообщениеДобавлено: Вс Ноя 18, 2007 8:41 pm    Заголовок сообщения: Ответить с цитатой

Не очень понятно, что ты хочешь. Но в общем случае без потерь будет передано только 1024 твоих тайла (512x512) из 8160 требуемых для 1920x1088. Остальные при более-менее разнообразном изображении будут с хорошо заметными ошибками.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Вс Ноя 18, 2007 8:53 pm    Заголовок сообщения: Ответить с цитатой

Shiru писал(а):
Не очень понятно, что ты хочешь. Но в общем случае без потерь будет передано только 1024 твоих тайла (512x512) из 8160 требуемых для 1920x1088. Остальные при более-менее разнообразном изображении будут с хорошо заметными ошибками.

Нет, суть в том, что сжатие без потерь. Исключаются повторяющиеся и нулевые тайлы. Просто разрабы смогли укомплектовать неповторяющиеся тайлы так, что они смогли уместиться на полотне 512x512. Некоторые тайлы, например, взаимосоставляют друг друга. Щас пойду одним алгоритмом, надеюсь, что разрабы шли тем же путём...
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
АнС
RRC2008
RRC2008


Зарегистрирован: 08.11.2003
Сообщения: 2818

СообщениеДобавлено: Вс Ноя 18, 2007 11:12 pm    Заголовок сообщения: Ответить с цитатой

Ты имеешь в виду оптимизацию по принципу карты тайлов + тайлсета? Интересно, случаев с тайлами 16x16 я ещё не встречал, только 8x8 - для таких есть куча утилит типа GIF2SNES и т.п.

Алгоритм тут простой, но далеко не любое изображение можно так оптимизировать - если оригинал влезал в тайлсет 512x512, то изменённый вариант может запросто не влезть, придётся искать варианты упрощения картинок.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Пн Ноя 19, 2007 5:50 pm    Заголовок сообщения: Ответить с цитатой

АнС писал(а):
Ты имеешь в виду оптимизацию по принципу карты тайлов + тайлсета? Интересно, случаев с тайлами 16x16 я ещё не встречал, только 8x8 - для таких есть куча утилит типа GIF2SNES и т.п.

Алгоритм тут простой, но далеко не любое изображение можно так оптимизировать - если оригинал влезал в тайлсет 512x512, то изменённый вариант может запросто не влезть, придётся искать варианты упрощения картинок.

Ну блин наверное если бы он был простой, я не создавал бы эту тему.
Там не просто тайлсет, там тайлы в тайлсете не по сетке 16x16 расположены, а самым оптимальным способом.
В прочем, почти реализовал...
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Shiru



Зарегистрирован: 25.10.2006
Сообщения: 295
Откуда: Russia, Moscow

СообщениеДобавлено: Пн Ноя 19, 2007 5:57 pm    Заголовок сообщения: Ответить с цитатой

Я себе плохо представляю, как можно расположить тайлы единого фиксированного размера не по сетке. Ты-бы хоть пример показал.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Пн Ноя 19, 2007 8:48 pm    Заголовок сообщения: Ответить с цитатой


Почти написал свой пакер...
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
BoreS



Зарегистрирован: 03.04.2004
Сообщения: 347
Откуда: KarmaSociety

СообщениеДобавлено: Пн Ноя 19, 2007 10:23 pm    Заголовок сообщения: Ответить с цитатой

а можешь теперь в нормальном виде эту картинку показать?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Пн Ноя 19, 2007 10:32 pm    Заголовок сообщения: Ответить с цитатой

BoreS писал(а):
а можешь теперь в нормальном виде эту картинку показать?

http://consolgames.narod.ru/files/sh1/mp_hospd_Layers.7z

Написал оптимизатор, но пока немного кривовато работает... Отлавливаю баги Smile
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Пн Ноя 19, 2007 11:36 pm    Заголовок сообщения: Ответить с цитатой

Аллилуйя, написал Smile Ошибка была наитупейшая, написал два раза n вместо n и m Sad
Пошёл другим путём, нежели разрабы, но результаты недалеки вроде Smile
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Вт Ноя 20, 2007 1:32 am    Заголовок сообщения: Ответить с цитатой

Блин, алгоритм не такой эффективный, как хотелось бы Sad
Попробую расширить файл, авось получится...
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
АнС
RRC2008
RRC2008


Зарегистрирован: 08.11.2003
Сообщения: 2818

СообщениеДобавлено: Вт Ноя 20, 2007 9:23 am    Заголовок сообщения: Ответить с цитатой

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

Выложил бы ты алгоритм вместе с ресурсами. Smile
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Shiru



Зарегистрирован: 25.10.2006
Сообщения: 295
Откуда: Russia, Moscow

СообщениеДобавлено: Вт Ноя 20, 2007 9:59 am    Заголовок сообщения: Ответить с цитатой

Думается, это извращение было нужно для экономии видеопамяти, а не места на носителе.

Напомнило мне оптимизацию лайтмапов в 3D графике. М.б., стоит посмотреть на эту тему, алгоритмы должны быть похожи.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Вт Ноя 20, 2007 4:25 pm    Заголовок сообщения: Ответить с цитатой

АнС писал(а):
Оригинально придумано. Shocked Не проще было запаковать тайлсет, раз уж у тайлов так много общего, что они могут частично накладываться друг на друга...

Так это потом в добавок ещё и зипуется :)

АнС писал(а):
Выложил бы ты алгоритм вместе с ресурсами. Smile

Ок. Исходники имеешь ввиду?

В общем алгоритм работает, но у меня есть парочка идей, как его улучшить. Вот принцип:
Для начала я сконвертнул полотна в массив байт, чтобы было легче работать. И создал матрицу-маску (boolean), в которой содержалась информация о используемых пикселях тайлсета.
Затем по очереди брал каждый тайл полотен, и на каждой координате тайлсета высчитывал количество совпадающих пикселей взятого блока с блоком тайлсета по тем координатам. Т.е. если пиксель Тайлсет[x,y] занят, и он равен пикслю Полотно[px,py], то увеличиваем количество одинаковых пикселей, а если нет - то всё прерываем, т.к. этот блок явно не подходит.
Если у какого-либо блока получилось 256 совпадений (полное совпадение тайла) - то тоже прерываем и делаем необходимые операции.
В общем, в итоге мы найдём тайл в тайлсете, максимально схожий со взятым тайлом. Туда мы и поместим наш взятый тайл, заюзав все неиспользуемые в нём пиксели.
И так до окончания цикла. Надеюсь, всё понятно :)

Shiru писал(а):
Думается, это извращение было нужно для экономии видеопамяти, а не места на носителе.

Да, так и есть, ибо держать всю картинку в памяти - не хватит ресурсов.
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Axel
Советник


Зарегистрирован: 14.11.2003
Сообщения: 680

СообщениеДобавлено: Вт Ноя 20, 2007 4:35 pm    Заголовок сообщения: Re: Оптимизация графики Ответить с цитатой

HoRRoR писал(а):
Люди, хелп!Нужно укомлектовать их тайлы 16x16 в изображение 512x512, координаты могут быть любыми...

...погугли на тему утилиты gfx2gba (по идее она должна быть в комплекте с devkit arm или palib) она тебе и tileset(.bin) сделает и .map
_________________
Всех их вместе переведём!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Вт Ноя 20, 2007 7:10 pm    Заголовок сообщения: Re: Оптимизация графики Ответить с цитатой

Axel писал(а):
HoRRoR писал(а):
Люди, хелп!Нужно укомлектовать их тайлы 16x16 в изображение 512x512, координаты могут быть любыми...

...погугли на тему утилиты gfx2gba (по идее она должна быть в комплекте с devkit arm или palib) она тебе и tileset(.bin) сделает и .map

Нет, ты похоже не понял, в чём проблема Smile Это то я и сам без труда сделаю. Проблема именно в оптимизации... Но большинство карт моим алгоритмом вмещаются, осталось его доработать...
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
АнС
RRC2008
RRC2008


Зарегистрирован: 08.11.2003
Сообщения: 2818

СообщениеДобавлено: Вт Ноя 20, 2007 8:19 pm    Заголовок сообщения: Ответить с цитатой

HoRRoR писал(а):
АнС писал(а):
Оригинально придумано. Shocked Не проще было запаковать тайлсет, раз уж у тайлов так много общего, что они могут частично накладываться друг на друга...

Так это потом в добавок ещё и зипуется Smile


Ну, зипуется после этого оно не так хорошо, как при неоптимизированном тайлсете. Smile Фактически, эта оптимизация похожа на LZ-алгоритм с использованием ранее распакованного словаря.


HoRRoR писал(а):
Для начала я сконвертнул полотна в массив байт, чтобы было легче работать. И создал матрицу-маску (boolean), в которой содержалась информация о используемых пикселях тайлсета.
Затем по очереди брал каждый тайл полотен, и на каждой координате тайлсета высчитывал количество совпадающих пикселей взятого блока с блоком тайлсета по тем координатам. Т.е. если пиксель Тайлсет[x,y] занят, и он равен пикслю Полотно[px,py], то увеличиваем количество одинаковых пикселей, а если нет - то всё прерываем, т.к. этот блок явно не подходит.
Если у какого-либо блока получилось 256 совпадений (полное совпадение тайла) - то тоже прерываем и делаем необходимые операции.
В общем, в итоге мы найдём тайл в тайлсете, максимально схожий со взятым тайлом. Туда мы и поместим наш взятый тайл, заюзав все неиспользуемые в нём пиксели.
И так до окончания цикла. Надеюсь, всё понятно Smile


Смотри, а ты не думал, что, скажем, поместив тайл2 максимально идеально к первому (скажем, совпадают 10 пикселей), ты тем самым ограничиваешь возможности для некоторых других тайлов? Например, какой-нибудь двадцатый тайл мог совпасть с первым не на 10, а на 50 точек - но теперь из-за тайла2 уже не получится наложить двадцатый рядом с первым, в итоге ты потерял возможность лучше оптимизировать тайлсет.

Эта идея напрямую взята из flexible parsing алгоритма LZ77. Суть в том, чтобы при переборе значений не тупо брать максимальное значение, а пробовать все, даже не самые идеальный комбинации, делая вывод только в самом конце.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Вт Ноя 20, 2007 8:57 pm    Заголовок сообщения: Ответить с цитатой

АнС писал(а):
Смотри, а ты не думал, что, скажем, поместив тайл2 максимально идеально к первому (скажем, совпадают 10 пикселей), ты тем самым ограничиваешь возможности для некоторых других тайлов? Например, какой-нибудь двадцатый тайл мог совпасть с первым не на 10, а на 50 точек - но теперь из-за тайла2 уже не получится наложить двадцатый рядом с первым, в итоге ты потерял возможность лучше оптимизировать тайлсет.

Да думал, но такой анализ ещё труднее организовать, тем более, что у меня и так карта от 30 секунд пакуется...
Хочу добавить равномерное распределение на две стороны, чтобы не было такого, что сперва заполнялось всё вправо, а потом вниз, и добавить проверку на совпадение целостных линий тайлов, тогда для остальных будет оставаться больше места...
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Axel
Советник


Зарегистрирован: 14.11.2003
Сообщения: 680

СообщениеДобавлено: Ср Ноя 21, 2007 12:04 am    Заголовок сообщения: Re: Оптимизация графики Ответить с цитатой

HoRRoR писал(а):
Это то я и сам без труда сделаю.

надеюсь, что ты написал это ПОСЛЕ того, как прочитал ЧТО умеет gfx2gba Wink

...твой алгоритм учитывает, что тайлы имеют спец атрибутик (такое есть, думаю, не только на GBA) и могут быть повернуты задом наперёд и вверх ногами (tile flipping) ?

надеюсь, и про оптимизацию палитр, ты тоже прочитал...
(не знаю насколько это актуально для твоего случая, но понижение цветности "жмет" изображение в разы, а при должном подходе, качество не значительно страдает)


кстати, АнС прав, тебе проще рассматривать эту оптимизацию тайлов как "сжатие"...
нарежь всю картинку на тайлы, посчитай частоту встречаемости каждого уникального тайла в картинке (как MDE Wink ), потом среди самых НЕ распространенных (снизу-вверх) ищи более или менее похожие и "схлопывай" их в один... как только число уникальных тайлов станет приемлемым, заканчивай свою оптимизацию...
_________________
Всех их вместе переведём!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Ср Ноя 21, 2007 12:46 am    Заголовок сообщения: Re: Оптимизация графики Ответить с цитатой

Axel писал(а):

надеюсь, что ты написал это ПОСЛЕ того, как прочитал ЧТО умеет gfx2gba Wink

Уверен, что она не может того, что мне нужно :)

Axel писал(а):
...твой алгоритм учитывает, что тайлы имеют спец атрибутик (такое есть, думаю, не только на GBA) и могут быть повернуты задом наперёд и вверх ногами (tile flipping) ?

Формат не поддерживает ;)

Axel писал(а):
надеюсь, и про оптимизацию палитр, ты тоже прочитал...
(не знаю насколько это актуально для твоего случая, но понижение цветности "жмет" изображение в разы, а при должном подходе, качество не значительно страдает)

Цвета там оптимальные и распределены с палитрами так, что индексы палитр обоих слоёв хорошо друг с другом уживаются... Хотя, мб стоит попробовать ещё немного обеднить цветность карты...

Axel писал(а):
кстати, АнС прав, тебе проще рассматривать эту оптимизацию тайлов как "сжатие"...
нарежь всю картинку на тайлы, посчитай частоту встречаемости каждого уникального тайла в картинке (как MDE Wink ), потом среди самых НЕ распространенных (снизу-вверх) ищи более или менее похожие и "схлопывай" их в один... как только число уникальных тайлов станет приемлемым, заканчивай свою оптимизацию...

Ну хз, мой алгоритм тоже неплохо справляется, но результат немного хуже оригинала... Надо действительно попробовать пойти именно этим путём...
Есть одна карта, "рукописная", там практически нет одинаковых тайлов. Мой алгоритм оставляет невпихнутыми 35 тайлов, хотя в оригинале впихнуты все, хоть тайлсет и заполнен по максимуму...
Пробовал делать равномерное "растекание" тайлсета от левого верхнего угла - только ухудшило результат на 5 тайлов...
Хоть бери и пиши инструмент для анализа оригинального алгоритма Smile
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
HoRRoR
RRC2008
RRC2008


Зарегистрирован: 21.06.2006
Сообщения: 2341
Откуда: Ростов-на-Дону

СообщениеДобавлено: Ср Ноя 21, 2007 9:19 am    Заголовок сообщения: Ответить с цитатой

Блин, меня осенило! В голове зародился хороший алгоритм Smile Должен хорошо ужать...
_________________
Работаю за деньги
KILL ALL HUMANS!!!!!111
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов shedevr.org.ru -> Экстремальный ромхакинг Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group