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

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

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

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

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

  1. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    480
    Приветствую!

    Пишу фреймоврк для разработки софта или игр. Идею взял из библиотеки SDL, но пишу на С++.
    Главная идея это кроссплатформенность, производительность и поддержка старых и новых систем. Windows 95, 98, Me.

    Идея зародилась после написания статьи. Если критикуешь, предлагай, а предлагая делай.
    В софте все всрато и становится еще всратее

    В будущем планирую доработать под Linux.

    Сам проект. Лицензия boost.
    GitHub - JordanCpp/Lib-LDL

    В проекте есть тесты, но пока нет документации. Проект в зачаточном состоянии.

    У меня так же был пробный проект по написанию похожего функционала. В основном из данного проекта переношу код.
    GitHub - JordanCpp/Lt: Free cross-platform library.

    Что сделано:
    1. Библиотека статически линкуется к вашей программа.
    2. На данный момент, добавлен рендер с поддержкой OpenGL 1.2
    3. Библиотека умеет выводить только окно.

    Планы на будущее.
    1. Добавить минимальный функционал, поддержка вывода 2D графики.
    2. Поддержка текста FreeType.
    3. Перенос на Linux и другие не виндовс оси.
    4. Добавить поддержку Directx начиная с версии 5.0 по Directx 12
    5. Добавить поддержку современного OpenGL и Vulkan
    6. Добавить поддержку Android

    Мои желания по общей архитектуре:
    1. На сколько возможно, делать api и внутренний код простым.
    2. Максимальная производительность.
    3. Упростить работу с аллокаторами памяти.
    4. Создавать библиотеку общего назначения(графичесйи интерфей, звук и т.д)
    5. Сделать аналог Qt но на минималках.

    Буду раз замечаниям по коду. Предложениям по проекту. И общему обсуждению.

    По мере добавления функционала, буду обновлять первый пост.

    Огромный плюс данного сайта и форума, это наличие реального старого железа у пользователей. Я тестирую под 86box. Позже добавлю сборки под Windows 95 и выше, для тестирования библиотеки.
     
    Последнее редактирование: 27 окт 2022
  2.  
  3. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    480
    Одно из главных требований к библиотеки ставлю, отсутствие привязки от сторонних динамических библиотек. Все зависимости компилируются с библиотекой. Для этого в исходниках есть каталог dependencies.

    Для компиляции под Windows 95, 98, Me использую компилятор Mingw в сборке codeblocks-12.11. Присутствует поддержка С++ 11.

    Экспериментировал с поддержкой DirectX 3.0-8.1, такой функционал реально добавить. Вот пост
    Кодерский уголок
    --- добавлено 26 окт 2022, предыдущее сообщение размещено: 26 окт 2022 ---
    Есть желание написать промышленную библиотеку, а не просто поделку на коленке. Принимается техническая критика. Готов лопатить код, переделывать, обсуждать.
    --- добавлено 26 окт 2022 ---
    За пример взял, SDL и SFML. Смотрю как там реализовано и делаю по примеру. Но с некоторыми упрощениями.
    --- добавлено 26 окт 2022 ---
    Добавил функционал по загрузке и выводу изображений. Нужно ещё добавить поддержку изображений с альфой(прозрачностью) Для загрузки используется библиотека stb_image

    Обновил примеры.
    Lib-LDL/Examples/Graphics at master · JordanCpp/Lib-LDL

    Добавил следующие примеры:
    02_Color - Закрашивает окно
    03_Line - Выводит линии
    04_Rect - Выводит прямоугольник
    05_Image - Выводит изображение
    --- добавлено 26 окт 2022 ---
    Это пример загрузки и вывода изображения. Прокомментирую для наглядности.
    Lib-LDL/main.cpp at master · JordanCpp/Lib-LDL

    Код:
    #include <LDL/Graphics/Render.hpp>
    #include <LDL/Core/RuntimeError.hpp>
    #include <LDL/Loaders/ImageBufferLoader.hpp>
    #include <LDL/Allocators/FixedLinear.hpp>
    #include <iostream>
    
    int main()
    {
        try
        {
    //Создаем окно
            LDL::Graphics::Window window(LDL::Graphics::Point2u(0, 0), LDL::Graphics::Point2u(800, 600), "Window!");
    //Создаем рендер, передавая свойства окна
            LDL::Graphics::Render render(&window);
    //Событие
            LDL::Events::Event report;
    //Создаем линейный алокатор и выделяем 4мб
            LDL::Allocators::FixedLinear allocator(LDL::Allocators::Allocator::Mb * 4);
    //Создаем загрузчика изображений и передаем алокатор. Теперь при загрузке изображения, будет задействована патяь аллокатора 4 мб.
    //Данным загрузчиком можно загружать любое кол-во картинок.
    //Озу не будет выделяться, будет происходить очистка памяти и ее перезапись новыми данными.
            LDL::Loaders::ImageBufferLoader loader(&allocator);
    //Загружаем картинку по пути
            loader.Load("trehmachtovyiy-korabl-kartina-maslom-60x50_512x.jpg");
    //Создаем текстуру и передаем загруженные данные картинки
            LDL::Graphics::Image image(loader.Size(), loader.BytesPerPixel(), loader.Pixels());
    //Цикл приложения
            while (window.GetEvent(report))
            {
    //Обновлем цвет и очищаем экран
                render.Color(LDL::Graphics::Color(0, 162, 232));
                render.Clear();
    //Если пользователь нажал на выход из приложения, останавливаем события и выходим. Завершаем работу приложения
                if (report.Type == LDL::Events::IsQuit)
                {
                    window.StopEvent();
                }
    //Рисуем текстуру на экран
                render.Draw(&image, window.Pos(), window.Size());
    //Обновляем экран
                render.Present();
            }
        }
        catch (const LDL::Core::RuntimeError& error)
        {
            std::cout << error.what() << '\n';
        }
    
        return 0;
    }
    --- добавлено 26 окт 2022 ---
    Сложного и мудреного в коде ничего нет. Используется современный С++ и ООП. Байтоложество скрыто за абстракциями:)
    --- добавлено 26 окт 2022 ---
    На будущее, с помощью компилятора Watcom с поддержкой С++ 11, можно перенести фреймворк под дос. Естественно никакого аппаратного ускорения графики не будет, графику будет обрабатывать ЦПУ. Но желание сделать такой перенос есть. Экспериментировал с DosBox и Open Watcom.
     
    Последнее редактирование: 27 окт 2022
    Phantasm, longhorn_gnu, AxXxB и 4 другим нравится это.
  4. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    480
    Разделил графику на Cpu и Gpu функционал. Так как мне пока не понятно, как сделать единый интерфейс. Функционал не отличается, но отличается загрузка изображений и инициализация.
    --- добавлено 27 окт 2022, предыдущее сообщение размещено: 27 окт 2022 ---
    Обновил примеры, разделив на Cpu и Gpu. Добавил пример инициализации ЦПУ рендера.
    --- добавлено 27 окт 2022 ---
    Текущие планы:

    1. Сделать стандартный функционал для программирования 2D графики.
    2. Добавить классы связанные с управлением экрана, получение свойств, ограничение fps и т.д Вспомогательные классы.
    3. Для начала сделать поддержку DirectX9 и по примеру, добавлять более устаревшие версии.
    4. Перенести библиотеку на Linux. Особых сложностей не вижу.
    --- добавлено 27 окт 2022 ---
    Вот думаю как сделать функционал связанный с прозрачностью изображений.

    1. Вариант задавать цвет альфы при создании изображения. У каждого изображения может быть свой цвет прозрачности.
    2. При инициализации рендера, задавать цвет прозрачности. И тогда всем изображениям при отрисовке будет передаваться данный цвет.
    --- добавлено 27 окт 2022 ---
    Начал работу по поддержке DirectX.

    SDK DirectX беру из интернет архива, есть все версии Internet Archive Search: subject:"DirectX"
     
  5. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    480
    Добавил начальную поддержку DirectX 9. Подправил cmake.
    --- добавлено 28 окт 2022, предыдущее сообщение размещено: 28 окт 2022 ---
    Добавил в проект поддержку MinGW, пока костыльный вариант. Компиляция на bat файлах, но работает:)

    Скомпилировал примеры с поддержкой OpenGL 1.2 для Windows 9x версий. Протестируйте плиз, запускаются ли нативно примеры.

    Архив: Lib-LDL/Win9x.zip at master · JordanCpp/Lib-LDL

    Скачайте, распакуйте в любой каталог и запустите exe файлы.
    --- добавлено 28 окт 2022 ---
    Дело идёт, товарищи олд геймеры!
    --- добавлено 28 окт 2022 ---
    Позже добавлю счетчик fps.
     
    longhorn_gnu и AndyFox нравится это.
  6. Tigoro

    Tigoro

    Регистрация:
    4 фев 2010
    Сообщения:
    2.940
    Выхлоп терминала по вашим заявкам под wine:
    ~/downloads/Win9x$ wine 05_Gpu_Image.exe
    007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
    007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
    007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
    007c:fixme:hid:handle_IRP_MN_QUERY_ID Unhandled type 00000005
    0024:fixme:imm:ImeSetActiveContext (0001005E, 1): stub
    0024:fixme:imm:ImmReleaseContext (00030054, 0001005E): stub
    00a0:fixme:imm:ImeSetActiveContext (0000000000010026, 0): stub
    00a0:fixme:imm:ImmReleaseContext (0000000000010020, 0000000000010026): stub
    Width image <= 0
    Падает ничего не создавая, возможно, в моем случае.
    Если у вас тесты под виртуалкой показали норм, то на железе не должно быть проблем на данном этапе.

    Остальные запустились, отображая похожее - по названию файла.
    gpu_rect рисует в углу окна красный квадратик, если примерно так задумано, ну, хорошо.
     
    AndyFox нравится это.
  7. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    480
    Вывалился ексепшен при загрузке изображения. Помониторю код, возможно выставил ни все флаги компиляции для библиотеки stb_image.

    Да так и должно быть.

    Спасибо. Обновлю примеры и добавлю новые, со счетчиком fps.
     
    longhorn_gnu и AndyFox нравится это.
  8. Tigoro

    Tigoro

    Регистрация:
    4 фев 2010
    Сообщения:
    2.940
    Обращаю внимание - запуск под wine, возможно причина в этом.
     
    AndyFox нравится это.
  9. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    480
    Ошибка под Windows 95, при запуске примеров.

    upload_2022-10-28_22-18-18.png

    Нужно будет код инициализации окна погуглить. Возможно я его инициализирую используя новый апи.
    --- добавлено 28 окт 2022, предыдущее сообщение размещено: 28 окт 2022 ---
    Подправил код инициализации окна. Теперь версии Cpu работают Gpu выдают ошибку. В OpenGL я использую функцию SwapBuffers которая появилась в windows 2000 по докам майков. Нужно переписать OpenGL версию рендера.

    Архив тот же. Распакуйте и запустите Cpu версию примеров.

    Lib-LDL/Win9x.zip at master · JordanCpp/Lib-LDL
    --- добавлено 28 окт 2022 ---
    Под Windows 98 примеры с OpenGL работают. Не работает только один с выводом изображения. При запуске просто белое окно. Возможно для Windows 95 следует накатить доп пакет или обновление.
     
    AndyFox нравится это.
  10. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    480
    Подсмотрел обработку событий в SFML, буду делать подобное.

    Обзорная статья как это работает в SFML: 3.2 Обработка событий
     
    AndyFox нравится это.
  11. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    480
    По поддержке 2D графикb осталось допилить вывод изображений с альфой для gpu и cpu рендера.

    Продолжаю поиски в своем городе, старого ПК. Хотелось бы найти, что то в районе 300-500mhz процессор. Полно pentium 4 и athlon. Но они для моих задач современные:)
     
    AndyFox нравится это.
  12. Tigoro

    Tigoro

    Регистрация:
    4 фев 2010
    Сообщения:
    2.940
    "Под Windows 98 примеры с OpenGL работают. Не работает только один с выводом изображения. При запуске просто белое окно."
    под wine запускается (но часть окон ничем не отличаются при выводе), вариант с картинкой ищет отсутствующий именной jpg и на этом успокаивается.
     
    AndyFox нравится это.
  13. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    480
    Исправил ошибку в FixedAllocator использующийся для загрузки изображений в классе ImageBufferLoader. Т
    Добавил еще 2 примера, в прошлый раз забыл картинку положить в архив с примерами. Исправил.

    Lib-LDL/Win9x.zip at master · JordanCpp/Lib-LDL
     
    AndyFox нравится это.
  14. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    480
    Добавил в Gpu рендер возможность рисовать изображения из озу.

    Данная возможность нужна для того, что бы хранить изображения в оперативной памяти, не расходуя память видеокарты. Так раньше писали игры. Памяти у видеокарт было 2-4 мб, много тайлов, анимаций не впихнешь. Делали так : создавали одну текстуру под размер экрана и с помощью графического апи копировали на данную текстуру изображения из озу, после чего рисовали текстуру.
     
    AndyFox нравится это.
  15. Tigoro

    Tigoro

    Регистрация:
    4 фев 2010
    Сообщения:
    2.940
    Настоящим сообщаю что все примеры запускаются. Цифири тоже прыгают, 71-76 показывает.
     
    AndyFox нравится это.
  16. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    480
    Спасибо за содействие. Исправил счетчик fps.
     
    AndyFox нравится это.
  17. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    480
    В загрузчик изображений добавил поддержку цветового ключа. Это нужно для того, что бы в изображении указать какой цвет является прозрачным и отсекать при рисовании.

    Обновил примеры
    Lib-LDL/Win9x.zip at master · JordanCpp/Lib-LDL

    Вывод изображений на OpenGL в Windows 98 не работает. Пока не могу понять в чем дело.
     
    AndyFox нравится это.
  18. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    480
    Начал вводить поддержку векторных шрифтов с помощью библиотеки stb_truetype.
    --- добавлено 7 ноя 2022, предыдущее сообщение размещено: 7 ноя 2022 ---
    Пока разбираюсь с примерами и экспериментирую. Со временем добавлю опцию сборки с freetype.

    Работа с 2D графикой почти закончена. Есть минимальный api. Рисование линий, прямоугольников, вывод картинки с альфой.
     
    AndyFox нравится это.
  19. Bobbie

    Bobbie

    Регистрация:
    28 ноя 2016
    Сообщения:
    137
    @Jordan 63, есть небольшое замечание по коду в файле source/Platforms/Windows/Time/Ticks.cpp. GetTickCount имеет крайне низкую точность. Лучше использовать timeGetTime.

    Второе замечание касается ограничения FPS. Его лучше реализовывать через WaitForSingeObject, CreateEvent и timerSetEvent. При вашей текущей реализации не добиться одинакового поведения ограничителя в win9x и современными версиями, которые основаны на ядре NT.
    --- добавлено 7 ноя 2022, предыдущее сообщение размещено: 7 ноя 2022 ---
    @Jordan 63, так же не советую держать в репозитории куски DirectX Sdk. Репозиторий могут заблокировать за нарушение копирайта.
     
    AndyFox нравится это.
  20. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    480
    Ок. Будет свободное время поправлю код и заменю на данные методы.

    Об этом я не подумал.
     
    AndyFox нравится это.
  21. Tigoro

    Tigoro

    Регистрация:
    4 фев 2010
    Сообщения:
    2.940
    Ага, залезет бот микрософта новый код пожрать и продать, увидит свое имущество и настучит...
     
    AndyFox нравится это.
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление