1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Пишу фреймворк LDL, аналог SDL но на С++ и с поддержкой старых систем

Тема в разделе "Мастерская", создана пользователем Jordan 63, 26 окт 2022.

  1. rusty_dragon

    rusty_dragon

    Регистрация:
    17 ноя 2007
    Сообщения:
    8.163
    Как раз свободная, чтобы поддерживали и возвращали код в проект, а не бесплатно использовали чужой труд в коммерческих решениях. Без такой лицензии коммерческие закрытые решения всегда будут лучше открытых, а массовые инфраструктурные библиотеки будут поганого качества. Именно поэтому BSD - труп.
     
  2. Чёрный Думер и все виды материала

    Чёрный Думер

    Регистрация:
    17 мар 2010
    Сообщения:
    2.442
    Так а кто мешает собирать несколько dll, но из одной кодовой базы, лежащей в едином репозитории? Проблема в распылении на множество репозиториев-то именно в этом, она ведёт к дублированию второстепенного кода типа всяких обвязок.

    Это колхоз, и притом очень большой, потому что никогда не надо терять историю коммитов. Во-первых она показывает, что проект не на коленке за час сляпан и какую-никакую историю правок имеет, а во-вторых она отражает последовательность изменений в коде, что бывает крайне полезно, если нужно понять, откуда что взялось (при помощи git blame, например).

    Вот сейчас у тебя там только два коммита, а ещё рядом лежит ветка master с куда большим числом коммитов, что создаёт жёсткую двусмысленность. :)
    Давай в телеграме свяжемся (@cher_nov), и я расскажу, как грамотно сделать?
     
    rusty_dragon нравится это.
  3. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    701
    @Чёрный Думер, выражаю огромную благодарность за приведением репы в порядок и сохранение истории коммитов. Спасибо.
     
    Последнее редактирование: 9 мар 2024
    Чёрный Думер нравится это.
  4. excitoon

    excitoon

    Переводчик

    Регистрация:
    12 янв 2023
    Сообщения:
    28
    Замечательный доклад, жаль, что не оффлайн проходил! Идея чем-то напоминает HX DOS Extender , там как раз поддержка вплоть до DOS и своей ОС. :)
     
  5. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    701
    Спасибо за отзыв. Посмотрю указанный проект. Раннее его не видел.
     
  6. excitoon

    excitoon

    Переводчик

    Регистрация:
    12 янв 2023
    Сообщения:
    28
    Возможно не по теме, но я тут подумал, что реально не хватает в Windows 95, так это поддержки WPF/XAML. Если её добавить, то в результате будет библиотека намного функциональнее, чем SDL.
     
  7. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    701
    Идею понял, но сама среда net точится под современные ОС и быстро устаревает, все остальные библиотеки работают на ней. Думаю, что это не возможно.
     
  8. Strategus

    Strategus

    Регистрация:
    1 мар 2024
    Сообщения:
    195
    В Досовских играх полно эффектов было, за счёт манипуляций с палитрами... Интересно, как ты это реализуешь, без реальной загрузки палитровых изображений? STB автоматически палитровые изображения превращает в RGB... Или предложишь пользователям загружать их в виде 256 оттенков серого? )) Вообще не понятно, как в твоем варианте будет работать подход единого Апи для всех систем. Ведь картинка в ДОС версии всегда будет ущербной, если её делать автоматом из 24битного цвета, а уж если большой атлас с кучей мелких спрайтов перегнать, так вообще беда получится же...
     
    Последнее редактирование: 30 мар 2024
  9. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    701
    Идея единого API в том числе и для старых систем типа DOS, в том, что игра или программа должна быть палитровой. На современных системах палитра эмулируется с аппаратным ускорением. И конечно ограничения, что досовскую игру возможно портировать под современные системы, обратно нет.

    Пока без эффектов, только одна глобальная палитра. Будет поддержка из коробки палитровых bmp, другие форматы с палитрой разработчик должен сам загружать и учитывать. К примеру в исходниках есть пример загрузки графики из Fallout 2. Демка написана с учетом дос и палитровой графики игры. Собирается и работает как под дос нативно, так и под современные windows. Просто нужно перекомпилировать. Это как пример и демонстрация единого API.
     
    Strategus нравится это.
  10. Strategus

    Strategus

    Регистрация:
    1 мар 2024
    Сообщения:
    195
    Ну тебе надо тогда сделать загрузку палитровых png, что бы палитру тоже создавал из файла...

    Тут вчера наткнулся на GitHub - megamarc/Tilengine: Free 2D graphics engine with raster effects for retro/classic style game development, там есть пример программы с картинкой, скалы, прибой... Палитровый png файл и еще какой то еще на 400 байт, который видимо отвечает за сдвиги в палитре и анимацию - даже не верится, что такое можно сделать, без нескольких кадров анимации... Правда там под дос уже не рассчитано, так что у тебя есть своя ниша...
     
  11. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    701
    Это трудоемко. Одно дело взять уже готовую библиотеку типа stb и просто обернуть в класс, другое дело с нуля реализовать загрузку данного формата. Я всё же за маленькое, но функциональное ядро библиотеки.

    Мне нравятся такие штуки изучать, некие такие хаки. Имея малое, получить большее. Не только в графике.

    Будем надеяться, что ниша вообще возможна. Я понимаю, что библиотека пока не приблизилась и к функционалу glfw, а уж про SDL я молчу. С другой стороны, все дополнительные плюшки, лучше реализовать в библиотеках расширения.
     
    AndyFox нравится это.
  12. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    701
    Проект живой, только пока времени не хватает. Поэтому давно не было коммитов. Но неотвратимо приближается отпуск, думаю нагоню время простоя проекта.
     
    ITF7, Чёрный Думер, AndyFox и ещё 1-му нравится это.
  13. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    701
    Пост на Хабре.

    Я не стал заводить новую тему, но есть небольшой апдейт.

    Переосмысление библиотеки LDL.

    [​IMG]

    Я полностью пересмотрел концепцию библиотеки LDL.

    Что такое LDL?
    Это графическая библиотека с единым API для всех систем как старых, так и новых.

    Раньше я писал её на C++98, что давало хорошую портабельность. Но сейчас я пересмотрел многие тезисы, которые декларировал на GitHub, чтобы наконец добраться до первого релиза.

    Новая стратегия

    Я решил выпускать релизы без реализации полного функционала (графика, звук, шрифты и т.д.) постепенно, итеративно.

    Перешёл на C89 для максимальной переносимости. Это не только DOS или Windows 3.x, но и старые системы вроде Solaris, PlayStation 1 и другие.

    Для первого релиза реализую минимальный базовый функционал: графику (OpenGL, Vulkan), окна и события. По возможностям аналог GLFW.

    С каждым следующим релизом буду добавлять: 2D-рендер, звук, шрифты и прочее.

    Лицензия и целевые платформы

    Лицензия меняется на LGPLv3.

    На старте поддерживаются Windows и Linux.

    Качество и инструменты

    При разработке использую:

    AddressSanitizer (ASan)

    UndefinedBehaviorSanitizer (UBSan)

    Различные анализаторы кода

    Я считаю, что такая стратегия полезнее, чем годами доводить библиотеку до версии 1.0 в офлайн-режиме.

    Примеры и бэкенды

    Добавлю десятки примеров с OpenGL 1.x, OpenGL 3.x и Vulkan.

    Буду добавлять бэкенды для LDL: не только под ОС, но и поверх других графических библиотек — SDL, SFML, GLFW и т.д.

    API остаётся единым для всех бэкендов.

    Это позволит сразу добавить поддержку звука и шрифтов (через бэкенды), а в нативных версиях реализовывать их позже.

    2D-рендер без границ

    Одной из главных задач LDL я вижу создание единого 2D-интерфейса, который стирает различия между поколениями графики.

    Вам не нужно думать о том, что находится в системе: современная видеокарта с Vulkan, старый ускоритель с OpenGL 1.2 или вообще только центральный процессор (Software Rendering).

    Единый интерфейс: Вы используете одни и те же команды для рисования пикселей, линий и спрайтов.

    Адаптивность: LDL сам выберет наиболее эффективный способ вывода изображения. На современной системе это будет аппаратное ускорение, а на «железе» без видеокарты оптимизированный программный растеризатор.

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

    Философия: Машина времени в вашем коде

    Зачем тратить силы на поддержку систем, которые многие считают «трупами»?

    1. Борьба с цифровым забвением

    Современный софт живет 3–5 лет. Мы выбрасываем железо не потому, что оно сломалось, а потому, что софт стал слишком тяжелым и ленивым. LDL — это протест против «запланированного устаревания». Я хочу, чтобы код, написанный сегодня, мог дышать в железе любой эпохи.

    2. Инженерный аскетизм

    Когда у тебя гигабайты памяти, ты перестаешь ценить каждый байт. Написание библиотеки под C89 для слабого железа — это духовная практика для программиста. Это возвращение к искусству находить изящные решения в условиях жестких ограничений. Каждый сэкономленный такт процессора — это дань уважения инженерам прошлого.

    3. Преемственность поколений

    Мы стоим на плечах гигантов, но часто забываем их имена. LDL сохраняет возможность для диалога между эпохами. Это инструмент, который позволяет современному разработчику почувствовать «металл» старых машин, не теряя связи с современными технологиями вроде Vulkan.

    Итог

    LDL — это Little Directmedia Layer. Он маленький не потому, что слабый, а потому, что в нем нет ничего лишнего. Это попытка создать код, который будет принадлежать не конкретной версии ОС, а истории программирования в целом.

    Один API. Один код. Тридцать лет компьютерной истории.
     
  14. Kristobal Hozevich Hunta Реликтовый гоминид

    Kristobal Hozevich Hunta

    Регистрация:
    24 апр 2006
    Сообщения:
    1.446
    Offtop
    "Славься, Джей!" (c) :worthy:
     
    Dar_Morar и Depressor нравится это.
  15. Strategus

    Strategus

    Регистрация:
    1 мар 2024
    Сообщения:
    195
    lodepng, как бы есть еще... Не stb единым жива загрузка пнг файлов ))
    Палитры я вытаскивал из пнг, примерно так:
    Код:
    // Проверяем наличие палитры
        if (state.info_png.color.palettesize > 0)
        {
            std::ofstream act_file(act_filename, std::ios::binary);
    
            size_t count = state.info_png.color.palettesize;
            unsigned char* p = state.info_png.color.palette;
    
            for (int i = 0; i < 256; i++)
            {
                if (i < count)
                {
                    // В PNG палитра RGBA, берем только RGB
                    act_file.put(p[i * 4 + 0]);
                    act_file.put(p[i * 4 + 1]);
                    act_file.put(p[i * 4 + 2]);
                }
                else
                    // Добиваем до 768 байт
                    act_file.put(0); act_file.put(0); act_file.put(0);
    
            }
            std::cout << "Done! Palette size: " << count << std::endl;
        }
    Единственный минус, там всегда палитра, как я понял содержит альфа канал, что для стариной графики избыточно...
     
  16. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    701
    Я проще поступлю.
    Встроена будет работа с bmp. Как в оригинальном LDL на С++.

    Только перепишу на С89. Кода сотни строк но полезно из коробки, что бы хоть какую-то картинку вывести.

    Над stb сделать LDL_Image подобное.

    Сейчас я переношу из С++ в С89 с переписыванием.

    Окна, события. Инициализация gl всех стандартов от 1.0 по 4.6

    Добавлю примеров, добавлю поддержку linux. Это первый релиз.
    --- добавлено 21 апр 2026, предыдущее сообщение размещено: 21 апр 2026 ---
    Можно встроить tiny варианты загрузки png и jpeg. Я встречал такие библиотеки на гитхабе, максимум 1000 строк на си.

    Взять переработать и встроить.
     
    Tigoro нравится это.
  17. Strategus

    Strategus

    Регистрация:
    1 мар 2024
    Сообщения:
    195
    Ну, а так бы получил еще и возможность сжимать произвольные данные, там можно отдельно вызывать функции для сжатия и разжатия... А бмп так себе формат же... Там конечно есть вариант RLE сжатия, но не думаю что хороший, иначе бы разрабы игр на протяжение пары десятилетий не стали бы делать свои РЛЕ велосипеды )) Не одной серьёзной игры не видел с bmp графикой, можно найти несколько 3д игр, где текстуры это по сути бмп файлы, слегка изменённые, но там они настолько малы, что это не критично....

    Мне кажется, но в линуксе забили на поддержку 4версии, у меня на свободном драйвере, есть Вулкан, но нет olg4 )) Тем более процентов 80 или больше функционала, можно подтянуть для версии 3.3 за счёт расширений...
     
  18. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    701
    Посмотрим, можно добавить в из коробки tga, pcx простой jpeg, png. Главное, что бы это не мешало портированию на другие системы.


    Я просто в библиотеку добавляю загрузчик всех gl функций + можно инициализировать определенную версию. Если на linux нет gl 4 и пользователь его запросил, то загрузчик выдаст ошибку, что не могу инициализировать такой то gl.
    Есть же системы на которых работает gl 4.
    --- добавлено 21 апр 2026, предыдущее сообщение размещено: 21 апр 2026 ---
    Пример получающегося C API


    Код:
    #include <LDL/LDL.h>
    #include <stdio.h>
    
    int main()
    {
        LDL_Result* result = LDL_ResultNew();
        LDL_Window* window;
    
        if (result)
        {
            window = LDL_WindowNew(result, LDL_GetVec2i(0, 0), LDL_GetVec2i(800, 600), "", 0);
    
            if (LDL_ResultIsOk(result))
            {
                LDL_Event event;
    
                while (LDL_WindowIsRunning(window))
                {
                    while (LDL_WindowGetEvent(window, &event))
                    {
                        if (event.Type == LDL_EventIsQuit)
                        {
                            LDL_WindowStopEvent(window);
                        }
                    }
                }
            }
            else
            {
                printf("LDL result error: %s\n", LDL_ResultGetMessage(result));
            }
    
            LDL_ResultFree(result);
            LDL_WindowFree(window);
        }
    
        return 0;
    }
     
    AndyFox нравится это.
  19. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    701
    Windows версия почти готова, первый GL квадрат. Сделаю порт под Linux и осталось сделать тесты и примеры.

    Для версии 0.1 вполне хватит Windows, Linux, Окна, события, графика на GL 1.0-4.6

    upload_2026-4-22_20-0-55.png

    Код:
    #include <stdio.h>
    #include <LDL/LDL.h>
    #include <LDL/OpenGL/GL1_2.h>
    #include <LDL/OpenGL/GLLoad.h>
    
    void Identity()
    {
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
    
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
    }
    
    void Display()
    {
        Identity();
    
        glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT);
    
        glBegin(GL_QUADS);
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex2f(-0.5f, -0.5f);
        glVertex2f(0.5f, -0.5f);
        glVertex2f(0.5f, 0.5f);
        glVertex2f(-0.5f, 0.5f);
        glEnd();
    }
    
    int main()
    {
        LDL_Result* result;
        LDL_Window* window;
        LDL_Event   event;
        LDL_OpenGLLoader* loader;
    
        result = LDL_ResultNew();
        window = LDL_WindowNew(result, LDL_GetVec2i(0, 0), LDL_GetVec2i(800, 600), "", 0);
    
        if (LDL_ResultIsOk(result))
        {
            loader = LDL_OpenGLLoaderNew(result, 1, 2);
    
            while (LDL_WindowIsRunning(window) && LDL_ResultIsOk(result))
            {
                while (LDL_WindowGetEvent(window, &event))
                {
                    if (event.Type == LDL_EventIsQuit || LDL_EventIsKeyPressed(&event, LDL_KeyEscape))
                    {
                        LDL_WindowStopEvent(window);
                    }
    
                    if (event.Type == LDL_EventIsResize)
                    {
                        glViewport(0, 0, (GLsizei)event.Resize.Width, (GLsizei)event.Resize.Height);
                    }
                }
    
                Display();
    
                LDL_WindowPresent(window);
            }
    
            LDL_ResultFree(result);
            LDL_WindowFree(window);
            LDL_OpenGLLoaderFree(loader);
        }
    
        if (LDL_ResultIsFail(result))
        {
            printf("LDL result error: %s\n", LDL_ResultGetMessage(result));
        }
    
        return 0;
    }
    
     
  20. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    701
    Прогресс.

    Добавил поддержку полного OpenGL.
    Можно писать на любой версии от 1.0 по 4.6 главное что бы была поддержка видеокартой.
    Провел рефакторинг почти всех файлов.
    Добавлена поддержка Windows 95 -Windows 11.
    Пока все работает на старом api.
    Следующий шаг это работа на современном Windows NT API.
    Добавил примеры с gl 1.2 попросил дипсик нагенерировать мне примеры на LDL. Таки справился:)
    На очереди примеры к gl 3 и 4.

    И ещё пока не закончен порт для Linux в процессе.

    В процессе тесты. Так же сейчас собираю код современным gcc со всеми возможными предупреждениями и анализаторами.
    --- добавлено 24 апр 2026, предыдущее сообщение размещено: 24 апр 2026 ---
    Теперь первый публичный релиз 0.1.0 реален.

    Нужно было сразу, так и делать. Мне понадобилось несколько лет, что бы это понять:(
    --- добавлено 24 апр 2026 ---
    Ещё проверил код проекта, с помощью ИИ. Оказалось, что я ещё тот рукожом в си:))

    Краши, утечки и т.д
    Все исправил. На мой взгляд, ИИ это минимально необходимый анализатор кода.
    --- добавлено 24 апр 2026 ---
    Тестирую код на совместимость используя msvc 2026, vc 6.0, gcc 15.

    Если собирать dll с помощью vc6. Размер библиотеки 80 кб.

    Понятно, что там нет, звука, шрифтов. Но зато есть загрузчик gl. То есть не нужно отдельно самому инициализировать gl функции. Нужно только задать версию и все. Библиотека сделает остальное.
     
    Чёрный Думер и AndyFox нравится это.
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление