LINUX.ORG.RU

Я пишу облегчённую версию SDL3, с поддержкой старых систем.

 ,


1

3

Приветствую!

Проект решил назвать SDL3Lite. Проект пишу на C++ 98, но наружу торчит совместимый С API. Я хочу реализовать базовый функционал, поэтому вполне реально довести проект до конца. Главная идея проекта это сохранить совместимость с оригинальным C API SDL3. В идеале это конечно на уровне бинарной совместимости. Код единожды написанный должен собираться без изменений для всех поддерживаемых систем.

Сейчас работает рендер на OpenGL 1.2, добавляю версию software для старых систем без поддержки аппаратного ускорения. Также планирую добавить и поддержку vulkan. В репе есть скриншоты с выводом графики.

На данный момент поддерживается windows 95 и выше, linux начиная с Debian 3.

В будущих версиях планирую добавить поддержу windows 3.1 и ms-dos.

Рад буду советам, критике и предложениям.

А чем обычный SDL3 не устраивает? Не проще ли развивать патчсет для него, чем имплементировать с нуля?

Bfgeshka ★★★★★
()
Последнее исправление: Bfgeshka (всего исправлений: 1)
Ответ на: комментарий от Bfgeshka

Не устраивает, что с каждой новой версией дропают поддержку множества и не таких старых платформ.

Я пару дней крутил сорцы SDL3. И портировать сверх задача. Очень серьезные трудозатраты. Легче написать заново, но реализовать минимальный функционал. Простой рендер, окна, события. И уже остальной функционал добавлять по мере готовности.

Я пишу на С++, поэтому разработка идет быстрее.

JordanCpp
() автор топика
Ответ на: комментарий от firkax

Решил заново начать. LDL я довольно сильно переусложнил и в итоге он не взлетел. Данный проект, будет более полезен сообществу программистов. Наработки по LDL потихоньку переношу.

И заодно закрываю гештальт по ретро кодингу под старые девайсы.

JordanCpp
() автор топика
Ответ на: комментарий от JordanCpp

ну почему, у всех с первого раза не получается, всегда нужно несколько попыток сделать, чтобы получатся стало

s-warus ★★★★
()

А можешь пример программы сделать, хоть небольшой? Взять например из тутора по sdl1,2,3 и адаптировать под твою альтернативу?

vbcnthfkmnth123 ★★★★★
()
Ответ на: комментарий от s-warus

Да, так бывает. Пока не сделаешь несколько прототипов, не съешь пуд соли. Решения не появится.

JordanCpp
() автор топика

Ты в этом как-то заинтересован (есть свой проект, который использует SDL на старых системах) или просто за державу обидно (ну, а чего они дропают)?

MoldAndLimeHoney ★★
()
Ответ на: комментарий от vbcnthfkmnth123

Да, я уже начал адаптировать примеры из оригинального SDL3. Недостающий функционал реализую и тестирую. Пока не выкладывал. Но постараюсь в ближайшие дни, выложить несколько готовых примеров.

JordanCpp
() автор топика
Ответ на: комментарий от MoldAndLimeHoney

Да мой интерес это фан и программирование игр. Не хочу писать под несколько версий SDL, что бы портировать под Windows 95. У меня есть проект по реализации движка игры Arcanum. Вот туда его применю. И возможно такой базовый функционал пригодится и другим разработчикам. Вдруг кто-то захочет портировать под системы 25+ лет. Особенно игры с 2D графикой.

И само по себе это интересно. Мне приходится напрямую взаимодействовать с тем старым железом или эмуляторами, операционными системами и старыми компиляторами.

JordanCpp
() автор топика
Последнее исправление: JordanCpp (всего исправлений: 1)
Ответ на: комментарий от JordanCpp

Очень серьезные трудозатраты.

Ну ещё бы.

sparkie ★★★★★
()
Ответ на: комментарий от IIIypuk

Спасибо, надо будет облагородить страницу проекта.

JordanCpp
() автор топика

В будущих версиях планирую добавить поддержу windows 3.1 и ms-dos.

А есть чем под эти цели компилировать C++ хотя бы 17-го стандарта?

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)
Ответ на: комментарий от sparkie

Под OS/2 Warp, например, не?

Для портирования нужен компилятор С++ 98 с поддержкой шаблонов и namespace. В принципе реально.

Мне удалось собрать проект Visual C++ 4.0

JordanCpp
() автор топика
Ответ на: комментарий от annulen

А есть чем под эти цели компилировать C++ хотя бы 17-го стандарта?

Вот именно из-за этого и придерживаюсь С++ 98. Который более или менее поддерживается старыми компиляторами под старые ОС.

JordanCpp
() автор топика

верно мыслишь! надо на инклюзивный говнолорчек твоё гумно тащить)) тут нельза фуйцов накидать за бакланопцтит, как на попеннете

anonymous
()
Ответ на: комментарий от anonymous

верно мыслишь! надо на инклюзивный говнолорчек твоё гумно тащить)) тут нельза фуйцов накидать за бакланопцтит, как на попеннете

Да ладно вам. Нормальный проект, не хуже других. И кстати на на OpenNet тоже завезли:)

https://www.opennet.ru/opennews/art.shtml?num=62909

JordanCpp
() автор топика
Ответ на: комментарий от JordanCpp

...нужен компилятор С++ 98...

Где-то ж был. BC++ 5.02...

sparkie ★★★★★
()
Ответ на: комментарий от JordanCpp

Вот именно из-за этого и придерживаюсь С++ 98. Который более или менее поддерживается старыми компиляторами под старые ОС.

Это понятно, но пользователям библиотеки тоже придётся мучаться, чтобы их код на старых системах заработал. Логичнее было бы портировать на старую систему новый тулчейн и потом писать код без боли

annulen ★★★★★
()
Ответ на: комментарий от JordanCpp

гештальт по ретро кодингу под старые девайсы.

Какие именно, позволь узнать? Старые компы или старые портативные девайсы?

Вот у меня есть старые Linux’овые моторолки, там под SDL работают такие штуки:

https://youtu.be/lpoxch6yz_s

SDL там очень древний, вроде 1.2.15 и получить облегчённый SDL3 было бы интересно.

EXL ★★★★★
()

Проект пишу на C++ 98, но наружу торчит совместимый С API.

давно пишешь-то? там одни заглушки функций, больше и нет ничего. так оно и надо?

alysnix ★★★
()

А чем обусловлен выбор лицензии Boost?

Sunderland93 ★★★★★
()
Ответ на: комментарий от annulen

Логичнее было бы портировать на старую систему новый тулчейн и потом писать код без боли

Для меня сложно и долго. Ради экономии времени, использую, те инструменты которые мне доступны.

JordanCpp
() автор топика
Ответ на: комментарий от EXL

Какие именно, позволь узнать? Старые компы или старые портативные девайсы?

По возможности на всё, до чего доберусь и хватит знаний портировать.

давно пишешь-то? там одни заглушки функций, больше и нет ничего. так оно и надо?

Около месяца. Заглушки для дальнейшей реализации, еще не до конца доделан software рендер. Но до этого был похожий проект, поэтому беру код из него. Там много реализованного функционала который нужен для SDL3Lite.

А чем обусловлен выбор лицензии Boost?

Раньше работал плотно с библиотекой boost, ну и взял её как основу для своих проектов.

JordanCpp
() автор топика
Последнее исправление: JordanCpp (всего исправлений: 2)
Ответ на: комментарий от JordanCpp

Не устраивает, что с каждой новой версией дропают поддержку множества и не таких старых платформ.

Типа windows 3.1 и ms-dos?

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Типа windows 3.1 и ms-dos?

Это уже мои хотелки.

На сайте SDL, при очередном релизе есть пункт drop systems. И с каждой новой версией список не маленький. И по опыту поддержки старых систем, не сказать, что это дорого и сложно. Около 1000-2000 строк кода на систему. Конечно это нужно сделать, поддерживать, отлаживать и т.д А когда таким систем десятки, нагрузка чувствуется. Ну и понятно, что основным разработчикам платят, а кто платит тот и танцует. А мне никто не платит, могу себе позволить добавить поддержку Windows 3.1 и MS-DOS.

JordanCpp
() автор топика
Последнее исправление: JordanCpp (всего исправлений: 1)

Сделай где-нибудь список того что точно не будет реализовано. Нужно знать на что обязательно завязаться чтобы старьёвщики не пытались лезть в мои проекты.

anonymous
()
Ответ на: комментарий от anonymous

Нужно знать на что обязательно завязаться чтобы старьёвщики не пытались лезть в мои проекты.

Вот, нашёл на опеннете:

Проблема с fheroes2 в том, что они используют новые фичи плюсов, а под некоторые архитектуры нет свежего gcc (например под armv4t самый свежий gcc/g++ это версия 4.4.3), а более новые хотя код вроде как генерят, но тащут свои объектники и либы заточные под более свежий арм. Поэтому данная либа им не поможет.

Т.е. достаточно писать на каком-нибудь C++21, и весь этот древний мусор останется в пролёте.

anonymous
()
Ответ на: комментарий от anonymous

Проблема с fheroes2 в том, что они используют новые фичи плюсов

Интересно какие игры автор рассчитывает поддерживать своей библиотекой, ибо проекты переехавшие на совсем недавно релизнувшийся SDL3 и не переехавшие при этом на достаточно новый стандарт плюсов (или, не дай бог, написанные на чистом C) можно, наверное, по пальцам одной руки пересчитать.

anonymous
()
Ответ на: комментарий от anonymous

Это как раз правильный подход. Для SDL1 и SDL2 есть compat библиотеки, которые транслируют старый API в новый, то есть на SDL3 можно запускать старые игры.

MOPKOBKA ★★★★★
()
Ответ на: комментарий от MOPKOBKA

Ты путаешь вообще никак не связанные (или диаметрально противоположные, это как посмотреть) вещи - запускать старые игры на новой библиотеке и запускать новые игры на поддельной библиотеке прикидывающейся SDL3, но поддерживающей никому не нужные древние платформы. Тут как бы можно даже настолько упороться что игру на SDL2 собрать с sdl2-compat чтобы вместо SDL2 она использовала SDL3, но вместо SDL3 подложить SDL3Lite, чтобы прост чтобы. Может быть можно даже sdl12-compat -> sdl2-compat -> SDL3Lite.

anonymous
()
Ответ на: комментарий от anonymous

sdl12-compat

Оно говно. По факту игры с sdl1 на ней ломаются и не только игры. Тестил на openxcom, когда пересобрал вместо sdl1. Также в xine при сборке с sdl12-compat ломается вывод в sdl

vbcnthfkmnth123 ★★★★★
()

Сорян, я немного полистал код на гитхабе, хорошо оформлен, чист понятен читать приятно. Кругом ассерты, будто никто не будет это компилировать с -О2 и -О3, ну ладно имеет место быть, а тут то чего нет никаких ассертов, отрицательное число сюда никогда не придёт, а чому оно int а не uint тогда:


Palette::Palette(int ncolors)
{
    this->ncolors = ncolors;
    colors        = new Color[ncolors];
    version       = 0;
    refcount      = 0;
}

Прям вот так?


SDL_Renderer* SDL_CreateSoftwareRenderer(SDL_Surface* surface)
{
	return NULL;
}
Ygor ★★★★★
()
Ответ на: комментарий от Ygor

Сорян, я немного полистал код на гитхабе, хорошо оформлен, чист понятен читать приятно. Спасибо за отзыв.

Кругом ассерты, будто никто не будет это компилировать с -О2 и -О3, ну ладно имеет место быть,

Ассерты я заменю на обработку ошибок, так как в оригинальном SDL3 при ошибке нужно вызвать SDL_GetError. Пока assert это временное решение.

отрицательное число сюда никогда не придёт, а чому оно int а не uint тогда:

Мелкие шероховатости, пока остаются в коде. SDL_CreateSoftwareRenderer это заглушка до реализации.

JordanCpp
() автор топика
Последнее исправление: JordanCpp (всего исправлений: 1)
Ответ на: комментарий от Ygor

отрицательное число сюда никогда не придёт, а чому оно int а не uint тогда

https://hamstergene.github.io/posts/2021-10-30-do-not-use-unsigned-for-nonneg...

Я согласен с тем что его нельзя использовать как контракт, -1 туда легко передается, причем даже без конвертации из int, потому что -1 это значение для UINT_MAX которое часто используют.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 4)
Ответ на: комментарий от JordanCpp

У меня есть проект по реализации движка игры Arcanum. Вот туда его применю

Надеюсь, хотя бы в этом году мы увидим релиз. А то мы с пацанами из форума «Arcanum Club» с 2023 года ждем-с.

Overlabor5491
()

Так ли много SDL3 приложений под вин 95? Да и в целом пользователей вин 95. Старые опенсорсные приложки можно собрать со старыми SDL, логично что к версии 3 они постепенно сносят поддержку древностей, банально нет приложений под эти требования, не только же SDL там в зависимостях.

neumond
()
Ответ на: комментарий от neumond

Так ли много SDL3 приложений под вин 95? Да и в целом пользователей вин 95. Старые опенсорсные приложки можно собрать со старыми SDL, логично что к версии 3 они постепенно сносят поддержку древностей, банально нет приложений под эти требования, не только же SDL там в зависимостях.

Вся поддержка Windows 95 заключается в десятке строк и пары #ifdef. Конечно по мере обрастания функционалом, количество доп. кода для windows 95 увеличится. Но не настолько критично.

JordanCpp
() автор топика
Ответ на: комментарий от Overlabor5491

Надеюсь, хотя бы в этом году мы увидим релиз. А то мы с пацанами из форума «Arcanum Club» с 2023 года ждем-с.

Я уже начал перенос движка на SDL3. Аркануб клуб живой? Заходил на сайт, пару сообщений новых увидел.

JordanCpp
() автор топика
Ответ на: комментарий от MoldAndLimeHoney

за державу обидно (ну, а чего они дропают)?

Хорошая, чеканная формулировка :)

hobbit ★★★★★
()
13 сентября 2025 г.

https://github.com/JordanCpp/SDL3Lite/blob/e921be532f88df27ca40da2d8149066752...

typedef union SDL_Event
{
    Uint32 type;                            /**< Event type, shared with all events */
    SDL_MouseMotionEvent motion;
    SDL_MouseButtonEvent button;
    SDL_QuitEvent quit;                     /**< Quit request event data */
} SDL_Event;


а как при таком union сделать рабочую программу без UB? получил ты этот эвент, — что дальше?

https://github.com/JordanCpp/SDL3Lite/blob/e921be532f88df27ca40da2d8149066752...
что тут происходит? — какие предположения?
...
SDL_Event event;
...
event.type = SDL_EVENT_MOUSE_MOTION;
event.motion.x = LOWORD(lParam);

safocl ★★
()
Последнее исправление: safocl (всего исправлений: 3)
Ответ на: комментарий от safocl

а как при таком union сделать рабочую программу без UB? получил ты этот эвент, — что дальше?

Посмотри примеры, простейший фреймворк. Проверяешь type, в зависимости от него проверяешь motion, button и прочее. В motion, button задублирован type, так что все валидно.

MOPKOBKA ★★★★★
()
Ответ на: комментарий от MOPKOBKA

так это UB.
ирония в том, что исправление тривиально простое, а также что все, кроме самого поля type можно использовать для определения type...

if (event.type == SDL_EVENT_MOUSE_MOTION)
    auto i = event.motion.x;

тут ub либо на первой, либо на второй строке — поскольку это разные мемберы, и один из них не является активным.

но если сделать
struct GenericEvent{
    Uint32 type;
};
typedef union SDL_Event
{
    GenericEvent generic;            /**< Event type, shared with all events */
    SDL_MouseMotionEvent motion;
    SDL_MouseButtonEvent button;
    SDL_QuitEvent quit;              /**< Quit request event data */
} SDL_Event;

то через
if (event.generic.type == SDL_EVENT_MOUSE_MOTION)
    auto i = event.motion.x;

всё будет ок. (без UB)

safocl ★★
()
Последнее исправление: safocl (всего исправлений: 2)
Ответ на: комментарий от safocl

в си первоначальный вариант имеет unspecified behavior, в с++ это undefined behavior — однако даже в си это может дать непредсказуемый вариант поведения программы.
https://eel.is/c draft/class.union#general-note-1

safocl ★★
()
Последнее исправление: safocl (всего исправлений: 1)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.