Разработка и ромхакинг > Программирование
[SMD] SGDK
<< < (41/42) > >>
ALKOSHA:
Таки решил рендерить объекты мип-мапами на одном из слоёв, ибо объекты достаточно крупные, и спрайт-генератор вряд ли вывезет... Но блин... врагов и фаерболлы для плавности хотел таки спрайтами, и тут возникают сложности с Z-сортировкой с объектами на плейне.
Походу всё  на плейн придётся переносить. Посмотрим.
А, и ещё... Rescomp анализирует дубли по тайлам, если оные встречаются в разных файлах ресурсов типа IMAGE для компактной упаковки в VRAM ?
У ГПТшки спросил, фиг знает, где он это вычитал или додумал, но слишком хорошо, чтоб быть правдой


Добавлено позже:
п.с. у меня последняя версия. То он за 1.12 воспринял из-за старых каталогов, в которых я обновлял файлы.

Просьба не размещать с помощью тэга img изображение со стороной более 700 пикселей. ghostdog3
Werton:

--- Цитата: ALKOSHA от 13 Сентябрь 2025, 13:26:53 ---Rescomp анализирует дубли по тайлам, если оные встречаются в разных файлах ресурсов типа IMAGE для компактной упаковки в VRAM ?
У ГПТшки спросил, фиг знает, где он это вычитал или додумал, но слишком хорошо, чтоб быть правдой
--- Конец цитаты ---
Нет в rescomp нет никакой крос оптимизации между ресурсами (знаю это, потому ковырял его когда добавлял поддержку перекрестных сылок между ресурсами Object), гптшка как ему и положено нафантазировал :biggrin:

Про аргумент BEST он тоже насвистел, это не для оптимизации тайлов и экономии VRAM, а для сжатия и экономии места в ROM, но его тогда нужно будет для использования расжимать, а во VRAM оно займет столько же места.

Расшарить тайлы можно только через общий Tileset между разными Tilemap, а для Image нельзя, тайлсет уже вшит во внутрь его структуры.

Добавлено позже:
А вообще зря ты тут такие вопросы задаешь, тут спецов по sgdk нет, с такими вопросами лучше напрямую к разрабу на официальный дискорд.
ALKOSHA:

--- Цитата: Werton от 13 Сентябрь 2025, 16:22:47 ---Расшарить тайлы можно только через общий Tileset между разными Tilemap, а для Image нельзя, тайлсет уже вшит во внутрь его структуры.

--- Конец цитаты ---

Получается... для раскадровки мне нужно все кадры анимации с дублирующимися тайлами хранить в едином атласе, а рядом к нему тайлсет прилагать.
Я видел чёто такое в примерах с анимированными тайлами фона соника. Но пока на уровне теории. На практике ещё не догнал, как там это прописать,  чтоб пахало как положено.
Werton:

--- Цитата: ALKOSHA от 13 Сентябрь 2025, 16:37:51 ---Я видел чёто такое в примерах с анимированными тайлами фона соника. Но пока на уровне теории. На практике ещё не догнал, как там это прописать,  чтоб пахало как положено.
--- Конец цитаты ---
Это мой пример, могу пояснить, если есть вопросы.
--- Цитата: ALKOSHA от 13 Сентябрь 2025, 16:37:51 ---Получается... для раскадровки мне нужно все кадры анимации с дублирующимися тайлами хранить в едином атласе, а рядом к нему тайлсет прилагать.
--- Конец цитаты ---
3 раза прочитал и не понял, что ты хотел сказать :biggrin:
ALKOSHA:

--- Цитата: Werton от 13 Сентябрь 2025, 16:44:44 ---3 раза прочитал и не понял, что ты хотел сказать

--- Конец цитаты ---

Ну смари... Есть такая деревянная древняя игра thunder blade.
Приближающиеся здания типа - это кадры анимации, которые я должен в один монолитный png загнать, дабы rescomp у них определил все дубли 8х8 меж разными кадрами.
Каждое здание состоит из тайлов условного тайлсета, например, есть в тайлсете один экземпляр окна, один экземпляр бетона.
Нужно рескомпу указать на этот тайлсет, чтоб он его использовал в VRAM как собственно тайлсет. А кадры анимации в Vram будут как тайл-мап  (2д массив ссылок указателей на окно или бетон из тайлсета)... наверное опять непонятно пояснил...

Добавлено позже:
Вроде рескомп понимает tmx-формат.
Werton:

--- Цитата: ALKOSHA от 13 Сентябрь 2025, 16:52:54 ---наверное опять непонятно пояснил...
--- Конец цитаты ---
да.

Я понял, что ты хочешь сделать анимацию на задниках (что уж там будет рисоваться не столь важно). Анимацию можно сделать путем подмены тайлов в vram, но немного по-костыльному, т.к. встроенной функциональности для анимации тайлов в sgdk нет, а сам ты не знаешь в какую ячейку в vram sgdk засунет конкретный тайл.
Поэтому тайлсет нужно подготовить так, чтобы можно было это предсказать:
- в исходном тайлсете все тайлы подлежащие замене/анимации располагаешь в начале тайлсета
- исходный тайлсет должен быть оптимизирован и не содержать дубли, зеркальные тайлы и пустоту между тайлами
- готовишь тайлсеты под анимацию (1 тайлсет на кадр)
- в тайлсетах под анимацию, тайлы которые будут замещать/анимировать исходные тайлы располагаешь ровно в тех же позиция, что и на исходном тайлсете (если в кадре анимации есть дубли тайлов, то оптимизацию тайлсета можно отключить, иначе позиции съедут), остальные тайлы которые не анимируются туда не суешь
- с помощью исходного тайлсета рисуешь исходную мапу/картинку (Map или TileMap)
- в рантайме подгружаешь в vram нужный тайлсет (следующий по кадру) на позицию исходного тайлсета, затирая/подменяя при этом только тайлы, которые должны быть анимированы

В примере так сделано, возможно есть способ получше.
ALKOSHA:

--- Цитата: Werton от 13 Сентябрь 2025, 17:18:59 ---(1 тайлсет на кадр)
--- Конец цитаты ---

Ну вот если раскадровка будет в атласе, то там 1 тайлсет на все кадры... Тут сложность в том, чтоб выцепить указатель на нужный кадр, чтоб всё не посыпалось.

Добавлено позже:

--- Цитата: Werton от 13 Сентябрь 2025, 17:18:59 ---- в рантайме подгружаешь в vram нужный тайлсет (следующий по кадру) на позицию исходного тайлсета, затирая/подменяя при этом только тайлы, которые должны быть анимированы
--- Конец цитаты ---
А... До меня дошло, что именно непонятного я пишу.
Не. В том и прикол, что в моём случае тайлсет должен кешироваться в VRAM однократно, и висеть там статично.
Нужно маняпулировать исключительно тайл-мапом (массивом ссылок-указателей на тайлсет), процедурно раскидывающим этот тайлсет по экрану.

Добавлено позже:
И вот я думал, что рескомпу можно как-то указать отдельно файл статичного тайлсета, а отдельно файлы для тайл-мапы, которые можно щёлкать туда-сюда.
И я глянул чендж-логи, таки да. Есть поддержка TMX формата. Терь бы обуздать сию фитчу. (опыт работы с ним уже имеется, но на libgdx, sdl, godot).
Werton:

--- Цитата: ALKOSHA от 13 Сентябрь 2025, 20:35:25 ---В том и прикол, что в моём случае тайлсет должен кешироваться в VRAM однократно, и висеть там статично.

--- Конец цитаты ---
В этом не особо много смысла, т.к. если не стримить тайлы анимации на лету из rom, а загружать все тайлы во vram сразу, то она быстро кончится (даже с учётом, что все дубли и зеркальные тайлы удалены, тем более, что в описанном мною способе они тоже удалены). А тебе ещё под спрайты место нужно, если разве, только, у тебя совсем простая анимация на задниках в пару-тройку кадров на несколько тайлов.

--- Цитата: ALKOSHA от 13 Сентябрь 2025, 20:35:25 ---Нужно маняпулировать исключительно тайл-мапом (массивом ссылок-указателей на тайлсет), процедурно раскидывающим этот тайлсет по экрану.

--- Конец цитаты ---
Это будет сделать не просто, т.к. когда sgdk грузит тайлсет (без разницы из изображения или tmx файла), он его оптимизирует (а если отключить оптимизацию, то vram не хватит), и на каких позициях тайлы окажутся в vram ты не знаешь, поэтому манипулировать тайлами в тайлмапе ты не сможешь (точнее сможешь, но на угад). Поэтому тебе всё равно придётся заранее подготовить оптимизированный и отсортированный в нужном порядке тайлсет и для tmx тоже (как и в моем примере), чтобы ты мог гарантировать себе позиции тайлов в vram. Но, опять же я не вижу никакого профита от этого способа анимации, а гемора с ручной работой, как по мне, в нём ещё больше.

--- Цитата: ALKOSHA от 13 Сентябрь 2025, 20:35:25 ---И я глянул чендж-логи, таки да. Есть поддержка TMX формата. Терь бы обуздать сию фитчу
--- Конец цитаты ---
Я там буквально неделю назад в дев версию (master ветка на GitHub) отправил пример загрузки карты из Tiled tmx (смотри sample/basics/tmx-map), может это чуть ускорит твои изыскания.
ALKOSHA:
Очень нравится вид из глаз в Sword of Vermilinon.
Мечта повторить и улучшить. Убрать дискретность, сделать фуллскрин.

