воскресенье, 12 сентября 2021 г.

Портирование SDL-софта на Амигу и др.

Просто "заметки на полях"


Выход из программы

Обязательно должен быть. Большинство демомейкеров об этом забывают. Выход выглядит так:
SDL_Quit();
return EXIT_SUCCESS;
Это должно использоваться когда мы вышли из цикла демонстрации.
Для того чтобы сработал return EXIT_SUCCESS; необходимо подключить stdlib:
#include «stdlib.h»
В начале каждого гениального творения на языке Си. Оптимизация невключением заголовочных файлов и выбрасыванием корректного выхода называется просто - идиотизм.

Освобождение ресурсов

Стандартная проблема с криворукими программистами не учившимися на нормальных языках программирования типа Паскаля (до того как они начали писать на Си и Java) в том, что они органически не закрывают ресурсы. Т.е. они умеют их только просить у системы, но закрывать за них будет дядя. Если демомейкер где-то написал:
SDL_Surface *screen;
То он обязан был перед выходом из демонстрации написать:
SDL_FreeSurface(screen);
но конечно он этого не сделал. Если вы портируете SDL-софтину на Амигу или другую платформу - проверьте. Этот козёл точно ничего не освобождает.

Цикл с опросом

Не знаю какой гений первый написал это:
while ((!SDL_PollEvent (&ev) || ev.type!=2))
но оно кочует из кода в код уже лет десять. Несмотря на комментарии пользователей к релизам "у меня не закрывается окно", "мне не выйти из программы". Как демомейкеры занимаются программированием? Копипастят друг у друга и продвигаются методом научного тыка! Правильно так:
while ((SDL_PollEvent (&ev)||ev.type!=SDL_QUIT&&ev.type!=SDL_KEYDOWN))
теперь демонстрация будет обрываться по нажатию любой клавиши или при явлении сигнала "на выход" в SDL-либу, например от события закрытия того же окна с демкой в любой ОС, включая AmigaOS. И это - нормально, если пользователь не хочет видеть ваше творение он должен лёгким движением пальца его закрыть!

Производительность

Надо учитывать. В разных ОС производительность как SDL, так и SDL2 - разная. Могу сказать что PowerSDL в MorphOS и SDL 1.2 в AROS летают как ужаленные (читать - без задержек, что - плохо). SDL и SDL2 в AmigaOS 3 и AmigaOS 4.1 - тормозят не по детски (имеют внутренние задержки). Поэтому, SDL-софтину в MorphOS и AROS надо притормозить, стандартными средствами SDL. Проще всего это сделать поставив после цикла опроса две команды:
SDL_Delay(8);
SDL_PumpEvents();
Иначе вся ваша демонстрация превратится в одно сплошное мельтяшение. Значение задержки определяется экспериментально (где-то это 5, а где-то 20), в зависимости от того под какую ОС делается релиз.

Заикающиеся демонстрации

Если вы видите такое творение в опросе:
while (stillRunning)
   {
      while (SDL_PollEvent(&theEvent))
      {
         if (theEvent.type == SDL_QUIT)
         {
            stillRunning = 0;
         }
демонстрация будет заикаться и залипать на куче платформ. Потому что два вложенных цикла while это хорошо, наверное, только на Бейсике. Когда мы занимаемся выводом на экран - это табу. Цикл опроса должен быть один, такой как показано выше в заметке "Цикл с опросом".

Заголовок окна

Большинство демомейкеров и программистов настолько скромны, что НЕ пишут команду:
SDL_WM_SetCaption("My genius stupidity demo",NULL);
после SDL_Init(SDL_INIT_VIDEO); (а скорее всего просто не знают о её существовании). В результате окно приложения получает свой законный заголовок "SDL_Window". Это выглядит как "кишки наружу", пользователь сразу видит что перед ним полуфабрикат с использованием SDL. Если человек который написал программу (чаще всего это intro) никак не назвал окно - назовите его по имени программы за него. Потому что мы не должны страдать из-за несовпадения радиуса кривизны рук у демомейкеров