Оберон-клуб «ВЄДАsoft»
https://zx.oberon.org/forum/

На ZXDev как на Laser Basic: игра «Бега мышей»
https://zx.oberon.org/forum/viewtopic.php?f=10&t=190
Страница 1 из 1

Автор:  Zorko [ 16 май 2014, 11:52 ]
Заголовок сообщения:  На ZXDev как на Laser Basic: игра «Бега мышей»

Переписал с Laser Basic на Оберон игру «Бега мышей» из книги «Как написать игру для ZX Spectrum». Этим я снова хочу привлечь внимание ценителей ZX-Бейсика к технологии ZXDev. Оберон может рассматриваться как структурный Laser Basic с возможностью удобно использовать любые новые операторы, написанные в машинном коде. Чтобы было яснее соотвествие Бейсик-операторов коду на Обероне — я не стал убирать Бейсик-код.

У ZXDev много достоинств для Спектрум-программиста, но самое важное, пожалуй, — это простой старт в "большое" и кроссплатформенное программирование на простом языке, при первом знакомстве похожем на ZX-Basic. Между программированием на ZX-Basic для Спектрума и, например, созданием игр для Android-смартфонов и планшетов на языке Java — огромный разрыв. Наша цель — смягчить переход, научившись более прогрессивным подходам структурного и модульного программирования на примере простого языка Оберон.

Скомпилированная игра «Бега мышей» занимает сейчас 13 кб, и это очень много. Оптимизировать её по размеру кода можно в десятке направлений. Мой прогноз: в рамках технологии ZXDev её размер после оптимизации будет не больше 3,5 кб. И такая оптимизация желательна не только для уменьшения размера этой игры. Сама возможность оптимизации должна показать скептикам на практике переход от макета, подготовленного очень быстро, до эффективного компактного релиза.

Я приступал несколько раз к оптимизации процедур самого Laser Basic. А там столько лапши, что я испугался. Но если есть желание заняться оптимизацией (притом не только самой игры, но и библиотечных процедур, в ней использованных), я конечно помогу.

Чтобы вы поняли насколько просто будет перейти к порту этой игры со Спектрума на Linux, DOS или Windows, Java или .NET — я могу подготовить консольную версию игры без графики. Можно конечно и с графикой, но вряд ли имеет смысл эмулировать Laser Basic на более других платформах с иным устроением экрана. Так что тогда придётся перевести игру в более платформенно-нейтральные абстракции. Что ж, и это возможно, только здесь ещё много работы. И тоже десятки направлений.

Вложения:
BegaMyshej.zip [19.37 КБ]
Скачиваний: 1841

Автор:  Zorko [ 16 май 2014, 11:57 ]
Заголовок сообщения:  На ZXDev как на Laser Basic: игра «Бега мышей»

Руслану нужно что-то вроде лазер бейсика, только с меньшим расходом памяти и желательно с поддержкой 128 кб. Чтобы показать юзабельность ZXDev в этом случае на примере игры «Бега мышей» хотелось бы подробнее осветить вопросы оптимизации программ, разработанных с помощью этой среды.

Итак, пункт 1 — наиболее очевидный. К игре подключен весь набор спрайтов LaserSprite2B, а мы можем ограничиться одной мышкой. Что я иллюстрирую приложенным архивом. Размер игры сократился до 6,8 кб. Это безусловно не предел, ведь мы почти не коснулись кода.

Дальнейшая оптимизация по размеру может быть достигнута путём разбиения кода Laser Basic на отдельные подпрограммы, из которых к нашей игре будут подключены только использованные фрагменты. Это сложная и квалифицированная работа, к которой я питаю устойчивое отвращение. И, видимо, не только я. ;)

Но такая оптимизация дала бы нам несколько килобайт выигрыша. Ладно, не будем огорчаться. Я предлагаю другое. Чтобы и оптимизировать игру, и заодно чуть-чуть вывести её из абстракций Laser Basic'а, слишком ориентированных на Спектрум-экран с атрибутами, приходит такая идея: обозначить спрайт мышки, выводимый без атрибутов (что нужно для игры), как двухцветный спрайт с задаваемыми отдельно цветами фона и чернил. Это не бог весть какая удобная абстракция для современных высокотехнологичных игр, но для «мышек» вполне сгодится. По крайней мере, тут уже нету упоминания об атрибутах. Да и двухцветный спрайт на других платформах может быть, например, оранжево-фиолетовым, что недостижимо на Спеке.

Сейчас на данный момент я реализовал аппарат прозрачных и непрозрачных двухцветных (моно) тайлов размером 8x8 точек для платформ Windows и Linux (используется библиотека SDL), а также Java ME. Для Спекки разбирать мышку на тайлы мне не хочется, это чуть-чуть неправильно — потому что вычисление смещений и вывод мышки по кусочкам придётся поднять на высокий уровень, теряя необходимую эффективность. Поэтому дальнейшая оптимизация будет выглядеть как вариативная:

  1. Просто оторвать процедуру Laser.PTBL от остального кода библиотеки. Побочным эффектом будет отрывание PTOR, PTXR и PTND, которые построены на этой же базе.
  2. Разработать процедуру вывода двухцветного спрайта (с задаваемыми цветами фона и чернил) произвольного размера. В Спектрум-варианте пусть не будут забыты: формат (важно для скорости вывода!) спрайта (в каком порядке лучше хранить массив пикселей), способ вывода (XOR, OR, AND, PUT, на первое время можно ограничиться выводом PUT), специфическая координатная система (пусть будет только вывод по координатам, кратным 8, т.е. знакоместам) и конечно корректная работа при выходе спрайта за пределы экрана. Отдельно хотелось бы не забыть возможность выхода за пределы экрана не только справа/снизу, но и слева/сверху.

Подобную же процедуру разработать и для других платформ (перечисленных выше с SDL и Java ME). Это позволит чуть-чуть сместить акценты от Спектрума в пользу других платформ.

Считаю полезными оба эти направления. В качестве чернового варианта можно было бы конечно побить «мышку» на моно-тайлы и выводить не с помощью Laser.PTBL, а по GrTiles.DrawMonoTile8x8, но это направление мне кажется не очень удачным. Для Спектрум-варианта игры — пока мы не откажемся от Laser'а полностью, заменив его другими процедурами, или пока Laser не будет разбит на фрагменты для смартлинковки — это не даст никакого выигрыша в размере кода, т.к. код Laser Basic'а всё равно пристёгнут к игре полностью.

Я не ставлю цели оптимизировать «Бега мышей» по самое небалуйся, просто размышляю на тему оптимизации в ZXDev и миграции кода на другие платформы возможными средствами XDev с точки зрения абстракций, которыми выражена эта игра. Можно взять и другую игру конечно. Только сперва несложную. В ZXDev и XDev ещё мало библиотек.

Вложения:
BegaMyshej2.zip [16.85 КБ]
Скачиваний: 1888

Автор:  Zorko [ 23 июн 2014, 02:06 ]
Заголовок сообщения:  Re: На ZXDev как на Laser Basic: игра «Бега мышей»

После перекомпиляции игры со "смартлинкуемой" библиотекой Laser сэкономлено ещё полтора килобайта. Было: 6781, стало: 5105.

Вложения:
BegaMyshej.tap [4.99 КБ]
Скачиваний: 2032

Автор:  Zorko [ 13 дек 2014, 15:51 ]
Заголовок сообщения:  Re: На ZXDev как на Laser Basic: игра «Бега мышей»

Изменил в формате спрайтов абсолютную адресацию на относительную. Теперь в любой программе, использующей библиотеку Laser, удаётся сэкономить ещё 52 байта за счёт отказа от использования процедуры для настройки адресов спрайтов. Теперь пересчёт смещений спрайтов может вызываться отдельно в случае если спрайты вчерновую взяты из Laser Basic. Далее можно расставить вручную смещения и отказаться от вызова процедуры пересчёта.

LaserDemo.tap: было 2905 байт, стало 2853 байт
BegaMyshej.tap: было 5105 байт, стало 5053 байт

Также поправил пути в сборочных скриптах с учётом реструктуризации ZXDev.

Вложения:
BegaMyshej.zip [15.67 КБ]
Скачиваний: 1916

Автор:  Zorko [ 26 дек 2014, 18:35 ]
Заголовок сообщения:  Re: На ZXDev как на Laser Basic: игра «Бега мышей»

Всякие регистровые и инлайновые оптимизации, также правка бага с нарушением IY при опросе клавиатуры. Теперь 4975 байт.

Вложения:
BegaMyshej.zip [15.42 КБ]
Скачиваний: 1711

Автор:  Zorko [ 26 дек 2016, 01:31 ]
Заголовок сообщения:  Re: На ZXDev как на Laser Basic: игра «Бега мышей»

Оптимизация продолжается! Пересобрал игру с помощью библиотеки Laser2. 3175 байт. После hrust'а 2607 байт.

Вложения:
BegaMyshej_Laser2.zip [71.19 КБ]
Скачиваний: 1465

Автор:  prospero78su [ 05 фев 2017, 10:04 ]
Заголовок сообщения:  Re: На ZXDev как на Laser Basic: игра «Бега мышей»

Олег! Ты на практике продемонстрировал эмпирическое правило: 20% усилий дают 80% результата))

Страница 1 из 1 Часовой пояс: UTC + 2 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/