https://youtu.be/HNxjS7XwU8o?t=232
ALKOSHA:
А вот чисто на уровне теории можете пояснить, что за сатана происходит в мозгах VDP в игре Lawnmowerman на уровнях вида из глаз?
Как я понимаю, там всë те же мип-мапы пререндером приближаются, но хранятся они в виде покадрового X-скейла, а по Y их растягивает уже H-Blank.(таким же образом скейлится морда в финального босса)... но блин... как же сделана слоëнка в 4 слоя? Чëт в голове не укладывается, как оно так... тоже какой-то прикол со скроллами по H-blank? в VRAM там тока два слоя как будто изображены в моменте... в общем, нипанятна...
На снес-то из коробки есть режим в 4 слоя (сама процедура скейла походу тем же алгоритмом сделана, что и на сеге, ведь MODE7 распространяется лишь на один слой).
По уровням, где действительно юзается MODE7, на сеге используют palette shifting, там тоже всë предельно просто и понятно. Но 4 слоя - магия какая-то.
Werton:
Отечественный кодер под ником BlodTor, написал модуль-расширение link_cable для SGDK, в котором реализовал протокол обмена данными через сеговский линк-кабель.
А так же добавил небольшой пример-игру pac-man с коопертивной геймплеем на двоих через тот же линк-кабель.

Буквально на днях этот пул-реквест был принят, и теперь модуль доступен в дев версии мастер ветки SGDK (но по умолчанию отключен).
Теперь все желающие могут писать свой Zero Tolerance на SGDK :biggrin:
SeregaZ:
надо дополнительную надстройку к эмулятору, чтоб в это можно было в эмуляторах играть. линк кабель конечно вещь хорошая, но нужно кроссплатформенное, как у Битшифтера, чтобы сегу к роутеру подключить. но я так понял что у него оригинальную сегу к роутеру, и на другом конце оригинальная с таким-же проводом. в моем же воспаленном мозгу - это может быть приставка-приставка, эмулятор-эмулятор и самое эпическое приставка-эмулятор.

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

ахахаха! самый эпик будет если на какойнить там SNES сделать такую-же приблуду и заставить играть эти две консоли в одной сети :))) *как фанат мегадрайва осуждаю эту идею
ALKOSHA:
На миг мелькнула мысль жахнуть PETSCII на сежке. Text-mode же нативный.
И тут же врезался тоблом о суровую реальность, вспомнив тот удручающий факт, что у сеги индексированные цвета per-screen, тогда как на C64 (как и на ZX, CPC, MSX, CGA) - атрибут per-tile.
Есть вариант в монохроме, как было в Commodore PET (ну или MDA, если угодно. Чип тот же, charset в ПЗУ прошит другой). Но монохром эт уныло.
Ещë вариант - загнать 256 символов с transparent, и на втором слое задавать квадратики из 16ти цветов PAPER. Но тогда INK нельзя менять. А 16 (INK) x256 вариантов кэшировать — жырновато. Это уже уровень соника 3д бласта, и то, там потоково тайлы кэшировались...
Неужели сежка не такая всесильная, как мне казалось на первый взгляд :-\
Видяху дунди и то проще эмулить полу-аппаратно.
А есть ещë какие варианты реализации данной затеи?
конечно Petscii-art влез бы и в фуллскрин. Но хочется, чтоб и памяти он потреблял как в оригинале, а то теряется смысл такого подхода.
Werton:

--- Цитата: ALKOSHA от 05 Ноябрь 2025, 09:45:01 ---И тут же врезался тоблом о суровую реальность, вспомнив тот удручающий факт, что у сеги индексированные цвета per-screen, тогда как на C64 (как и на ZX, CPC, MSX, CGA) - атрибут per-tile.
--- Конец цитаты ---
Хз, что ты имел в виду под "индексированные цвета per-screen", но на md любому тайлу задника можно задать одну из 4х палитр.
ALKOSHA:

--- Цитата: Werton от 05 Ноябрь 2025, 16:55:45 ---Хз, что ты имел в виду под "индексированные цвета per-screen", но на md любому тайлу задника можно задать одну из 4х палитр.

--- Конец цитаты ---

То и имел в виду. Есть битовая маска индексов 4bpp.
Да, знаю, что можно задавать любой из PAL0-3 на тайл.
Но опять же, если делать transparent фона на 256chars, то получается, что INK у них может менятся лишь в пределах 4ëх цветов, а не 16ти, как у коммодора.
И то, тут слишком много ручной мороки. Для rescomp любые одинаковые изображения будут считаться уникальными, даже если это чëрная буква "Ж" на белом фоне, а рядом она же, но на фоне уже другого цвета.

Добавлено позже:
ещë по прерыванию H-Int можно переключать палитры, но это такой себе костыль. На строку всë равно не может быть больше 4ëх вариантов. И гемор по подготовке ресурсов возрастает по экспоненте.

Добавлено позже:
EGA/VGA видяхи вот идеальные для аппаратной эмуляции PETSCII графона, ибо имеют общие корни. Но поскольку это IBM PC, это будет смотреться не так эффектно, как гипотетическая реализация на сежке...
Sharpnull:

--- Цитата: ALKOSHA от 05 Ноябрь 2025, 09:45:01 ---Ещë вариант - загнать 256 символов с transparent, и на втором слое задавать квадратики из 16ти цветов PAPER. Но тогда INK нельзя менять. А 16 (INK) x256 вариантов кэшировать — жырновато.
--- Конец цитаты ---
Для тайлового шрифта состоящего из текста и фона по одному цвету из палитры (виртуальной) на 16 цветов достаточно 1024 (4 * 256) тайлов и по 4 цвета на каждую из 4 палитр MD. На переднем фоне текст задаётся палитрой MD и тайлом из 4 наборов (4 * 4 = 16 цветов), на заднем фоне однотонный тайл, от пробела можно взять. Для 8 цветов потребуется 512 тайлов (2 * 256) и 2 цвета на каждую палитру MD.
ALKOSHA:

--- Цитата: Sharpnull от 05 Ноябрь 2025, 22:52:09 ---Для тайлового шрифта состоящего из текста и фона по одному цвету из палитры (виртуальной) на 16 цветов достаточно 1024 (4 * 256) тайлов и по 4 цвета на каждую из 4 палитр MD. На переднем фоне текст задаётся палитрой MD и тайлом из 4 наборов (4 * 4 = 16 цветов), на заднем фоне однотонный тайл, от пробела можно взять. Для 8 цветов потребуется 512 тайлов (2 * 256) и 2 цвета на каждую палитру MD.

--- Конец цитаты ---

1024 тайла - весьма прожорливо. Овчинка выделки не стóит. Дешевле готовый petscii арт скормить рескомпу как однородную картинку. Он там своими алгоритмами может даже компактнее ужать (в зависимости от комбинаций).
Sharpnull:

--- Цитата: ALKOSHA от 06 Ноябрь 2025, 01:08:25 ---1024 тайла - весьма прожорливо. Овчинка выделки не стóит
--- Конец цитаты ---
Я не знаю что у вас за овца, что приходится экономить. Если имитировать текстовый режим, то ещё останется VRAM, а в роме занимать будет 2048 байт для 1bpp шрифта + код для преобразования в 4bpp. Для PETSCII изображения на весь экран экономить VRAM нет смысла, а в роме займёт + tilemap. rescomp будет использовать VRAM до 1120 тайлов (320x224) в зависимости от уникальности тайлов (с учётом отражений).
ALKOSHA:

--- Цитата: Sharpnull от 06 Ноябрь 2025, 02:14:07 ---Я не знаю что у вас за овца
--- Конец цитаты ---
Я про то, что при расходе в кило тайлов - теряется рентабельность заморачиваться с нарезкой фонтов, отделением зëрен от плевел. Т.к. в растровом виде готовый арт в png формате рескомп пожмëт своими алгоритмами ± в те же самые объëмы.
ALKOSHA:
такой вопрос назрел.
Можно ли как-то без артефачного мерцалова подсасывать по DMA потоково графон фонов в виде фулл-скрин анимации не прибегая к дабл-буферингу?
Чёт пробую, не успевает оно до VBlank обновиться, и меж кадров виден тайловый мусор. Так или иначе приходится юзать буфер в VRAM
И демка bad apple кажись юзает предварительно кэш.

Добавлено позже:
А да. Ещё одно наблюдение. Если юзать меж кадрами очистку Vram, то мусор пропадает. Но соответственно видно мерцание.
Стало быть, tilemap обновляется быстрее, чем успевает обновиться графика самих тайлов.
Но проблема в моём случае в том, что графика на каждый фрейм уникальна, онли тайл-мапы обновлять - не вариант.

Добавлено позже:
DMA-трансфер данных кажись порядка 20кб за фрейм... эххх... слабенько.

Добавлено позже:
Блииин... Мне бы ещё 3д матешу асилить...  :wacko:
С нейронкой о таком кекать практически бесполезно. Она оч тупит в фиксед-поинт арихметике. Да и в целом низкоуровневый программиздинг для нейронок - непосильная задача. Их удел - питоны/JS'ы, где в одной строчке укладывается вся программа.

А мне всего-то надо реализовать фёрст-пёрсон управление камерой. То бишь, на экране по вводным значениям позиции на X Y карты мира и угла поворота камеры с mip-map скейлом позиционируются аппаратные спрайты (не нужно мучать приставку per-pixel псевдо-графикой).
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии