Важная информация

User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 12

Тема: Синхронизация в нижней части экрана

  1. #1
    Member
    Регистрация
    20.06.2014
    Адрес
    г. Москва
    Сообщений
    58
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Синхронизация в нижней части экрана

    Спустя 30 лет после молодости решил под ностальгическим настроением намалевать игрулю под Спектрум. Пишу на АСМе в SpectnetIDE под Visual Studio. Штука исключительная, очень нравится.Хочу сделать XONIX. Нолики (враги) будут кубики из 4 пикселов, рутину рисования написал сам (т.к. готовые граф движки с первого взгляда сложны и громоздки, а спрайты мне в принципе не нужны). Программеры знают, что экран надо обновлять когда он не отрисовывается. Обратный луч отлавливаем через HALT. Сейчас пришел к такому алгориту:

    while (1) {
    HALT (начался обратный ход луча)
    Рисуем врагов
    Задержка (цикл)
    Разные задачи (чтение клавы, перемещение игрока итд)
    Удаляем врагов
    Перемещаем координаты врагов
    }

    Схема эта работает, всё летает плавно на 50 Гц до 7 врагов (пока), проблема только в том, что подпрограмма рисования врагов выполняется разное кол-во циклов в зависимости от кол-ва врагов, и вся остальная часть программы сдвигается. Также и Разные задачи занимают разное время в зависимости от действий игрока. В принципе, это можно компенсировать табличной подстройкой задержки, но моя цель,что задержка должна автоматически заканчиваться когда луч начинает рисовать бордюр в нижней части экрана. Иными словами, мне нужно задержкой автоматически охватить всю видимую часть экрана, исключая бордюр. Но команда HALT наступает позже (когда бордюр полностью нарисован). Если ставить задержку сразу после HALT и дотягивать её до низа экрана, теряется добрая половина хорошего времени обратного хода когда я мог бы рисовать.

    Поэтому вопрос такой: чем засинхронизироваться в нижней части экрана где начинается нижний бордюр? Нашёл в инете описание способа floating bus (никогда раньше о нем не слышал. Вкратце суть: если читать из несуществующего порта (например #FF), можно получить байты данных, которые "видеокарта" в данный момент выводит на экран. Описание вот http://sky.relative-path.com/zx/floating_bus.html), это конечно очень круто, но большие проблемы с совместимостью: на разных спектрумах работает по-разному, в эмуляторах тоже не очень корректно либо не работает совсем. Живой синклер 48к у меня есть, но пока руки не дошли его запустить (куплен на Ebay с неисправностью, повозиться с ним надо). Да и загружать постоянно на спектрум конечно долго и неудобно.

    Может кто сталкивался с такой проблемой и знает её корректное решение?
    Последний раз редактировалось Jimmy Falcon; 19.04.2020 в 17:12.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Guru
    Регистрация
    27.02.2005
    Адрес
    москва
    Сообщений
    13,773
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    142
    Спасибо Благодарностей получено 
    1,178
    Поблагодарили
    774 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Jimmy Falcon Посмотреть сообщение
    Нолики (враги) будут кубики из 4 пикселов, рутину рисования написал сам
    как вариант http://spectrum4ever.org/download.ph...lltape&id=1392
    только управление там больно мудрёное R/F,D/G

  4. #3
    Veteran Аватар для zebest
    Регистрация
    11.01.2008
    Адрес
    Ладошкино
    Сообщений
    1,670
    Записей в дневнике
    4
    Спасибо Благодарностей отдано 
    321
    Спасибо Благодарностей получено 
    221
    Поблагодарили
    174 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Jimmy Falcon Посмотреть сообщение
    чем засинхронизироваться в нижней части экрана где начинается нижний бордюр?
    это я так понимайю нижная часть бордюра?

    (синяя в данном случае) Тогда - зачем?
    или все же нижнаяя треть экрана?)
    Profi v3.2 -=- Speccy2010,r2

  5. #4
    Member
    Регистрация
    20.06.2014
    Адрес
    г. Москва
    Сообщений
    58
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от zebest Посмотреть сообщение
    это я так понимайю нижная часть бордюра?

    (синяя в данном случае) Тогда - зачем?
    или все же нижнаяя треть экрана?)
    Да, синяя часть. Зачем, я написал в 1м посте.

  6. #5
    Veteran Аватар для zebest
    Регистрация
    11.01.2008
    Адрес
    Ладошкино
    Сообщений
    1,670
    Записей в дневнике
    4
    Спасибо Благодарностей отдано 
    321
    Спасибо Благодарностей получено 
    221
    Поблагодарили
    174 сообщений
    Mentioned
    7 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ксоникс на бордюре?? хм. а синронить под какую машину? у них у всех разные тайминги, zx48\zx128\pent\далее со всеми остановками. Все равно я не знаю такого метода, чтобы отловить начало нижнего бордЕра. вон ,например, мультиколор задержками выровнять и то не могу
    Profi v3.2 -=- Speccy2010,r2

  7. #6
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,755
    Спасибо Благодарностей отдано 
    261
    Спасибо Благодарностей получено 
    269
    Поблагодарили
    203 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Jimmy Falcon, я предлагаю другой вариант.
    если сможешь уложиться в 16000 тактов

    то после HALT стираешь, потом рисуешь врагов.
    врядли у тебя их много.
    С уважением,
    Jerri / Red Triangle.

  8. #7
    Member
    Регистрация
    20.06.2014
    Адрес
    г. Москва
    Сообщений
    58
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от zebest Посмотреть сообщение
    Ксоникс на бордюре?? хм. а синронить под какую машину? у них у всех разные тайминги, zx48\zx128\pent\далее со всеми остановками. Все равно я не знаю такого метода, чтобы отловить начало нижнего бордЕра. вон ,например, мультиколор задержками выровнять и то не могу
    Ну вот методом плавающей шины можно, но я боюсь совместимость будет хреновая. То есть надо будет на всех машинах тестить. Я помню синклеровские игры которые хреново работали на Краснодаре из-за плохих таймингов, я так не хочу. ))

    Цитата Сообщение от jerri Посмотреть сообщение
    Jimmy Falcon, я предлагаю другой вариант.
    если сможешь уложиться в 16000 тактов

    то после HALT стираешь, потом рисуешь врагов.
    врядли у тебя их много.
    С небольшим количеством врагов (1-3) это работает, а на больше не хватает. Потому что в таком раскладе полностью пропадает тот кусок времени что показан на фотке выше синим цветом. При том, что мой вариант с задержкой легко тянет 7 врагов без лагов и мерцаний. А количество врагов в xonix растет бесконечно с каждым уровнем, хотелось бы сделать максимум.
    Последний раз редактировалось Jimmy Falcon; 19.04.2020 в 20:18.

  9. #8
    Guru Аватар для Lethargeek
    Регистрация
    08.09.2005
    Адрес
    Воронеж
    Сообщений
    4,561
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    267
    Спасибо Благодарностей получено 
    220
    Поблагодарили
    175 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Jimmy Falcon Посмотреть сообщение
    С небольшим количеством врагов (1-3) это работает, а на больше не хватает.
    Нужно рисовать построчно (хотя бы по символьным строкам), тогда луч догонит ниже, и тактов у тебя будет больше. Еще можно в верхней трети экрана разместить инфопанель, хоть и не всегда красиво получится.

    - - - Добавлено - - -

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

  10. Этот пользователь поблагодарил Lethargeek за это полезное сообщение:

    Barmaley_m (30.05.2020)

  11. #9
    Guru Аватар для jerri
    Регистрация
    01.03.2005
    Адрес
    Samara
    Сообщений
    4,755
    Спасибо Благодарностей отдано 
    261
    Спасибо Благодарностей получено 
    269
    Поблагодарили
    203 сообщений
    Mentioned
    12 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Jimmy Falcon Посмотреть сообщение
    С небольшим количеством врагов (1-3) это работает, а на больше не хватает. Потому что в таком раскладе полностью пропадает тот кусок времени что показан на фотке выше синим цветом. При том, что мой вариант с задержкой легко тянет 7 врагов без лагов и мерцаний. А количество врагов в xonix растет бесконечно с каждым уровнем, хотелось бы сделать максимум.
    ок

    покажи процедуру рисования врага.

    есть еще вариант
    сделать статичное время отрисовки врага
    С уважением,
    Jerri / Red Triangle.

  12. #10
    Member
    Регистрация
    20.06.2014
    Адрес
    г. Москва
    Сообщений
    58
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    1
    Поблагодарили
    1 сообщение
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В итоге так:


    Sync:

    ld e,#0f

    uim2: ld a,(#5880); <<- шедевр программирования, почти анекдот
    ld a,e; <<- про два jmp'а подряд
    in a,(#fd)
    cp e
    jr nz,uim2


    Область атрибутов экрана в которой хотим чтобы сработал этот Sync нужно закрасить кодом 0xF. HALT вообще убрал, прерывания запретил. В итоге, сходу 9 врагов летают на 50fps без тормозов! Работает на эмуляторе Specnetide. На других пока не пробовал. Пришла ещё мысль переписать немного процедуру передвижения врагов чтобы можно было переместить её в "рисовальную" часть растра (сейчас она в силу алгоритма находится в тёмной части). В общем, попозже погоняю на разных эмулях.

    А вообще, если кому интересно, процедура проверки работы floating bus вот (целиком):

    floating:

    ld a,#f
    ld b,32
    ld hl,#5a40
    um1: ld (hl),a
    inc l
    djnz um1

    fl_bus:

    ld e,#0f

    um2: ld a,(#5880)
    ld a,e
    in a,(#fd)
    cp #f
    jp nz,um2
    ld a,1
    out (254),a
    ld b,128
    djnz $
    ld a,7
    out (254),a
    jr fl_bus


    Она должна рисовать синюю полосу на экране и такую же на бордюре. Если на бордюре не рисует, значит не пашет у вас. ) Попозже .tap скину для проверки.
    Последний раз редактировалось Jimmy Falcon; 20.04.2020 в 11:00.

  13. Этот пользователь поблагодарил Jimmy Falcon за это полезное сообщение:

    zebest (20.04.2020)

Страница 1 из 2 12 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Отсутствует синхронизация
    от Narick в разделе Изображение
    Ответов: 7
    Последнее: 28.01.2018, 22:16
  2. Pentagon 128 - кадровая синхронизация
    от doc_fbi в разделе Pentagon
    Ответов: 5
    Последнее: 27.10.2013, 10:29
  3. Синхронизация изображения с телевизором.
    от Иван Азаров в разделе Для начинающих
    Ответов: 6
    Последнее: 12.09.2012, 18:44
  4. Синхронизация Z80
    от Арнольд в разделе Для начинающих
    Ответов: 8
    Последнее: 12.05.2012, 23:02

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •