Автор Тема: SGDK  (Прочитано 74341 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн rep-stosw

  • Пользователь
  • Сообщений: 110
  • Пол: Мужской
  • Аппаратчик
    • Youtube
    • Просмотр профиля
SGDK
« Ответ #750 : 25 Декабрь 2021, 11:59:38 »
Тут может быть проблема что это сделано только для семплов, а для остальных данных трека (fm,psg) это не делается и/или не учитывается когда можно обращаться к рому.

Одновременно ещё играет VGM, в котором FM(1..5), PSG(3 sq + 1 noise) и DAC(FM6 CH1)

Оффлайн rep-stosw

  • Пользователь
  • Сообщений: 110
  • Пол: Мужской
  • Аппаратчик
    • Youtube
    • Просмотр профиля
SGDK
« Ответ #751 : 30 Декабрь 2021, 02:23:03 »
Знающие, подскажите плиз название эмулятора ниже на рисунке.   Интересует отладка:



P.S. Это же не Gens KMod, верно?

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3240
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
SGDK
« Ответ #752 : 04 Январь 2022, 13:43:53 »
Знающие, подскажите плиз название эмулятора ниже на рисунке.   Интересует отладка:

(Ссылка на вложение)

P.S. Это же не Gens KMod, верно?
похоже на Exodus

Оффлайн rep-stosw

  • Пользователь
  • Сообщений: 110
  • Пол: Мужской
  • Аппаратчик
    • Youtube
    • Просмотр профиля
SGDK
« Ответ #753 : 05 Январь 2022, 04:23:13 »
похоже на Exodus

Да, это он.
Правда, воспользоваться им не удалось. Еле идёт на 1 FPS. Потом намертво зависает.
Остаюсь на Gens/Fusion.
Gens тоже подёргивается.

Оффлайн rep-stosw

  • Пользователь
  • Сообщений: 110
  • Пол: Мужской
  • Аппаратчик
    • Youtube
    • Просмотр профиля
SGDK
« Ответ #754 : 14 Январь 2022, 04:28:37 »
Ранее я писал здесь, что удалось сделать зацикливание треков VGM на начало для бесконечного воспроизведения их по кругу на SGDK.

Теперь появилась новая проблема:  делаю в VGMMaker'е трек, который скругляется с конца в середину.

На самом VGMMaker'е трек играет как положено, а на SGDK закругление в середину работает неправильно - на слух трек сбивается.

Смотрел значение двойного слова(4 байта) в VGM по адресу 0xC: там записано какое-то ненулевое значение. Тоесть по идее, скругление на середину трека есть.

В чём может быть проблема? Как поправить?

Хочу сделать, чтобы скругление VGM трека было с конца в середину.

Оффлайн rep-stosw

  • Пользователь
  • Сообщений: 110
  • Пол: Мужской
  • Аппаратчик
    • Youtube
    • Просмотр профиля
SGDK
« Ответ #755 : 15 Январь 2022, 09:16:56 »
В чём может быть проблема? Как поправить?

Проблема оказалась в кривизне реализации воспроизведения VGM в XGM-движке SGDK.

Во-1: нельзя делать скругление на паттерн, активно использующий семплы DAC. При закруглении на такой паттерн, на слух явно слышно протормаживание, рвущее зацикливание трека.   Решение: немного переделать трек - в хвост дописать все паттерны, не включая того, где семплов DAC уже нету, а зацикливание поставить  на этот самый паттерн без DAC.

Во-2: SGDK корректно работает с VGM, у которых указано либо 50 либо 60 Гц.   Если поставить 48 Гц, то из-за кривизны расчёта таймингов со временем накопится ошибка, и с 3-го ,  4-го и последующих разов  зацикливание будет не на то что нужно, трек будет "спотыкаться".

В общем, котЭ  недоволен!



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

Так как основная масса треков используют дефолтные значения громкости инструментов, то пришлось распарсить весь трек и подправить все инструменты в нём.
TL выходным операторам FM,  затухание огибающим PSG и уровень громкости всех DAC семплов.
Но в целом получил, что я хотел!

Правда мне непонятно, в чём товарищ  Делек измеряет громкость семплов на ползунках(-100 тишина,  0 -единичное усиление,  +100 субъективно в 1,5-2 раза громче).  Наверное, в попугаях!  :lol:

И ещё в алгоритме 4 операторы 2 и 3 поменяны местами, для написания музыки - это пофигу, но когда пишешь парсер или конвертер - это архи-важно.  Написал  об этом Делеку в дискорд, пока тишина.  :?

Оффлайн rep-stosw

  • Пользователь
  • Сообщений: 110
  • Пол: Мужской
  • Аппаратчик
    • Youtube
    • Просмотр профиля
SGDK
« Ответ #756 : 26 Январь 2022, 10:53:46 »
Словил пару интересных моментов, связанных с оптимизацией кода по M68000.

1. Этот процессор не любит операций деления и остатков от деления.

Этот код призван колыхать плоскость тайлов - на эмуляторе идёт без промедлений, на реальной приставке в 3 раза меньше FPS:
for(int i=0;i<224;i++)val[i]=Sinus[((128*(t+i))/224)&127]/3;
Просчитал всё заранее, заменил на:
for(u32 i=0;i<224;i++)val[i]=LUT2[MOD(t+i,224)];

static inline u32 MOD(u32 x,u32 y)
{
 Check:
 if(x>=y)
 {
  x-=y;
  goto Check;
 }
 return x;
}

Результат - программа отлично работает с целевым FPS =60.

2. Локальные массивы лучше выносить за цикл.  Было так (из-за этого FPS просаживался в 2 раза при определённых условиях):
while(...)
{
 ...
  s16 val[28];
 for(int i=0;i<28;i++)val[i]=-((72-Sinus[(i*65)/28])*t)/12; //>>4;
 VDP_setHorizontalScrollTile(BG_B,0,val,28,DMA_QUEUE);
 ...
}

Стало:
s16 val[28];
while(...)
{
 ...
 for(int i=0;i<28;i++)val[i]=(LUT4[i]*t)>>4;
 ...
}

Результат: программа стала идти с целевым FPS=60.

Так что Genesis does! .  А если у вас НЕ does,  то кто-то говнокодер!  :lol:

Сегуля  вывезет любые ваши амбиции, если код и алгоритм будут правильными!  :P

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9375
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
SGDK
« Ответ #757 : 26 Январь 2022, 11:02:28 »
1. Этот процессор не любит операций деления и остатков от деления.
o_0 никогда такого не было, и вот опять оказалось что деление это крайне дорогая операция! (и не только на м68к) :lol:

Оффлайн rep-stosw

  • Пользователь
  • Сообщений: 110
  • Пол: Мужской
  • Аппаратчик
    • Youtube
    • Просмотр профиля
SGDK
« Ответ #758 : 26 Январь 2022, 15:26:16 »
o_0 никогда такого не было, и вот опять оказалось что деление это крайне дорогая операция! (и не только на м68к) :lol:

А чего-й не так? :blush:

Смотрю на число тактов и вижу, что деление и умножение самые затратные : http://oldwww.nvg.ntnu.no/amiga/MC680x0_Sections/timstandard.HTML

Цитата
DIVS          -         -      158(1/0) +*      -
DIVU          -         -      140(1/0) +*      -
MULS          -         -       70(1/0) +*      -
MULU          -         -       70(1/0) +*      -

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9375
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
SGDK
« Ответ #759 : 26 Январь 2022, 17:34:24 »
А чего-й не так?
они везде затратные, тем более в процессорах тех лет

Оффлайн SPOT

  • Пользователь
  • Сообщений: 574
    • Просмотр профиля
SGDK
« Ответ #760 : 30 Январь 2022, 11:57:35 »
Кто подскажет как используя
Map * MAP_create (const MapDefinition *mapDef, VDPPlane plane, u16 baseTile)Назначать приоритет слоя отдельным тайлам на картинке?

Оффлайн DON

  • Пользователь
  • Сообщений: 3
  • Делаем игры для Sega Genesis и не толбко^
    • Facebook
    • Twitter
    • Youtube
    • Просмотр профиля
SGDK
« Ответ #761 : 31 Январь 2022, 09:19:11 »
в доке компилятора ресурсов сказано, что можно использовать
https://github.com/Stephane-D/SGDK/blob/master/bin/rescomp.txt

Цитата
Tips:
You can use the extra bits of 8 bit indexed image to specify extra information in the tilemap data but then you have to ensure
that all pixel from a same tile (block of 8x8 pixels) use the same value otherwise rescomp will generate an error.
    bit 4-5: palette index (0-3) so it allows to use the 4 available palettes to draw your MAP.
    bit 6: should be 0 (not used)
    bit 7: priority information (0=LOW 1=HIGH)

Ясно? Если что гуглопереведи
UPD: Очень кропотливая работа, если использовать те редакторы, которые использует 95% юзеров.
То есть создав свою палитру с этими битам-шмитами, сможешь сделать тайлы всех вариантов (только они будут выглядеть странно на ПК из-за служебных битов в палитре.)
Поэтому народ пишет свои редакторы тайловых карт, что не сложно.
« Последнее редактирование: 31 Январь 2022, 09:37:41 от DON »

Оффлайн SPOT

  • Пользователь
  • Сообщений: 574
    • Просмотр профиля
SGDK
« Ответ #762 : 31 Январь 2022, 09:33:50 »
Это я всё видел, мне неясно как на исходной картинке менять приоритет тайла.
bit 7: priority information (0=LOW 1=HIGH)Вот каким инструментом и как это можно сделать? Учитывая, что исходным изображением является картинка уровня.

Оффлайн DON

  • Пользователь
  • Сообщений: 3
  • Делаем игры для Sega Genesis и не толбко^
    • Facebook
    • Twitter
    • Youtube
    • Просмотр профиля
SGDK
« Ответ #763 : 31 Январь 2022, 09:42:26 »
я там отредактировал.
Ну не важно совершенно каким инструментом.
у тебя есть палитра 16 цветов, например.
оставляешь ее
добавляешь на нужных местах в палитре новые цвета с учетом использования этих служебных битов.
И рисуешь изображение "новыми цветами" для тех тайлов, где этот приоритет == 1.

Рисовать можно любым редактором Photoshop, Gimp, Aseprite, GALE, MOTION ND и т.п.
лишь бы палитра была indexed. И что важно, в каждом тайле 8х8 на рисунке
цвета должны иметь одни и те же служебные биты. Чтобы ресурс компилер смог правильно тайлу выбрать номер палитры и  приоритет.

Мне скоро это понадобится самому. Я буду использовать Aseprite, скорее всего. + в 1.3 версии встроят TileEditor/ надеюсь, он тоже подойдет.

Судя по скриншотам в интернете, разрабюотчики все используют свои самонаписанные редакторы для таких целей.

УПД: А вообще на этот вопрос ответили 2 страницы назад. Там варианты решений с картинками ) + автор написал себе утилитку, которая все делает .
https://www.emu-land.net/forum/index.php/topic,70308.720.html
Нам такое не подходит.
И да, палитру можно держать в спецальном отдельном файле, если что.
« Последнее редактирование: 31 Январь 2022, 12:51:38 от DON »

Оффлайн rep-stosw

  • Пользователь
  • Сообщений: 110
  • Пол: Мужской
  • Аппаратчик
    • Youtube
    • Просмотр профиля
SGDK
« Ответ #764 : 31 Январь 2022, 13:22:23 »
Вот каким инструментом и как это можно сделать? Учитывая, что исходным изображением является картинка уровня.

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

Ниже скрин: T-образная платформа имеет приоритет ниже, чем спрайты.  Остальные платформы  -приоритет выше, чем у спрайта.


Оффлайн ALKOSHA

  • Пользователь
  • Сообщений: 805
  • Люблю донди.
    • ВКонтакте
    • Просмотр профиля
SGDK
« Ответ #765 : 06 Февраль 2022, 18:48:37 »
Вынес ф-цию в отдельный модуль.
В хэдере
#ifndef BACKGND_H_INCLUDED
#define BACKGND_H_INCLUDED
void update_box();
public void init_back();
public void update_back();
#endif // BACKGND_H_INCLUDED

В Си-файле backgnd.c

#include <genesis.h>
#include "globalvar.h"
#include "gfx.h"
#include "sprite.h"
public void init_back()
{
..
}
и тд.

В каких случаях может выбивать такой эррор?

Цитата
src\backgnd.c|14|error: expected '=', ',', ';', 'asm' or '__attribute__' before 'void'|



Добавлено позже:
убрал "public", собралося. Странно. Ладно...
« Последнее редактирование: 06 Февраль 2022, 19:53:49 от ALKOSHA »

Оффлайн rep-stosw

  • Пользователь
  • Сообщений: 110
  • Пол: Мужской
  • Аппаратчик
    • Youtube
    • Просмотр профиля
SGDK
« Ответ #766 : 08 Февраль 2022, 03:10:38 »
убрал "public", собралося. Странно. Ладно...

В Си-шных хедерах слово public никогда не ставится. Это лишнее и приведёт к синтаксической ошибке.

Добавлю: к переменным в хедере ставится слово extern.

Оффлайн Werton

  • Пользователь
  • Сообщений: 878
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
SGDK
« Ответ #767 : 08 Февраль 2022, 11:50:39 »
В Си-файле backgnd.c

Код: [Выделить]
#include <genesis.h>
#include "globalvar.h"
#include "gfx.h"
#include "sprite.h"
public void init_back()
{
..
}
и тд.
Еще #include "backgnd.h" забыл, ошибка конечно не из-за этого была, но всё же.

Оффлайн rep-stosw

  • Пользователь
  • Сообщений: 110
  • Пол: Мужской
  • Аппаратчик
    • Youtube
    • Просмотр профиля
SGDK
« Ответ #768 : 17 Февраль 2022, 02:02:21 »
Вышел новый релиз SGDK v. 1.7 : https://github.com/Stephane-D/SGDK/releases/tag/v1.70

Кто-нибудь пробовал перенести свои существующие проекты на эту версию SDK ?
У меня почему-то в игре в какой-то момент пропадают спрайты, карта уровня перестаёт прокручиваться, и всё повисает (кроме музыки) с этой версией SDK.

Пока принял решение остаться на предыдущей версии (в которой собственно начинал делать свой проект) v. 1.65 , в которой проект идёт стабильно.

Сделал "гибрид": компилятор ресурсов и папку bin взял с нового SDK. Сами библиотеки оставил от 1.65.

P.S. В плане воспроизведения звуков  - в новой версии XGM-движка всё также уныло, приходится передефайнить:

#define HALT_Z80_ON_DMA     0 /*1*/
#define HALT_Z80_ON_IO      0 /*1*/

иначе звуки идут с хрипотцой, если есть одновременно манипуляции со спрайтами/скроллами плоскостей.  Либо отказываться от  DMA.
« Последнее редактирование: 17 Февраль 2022, 02:11:21 от rep-stosw »

Оффлайн Werton

  • Пользователь
  • Сообщений: 878
  • Пол: Мужской
    • Youtube
    • Просмотр профиля
SGDK
« Ответ #769 : 17 Февраль 2022, 06:12:04 »
Кто-нибудь пробовал перенести свои существующие проекты на эту версию SDK ?
Сейчас попробовал, вроде норм работает.
У меня почему-то в игре в какой-то момент пропадают спрайты, карта уровня перестаёт прокручиваться, и всё повисает (кроме музыки) с этой версией SDK.
Ну как ты сам говорил :lol:
А если у вас НЕ does,  то кто-то говнокодер!  :lol:
Проверяй код, где то накосячил, возможно превысил лимиты ram или еще что.
Посмотрел, у себя, после всех инициализаций в моем проекте на sgdk1.70 доступной ram примерно на 1 KB меньше чем в 1.65, т.е. фреймворк стал прожорливее, возможно этого килобайта тебе и не хватает.

Оффлайн ALKOSHA

  • Пользователь
  • Сообщений: 805
  • Люблю донди.
    • ВКонтакте
    • Просмотр профиля
SGDK
« Ответ #770 : 12 Март 2022, 22:05:49 »
А вы пре-лоадед спрайтс юзаете ? Или на лету вытягиваете из ROM'а?
Пытался вникнуть через примеры, чёто сложновато.

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

Оффлайн rep-stosw

  • Пользователь
  • Сообщений: 110
  • Пол: Мужской
  • Аппаратчик
    • Youtube
    • Просмотр профиля
SGDK
« Ответ #771 : 13 Март 2022, 02:37:15 »
А вы пре-лоадед спрайтс юзаете ? Или на лету вытягиваете из ROM'а?
Пытался вникнуть через примеры, чёто сложновато.

Я юзал. В примере с Соником. Всё предельно ясно.  :D

Оффлайн SERGK393

  • Пользователь
  • Сообщений: 3
    • Просмотр профиля
SGDK
« Ответ #772 : 02 Апрель 2022, 02:32:02 »
Всем привет!
Я совсем недавно в этой теме, но хотелось бы узнать, можно ли пропустить оригинальные звуки Соника (файлы bin) через SGDK?
Вроде они в формате SMPS, но в данном SDK в списке драйверов нет SMPS. Ситуация такая: начал с примера Соника, там есть звук прыжка, переведенный с WAV, но на XGM звучит он очень коряво. Запускал с PCM драйвера - звучит лучше, но он музыку глушит. Файлы smps (бинарники из дизасма соника) не получилось прочитать. Вписывал как BIN, но в итоге шипит, притом неважно, какой файл будет вписан. Пробовал даже перевести из SMPS в MID, а MID в VGM (прямого переводчика не нашел) - mid не формируется нормальный. Пробовал перевести из WAV в MID - более-менее, но в VGM, оказывается, тоже не получилось (находил программы от двух разных разработчиков). Скажите, пожалуйста, возможно ли запустить в игре качественный звук прыжка, или любой другой (скольжение тоже плохо звучит)? Я все еще не изучил как следует, поэтому пока только тыкаюсь как в черный ящик.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2510
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
SGDK
« Ответ #773 : 02 Апрель 2022, 16:11:27 »
можно ли пропустить оригинальные звуки Соника (файлы bin) через SGDK?
неа. нельзя. хотя я точно не знаю... если звук прыжка записан сэмплом в игре Соника - тогда можно. но я подозреваю что он записан FM звуком. спецэффекты - те-же прыжки, или стрельба - в SGDK, точнее его аудиодрайвер XGM - не умеет проигрывать если они FM или PSG. то есть все спецэффекты могут быть только сэмплами. следовательно надо записать оригинальный прыг Соника в вавку, после конвертануть в моно 14khz PCM и только потом загружать. ясное дело качество будет похуже, чем оригинальный FM или PSG звук.

по поводу перевода из SMPS в MID и прочих, перечисленных извращений - это конечно тот еще анекдот :) в данном случае будут переводится ноты, но не сэмплы и не инструменты. поэтому смысла от этого никакого нет. и поэтому происходит шипение - потому что формат совсем другой.

Оффлайн SERGK393

  • Пользователь
  • Сообщений: 3
    • Просмотр профиля
SGDK
« Ответ #774 : 13 Апрель 2022, 10:18:22 »
Начинаю потихоньку делать эксперименты с Соником в примере, нашел такой затык, после которого думаю, стоит ли дальше делать соника на Си или уж проще освоить хакинг.

Скорость анимации здесь одинаковое для одного спрайта, в итоге нет разницы, когда Соник идет медленно, а когда быстро (до бега). Решил добавить анимацию из повторяющихся кадров (в итоге не 6, а 12 кадров), сделал на скорую руку в GIMPе, с расположением были огрехи (что, возможно, одинаковые кадры в анимации могли быть технически разными). В итоге анимация действительно теперь разная по скорости (как бы), но игра в целом стала идти не так плавно, как раньше. Вернул старый спрайт - плавность вернулась.

Поэтому вопросы - 12 кадров в анимации - это для всей сеги в целом много? И влияет на работу так же, как здесь?
Можно ли использовать анимацию своим способом, через асм, или проще сделать нормальный файл спрайта из повторяющихся кадров и будет работать хорошо?
Так как видел, что асм код можно вставлять в Си, то реально ли подключиться к анимации и написать свою функцию в итоге?

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3240
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
SGDK
« Ответ #775 : 21 Май 2022, 18:00:54 »
SERGK393, я решил эту проблему отключением анимации и написанием своего таймера.
таймер срабатывает и меняет кадр анимации. все

Оффлайн DON

  • Пользователь
  • Сообщений: 3
  • Делаем игры для Sega Genesis и не толбко^
    • Facebook
    • Twitter
    • Youtube
    • Просмотр профиля
SGDK
« Ответ #776 : 28 Май 2022, 22:51:01 »
а зачем свой таймер отдельно?
Если у каждого спрайта есть callback на смену кадра анимации.

или ты про него и написал? типа кодить ничего не надо - просто там берешь и ставишь нужную величину

Оффлайн ALKOSHA

  • Пользователь
  • Сообщений: 805
  • Люблю донди.
    • ВКонтакте
    • Просмотр профиля
SGDK
« Ответ #777 : 18 Июль 2022, 14:16:08 »
Чего-то не понимаю, как задать начальный адрес графики под спрайт
По-умолчанию он получается 6F80
Пытаюсь втулить SPR_setVRAMTileIndex, ничё не меняется.
   u16 ind = BMP_FB1ENDTILEINDEX    ; //TILE_USERINDEX;


VDP_setPalette(PAL0, cabin.palette->data);
VDP_drawImageEx(BG_A, &cabin, TILE_ATTR_FULL(PAL0, FALSE, FALSE, FALSE, ind),0, 0, FALSE, TRUE);
ind += cabin.tileset->numTile;

SPR_setVRAMTileIndex(&earth,ind );
SPR_init();
VDP_setPalette(PAL2, earth.palette->data);
sprites[0] = SPR_addSprite( &earth ,160, 5, TILE_ATTR(PAL2, FALSE, FALSE, FALSE));
SPR_update();
SYS_doVBlankProcess();

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5005
    • Просмотр профиля
SGDK
« Ответ #778 : 18 Июль 2022, 14:34:28 »
ALKOSHA, оно вообще не должно компилироваться, вы передаёте earth в bool SPR_setVRAMTileIndex(Sprite* sprite, s16 value) и Sprite* SPR_addSprite(const SpriteDefinition* spriteDef, s16 x, s16 y, u16 attribut), где разный тип 1-го параметра. Вызов SPR_setVRAMTileIndex() должен быть после SPR_addSprite().

Оффлайн ALKOSHA

  • Пользователь
  • Сообщений: 805
  • Люблю донди.
    • ВКонтакте
    • Просмотр профиля
SGDK
« Ответ #779 : 18 Июль 2022, 20:23:51 »
Тэээк-с...

Sprite *sprites[80];
...
SPR_init();
VDP_setPalette(PAL2, earth.palette->data);
sprites[0] = SPR_addSprite( &earth ,160, 5, TILE_ATTR(PAL2, FALSE, FALSE, FALSE));
SPR_setVRAMTileIndex(sprites,ind);
SPR_update();
SYS_doVBlankProcess();

Ничего не поменялось. Оффсет адреса тот же.