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

User Tag List

Страница 17 из 22 ПерваяПервая ... 131415161718192021 ... ПоследняяПоследняя
Показано с 161 по 170 из 217

Тема: ROBOTZ! Releases

  1. #161
    Guru
    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    7,852
    Спасибо Благодарностей отдано 
    654
    Спасибо Благодарностей получено 
    1,841
    Поблагодарили
    1,052 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    PPC, наверно я что-то недопонял в твоем предложении. Как ты предлагаешь восстанавливать спрайт, если он был запорчен адресом возврата после задания sp на спрайт, но до pop?

  2. #162
    Activist Аватар для PPC
    Регистрация
    01.03.2011
    Адрес
    Stamford
    Сообщений
    335
    Спасибо Благодарностей отдано 
    46
    Спасибо Благодарностей получено 
    42
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    PPC, наверно я что-то недопонял в твоем предложении. Как ты предлагаешь восстанавливать спрайт, если он был запорчен адресом возврата после задания sp на спрайт, но до pop?
    Всё также, как в оригинале от jerry: запретить прерывания, поставить стек, считать <BC>, разрешить прерывания, побежать.

    Если без запрета прерываний, то да, нужны промежутки между спрайтами, но это как-то некузяво выглядит имхо, хоть и должно быть быстрее (сразу потеря 8 тактов на спрайт).

    PS. В качестве уточнения: 2х-байтные промежутки ДО спрайта, не "после".
    Последний раз редактировалось PPC; 21.10.2015 в 20:08.

  3. #163
    Guru
    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    7,852
    Спасибо Благодарностей отдано 
    654
    Спасибо Благодарностей получено 
    1,841
    Поблагодарили
    1,052 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от PPC Посмотреть сообщение
    запретить прерывания, поставить стек, считать <BC>, разрешить прерывания, побежать.
    т.е. фактически
    Цитата Сообщение от ivagor Посмотреть сообщение
    запретить прерывания на время задания стека на исходник спрайта (в КД), т.е. EI будет перед первым POP читающим данные спрайта
    В оригинале jerri все же было не так

  4. #164
    Activist Аватар для PPC
    Регистрация
    01.03.2011
    Адрес
    Stamford
    Сообщений
    335
    Спасибо Благодарностей отдано 
    46
    Спасибо Благодарностей получено 
    42
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    В оригинале jerri все же было не так
    ivagor, пойми, в глобальной картине всё это мало что изменит потому, что кроме спрайтов, в банках квазидиска сидит ещё туча всяких вещей типа карты триггеров, списка событий, фонтов и т.п. фигни, и ещё туча кода должна будет запрещать/разрешать прерывания. Сейчас практически весь цикл бежит с запрещёнными. Я делал версию с EI. Мало того, что прерывания терял, так она ещё примерно почти на кадр медленнее бежала.

  5. #165
    Guru
    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    7,852
    Спасибо Благодарностей отдано 
    654
    Спасибо Благодарностей получено 
    1,841
    Поблагодарили
    1,052 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    PPC, тебе относительно роботов однозначно виднее. А лично мне это микрообсуждение было интересно нахождением удачной адаптации предложения Медноногова (про него я раньше читал в zxformate) к использованию с КД.

  6. #166
    Activist Аватар для PPC
    Регистрация
    01.03.2011
    Адрес
    Stamford
    Сообщений
    335
    Спасибо Благодарностей отдано 
    46
    Спасибо Благодарностей получено 
    42
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

    Могу сразу сказать, что вариант, когда прерывания запрещены на время вывода всего тайла, я пробовал, и он нежизнеспособен. Звучание саундтрека было гораздо хуже, чем вот сейчас, с практически запрещёнными. Вывод тайлов во вьюпорт занимает 2.82 прерывания, и они, естественно, регулярно терялись во время рендеринга. Мне интересно, какой эффект даст короткое запрещение прерываний. Боюсь, что всё равно будут частые потери так как для вьюпорта 10x13 тайлов это придётся делать 260 раз (задний план, потом - передний план). Вариант с "разреженными" тайлами и разрешёнными прерываниями - возможно, лучший кандидат, если ничего ещё не придумается, но и он добавит тактов (два сложения при нахождения адреса тайла).

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

  8. #167
    Guru
    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    7,852
    Спасибо Благодарностей отдано 
    654
    Спасибо Благодарностей получено 
    1,841
    Поблагодарили
    1,052 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Пара слов про самый быстрый вариант вывода тайлов - lxi + push. К роботам это вряд ли применимо, но как минимум в одной векторовской игре используется.
    В принципе и это можно совместить с разрешенными прерываниями. В обработчике проверяем код команды, на которую будет возврат. Если это push - ничего не делаем, если не push - заменяем адрес возврата на вершине стека на содержимое регистровой пары (скорее всего bc) в которую был lxi. Небольшая проблемка есть с самыми нижними строками:
    1. Если сначала рисуются верхние тайлы, потом нижние и используется двойная буферизация, то можно просто после цикла вывода тайлов "зарисовать" две строки примыкающие к нижнему ряду тайлов.
    2. Чуть медленнее, но более универсально - выводить 2 нижние строки примерно так, как выводятся первые два байта в оригинале Медноногова, приведенном jerri.

    Причем этот подход к совмещению с разрешенными прерываниями можно применить и к оптимизированной версии lxi+push, когда часть lxi заменяется на mvi, часть lxi/mvi/... пропускается (и т.п.). Но все же ограничение накладывается - нельзя использовать для задания графики две регистровые пары, что в некоторых случаях (регулярные паттерны размером 4x8) позволяет еще немного ускорить вывод.

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

    ---------- Post added at 14:42 ---------- Previous post was at 14:02 ----------

    Цитата Сообщение от ivagor Посмотреть сообщение
    Если это push - ничего не делаем, если не push - заменяем адрес возврата на вершине стека на содержимое регистровой пары (скорее всего bc) в которую был lxi.
    Момент, касающийся вывода первых 2х байтов, про который забыл написать. Там м.б. что-то типа такого: lxi b,d16; sphl; push b; lxi b, d16; push b и т.д.
    Еще одна вещь - в обработчике нужно проверять, куда сейчас указывает sp. Если в экран - действуем, как написано выше.

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

    ---------- Post added at 14:48 ---------- Previous post was at 14:42 ----------

    Цитата Сообщение от ivagor Посмотреть сообщение
    lxi b,d16; sphl; push b;
    Еще вариант - вместо sphl здесь может быть shld, меняющий адрес обработчика прерывания. Тогда в обработчике можно не проверять, куда указывает sp.

    ---------- Post added at 16:03 ---------- Previous post was at 14:48 ----------

    Цитата Сообщение от ivagor Посмотреть сообщение
    вместо sphl здесь может быть shld, меняющий адрес обработчика прерывания. Тогда в обработчике можно не проверять, куда указывает sp
    Проще не трогать в указанном фрагменте sphl и менять обработчик один раз - перед выводом тайлов (не каждого отдельного). И пока выводим тайлы sp всегда "в экране".

  9. #168
    Guru
    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,849
    Спасибо Благодарностей отдано 
    84
    Спасибо Благодарностей получено 
    231
    Поблагодарили
    168 сообщений
    Mentioned
    9 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    В принципе и это можно совместить с разрешенными прерываниями.
    Вопрос только в том, на какую глубину будет использован стек, чтобы не попортить расположенные по ходу стека другие тайлы, которые не будут выводиться в данный момент. Как минимум будет использрован адрес возврата, psw и hl (для анализа содержимого sp или его сохранения), т.е. 6 байт. Таким образом, последние 3 команды push для вывода на экран должны быть при запрещённых прерываниях.

  10. #169
    Guru
    Регистрация
    07.08.2008
    Адрес
    г. Уфа
    Сообщений
    7,852
    Спасибо Благодарностей отдано 
    654
    Спасибо Благодарностей получено 
    1,841
    Поблагодарили
    1,052 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от b2m Посмотреть сообщение
    на какую глубину будет использован стек
    В обработчике, активном при выводе тайлов - только на 2 байта для хранения адреса возврата. Все регистры сохраняются в памяти через shld и разнообразные обмены и пересылки.

    ---------- Post added at 17:43 ---------- Previous post was at 16:28 ----------

    Если еще подумать, то все очень просто. Рисовать тайлы с использованием push (данные для push можно задавать любым образом - lxi, mvi, mov и т.д.) без запрета прерываний можно даже не изменяя обработчик прерываний если:
    1. Использовать двойную буферизацию.
    2. Рисовать тайлы сверху вниз, например построчно. Самую нижнюю строку тайлов рисуем обычными процедурами (без push).
    Если высота тайла 16 точек, то глубины стека в прерывании хватит на 7 push.
    Мой предварительный большой и местами неверный пост теперь можно было бы стереть, но тогда повиснет в воздухе пост b2mа, который подтолкнул меня в правильном направлении.

    ---------- Post added at 19:41 ---------- Previous post was at 17:43 ----------

    Последний приведенный вариант уже нормальный, но при выборочном обновлении (выводим только изменившиеся тайлы) его нужно дополнить. В обработчике прерывания проверяем, выводятся ли сейчас тайлы, и если да, то какие координаты текущего (можно даже по sp определить). Добавляем в специальный список координаты на тайл ниже. После отработки основного цикла вывода тайлов дополнительно обновляем тайлы из списка. Перед началом нового цикла вывода тайлов очищаем тот список.
    Последний раз редактировалось ivagor; 28.10.2015 в 13:34.

  11. #170
    Activist Аватар для PPC
    Регистрация
    01.03.2011
    Адрес
    Stamford
    Сообщений
    335
    Спасибо Благодарностей отдано 
    46
    Спасибо Благодарностей получено 
    42
    Поблагодарили
    18 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от ivagor Посмотреть сообщение
    Проще не трогать в указанном фрагменте sphl и менять обработчик один раз - перед выводом тайлов (не каждого отдельного). И пока выводим тайлы sp всегда "в экране".
    Применительно к роботам - именно так, и никак иначе. При любом раскладе, нужна custom ISR. Вообще, обработчик нужен только для "равномерного" воспроизведения музыки/спецэффектов, и ни для чего больше. Увы, и музыка, и спец-эффекты, и соответствующие драйверы для них лежат в других страницах и банках квазидиска. Под страницами я имею в виду доступ к квазидиску "как к ОЗУ", под банком - как стек.
    Поэтому, "переключение контекста" внутри ISR неизбежно. На самом деле, таких переключений - 3 штуки: 2 выполняются кодом входа в музыкальный драйвер из контекста ISR. Драйвер бежит в соответствующей странице, которые разные для SFX и саунд трека.
    После выполнения драйвером "рендеринга" музыки, он возвращает назад режим квазидиска, в котором бежала ISR, и выходит по ret. Это надо учитывать.

    Зато я вот сейчас сделал версию, которая не переключает квазидиск назад-вперёд при выводе тайлов в ОЗУ (бежит в режиме доступа стеком к тайлам всё время заполнения вьюпорта из тайлмапа). Только такая простая фишка, сразу дала выигрыш в целых 3 тайла на рендеринг экрана. Офигительно ощутимо даже визуально.
    Увы, я не могу пока сделать тоже самое для тайлов переднего плана с альфа каналом. Они большие (24К вроде), и лежат не в том банке, где тайлмап. Эхх. Можно (нужно), конечно, скопировать тайлмап туда, где тайлы, но тогда придётся куда-то двинуть фонты . Это всё не даст такой-же выигрыш, как с тайлами заднего плана, потому, что передний план не заливает весь экран (только всякие батарейки и "экраны"). Буду думать.
    Версию "по Медногоногову" планирую попробовать на этих выходных. На работе не просто завал, а аврал. Не до роботов, сам как робот, по программе дом-хайвэй-работа-хайвэй-дом.

Страница 17 из 22 ПерваяПервая ... 131415161718192021 ... ПоследняяПоследняя

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

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

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

Ваши права

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