Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 28 мар 2024, 18:11

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
СообщениеДобавлено: 16 май 2014, 11:52 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Переписал с 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 КБ]
Скачиваний: 758
Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 16 май 2014, 11:57 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Руслану нужно что-то вроде лазер бейсика, только с меньшим расходом памяти и желательно с поддержкой 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 КБ]
Скачиваний: 758
Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 23 июн 2014, 02:06 
Не в сети
Аватара пользователя

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


Вложения:
BegaMyshej.tap [4.99 КБ]
Скачиваний: 931
Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 13 дек 2014, 15:51 
Не в сети
Аватара пользователя

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

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

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


Вложения:
BegaMyshej.zip [15.67 КБ]
Скачиваний: 708
Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 26 дек 2014, 18:35 
Не в сети
Аватара пользователя

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


Вложения:
BegaMyshej.zip [15.42 КБ]
Скачиваний: 753
Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 26 дек 2016, 01:31 
Не в сети
Аватара пользователя

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


Вложения:
BegaMyshej_Laser2.zip [71.19 КБ]
Скачиваний: 540
Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 05 фев 2017, 10:04 
Не в сети
Администратор
Аватара пользователя

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

_________________
Действия профессионала предсказуемы. Но в мире полно любителей!


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


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

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club