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
    Сообщения:
    535
    Напоминалка для меня. Перехожу к добавлению софт рендера + поддержка палитры. Важный момент, API едино для всех систем, поэтому поддержка палитры будет глобальной. И так же требуется поддерживать из коробки аппаратное ускорение графики, если это возможно.

    Общее описание.
    Класс LDL_Render отвечает за вывод и рисование графики.
    Класс LDL_Surface является абстракцией над куском памяти в виде пикселей в озу.
    Класс LDL_Texture абстракция над аппаратными текстурами.

    К примеру если библиотека собрана с аппаратным ускорением. Рисование линий и вывод текстур с помощью LDL_Texture, будет ускоряться видеокартой. LDL_Surface так и остается массивом пикселей в озу.

    Если библиотека собрана в софт режиме.
    LDL_Texture = LDL_Surface. Код остается прежним, но отсутсвует аппаратное ускорение.

    Как будет реализована поддержка палитры.

    LDL_Palette передается классу LDL_Render, по умолчанию она не установлена.
    При аппаратном ускорении, при загрузке текстуры, требуется передать палитру в LDL_Texture, в конструкторе класса будет создана текстура RGB на основе палитры и загружена в видеопамять. Так как современные видеокарты не поддерживают 8 битные изображения.

    Для софт рендера есть несколько путей. К примеру для DOS. LDL_Texture это 8 битный массив пикселей. LDL_Render содержитт буфер 8 битных пикселей. С момщью рендера все картинки копируются в буфер и потом, данный буфер копирутся в видео память.

    Для систем с родной поддержкой RGBA, буду делать следующее. Картинки так же могут поддерживать 8 битный цвет. Но LDL_Render содержит 2 буфера, для 24 битного и 8 битного цвета. Копирование LDL_Texture и LDL_Surface происходит в 8 битный буфер. Когда следует вывести буфер на экран. Данные с учетом палитры копируются из 8 битного в 24 битный с преобразованием в RGB и уже данный буфер выводится на экран.

    В итоге.
    1. Весь API для всех систем един.
    2. Добавляется поддержка 8 битных картинок.
    3. Аппаратное ускорение работает.
    4. В софт режиме копируются 8 битные данные вместо 24 битных, что ускоряет рендер.
    --- добавлено 16 фев 2024, предыдущее сообщение размещено: 16 фев 2024 ---
    Отсюда следует другой факт, что если вы пишите игру под DOS находясь в рамках библиотеки LDL. Игра соберется без изменения кода, под другие поддерживаемые платформы и ОС.

    Обратно это не работает. Если вы используете, RGBA цвет, длинные пути файлов, под DOS работать не будет. Или как вариант разделить ресурсы игры на палитровые и продублировать в RGB. Тогда будет возможность поддерживать несколько версий.

    В любом случае, это проще чем писать отдельные порты под конкретную ОС.
    --- добавлено 16 фев 2024 ---
    На данный момент ядро библиотеки LDL, абстрагирует от окон и событий ОС, умеет рисовать 2D графику.
    В будущем буду добавлять библиотеки расширения.
    LDL_Image - загрузка изображений разных форматов.
    LDL_Sound - загрузка аудио форматов.
    LDL_NetWork - продвинутая работа с сетью с подержкой протоколов.
    LDL_Ttf - Работа с ttf шрифтами (обертка над FreeType2)

    LDL_Image, LDL_Ttf почти готовы, просто переношу из старого проекта LDL.

    Важное пояснение, данные библиотеки не будут зависеть от LDL. Пример.

    LDL_Image содержит класс ImageLoader который загружает картинки. И результат его работы, это не класс LDL_Surface, а POD типы.

    Код:
    LDL_ImageLoader loader;
    loader.Load("img.png");
    
    LDL_Texture texture(loader.Size(), loader.Pixels(), loader.Bpp())
     
    Последнее редактирование: 16 фев 2024
    AndyFox нравится это.
  2. Tigoro AI General

    Tigoro

    Регистрация:
    4 фев 2010
    Сообщения:
    3.151
    @Jordan 63, debian 12, под virtualbox, "голая". Если нужны какие-то дополнительные библиотеки, значит нужно ставить.

    ./15_AudioPlay - звука не было
    X connection to :0 broken (explicit kill or server shutdown).

    ./Lesson10
    Ошибка сегментирования

    и викторгордан не работает - не помню что куда там скопировать нужно вроде бы, доп.файыл
     
  3. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    535
    Это предыдущая версия библиотеки.
    Вот текущая. Пока в отдельном репозитории. GitHub - JordanCpp/LDL_Proj
     
  4. Tigoro AI General

    Tigoro

    Регистрация:
    4 фев 2010
    Сообщения:
    3.151
    @Jordan 63,
    Arcanum запускается с черным окном и висит (согласно main.cpp)

    01window и 02render черное окно, разницы при загрузке нет
    03fps считает фпс в заголовке
    04clear синий фон и тоже счетчик
    05image перевернутая картинка
    065urf зеленый фон и счетчик в заголовке
    07move перевернутая картинка, можно перемещать
    С перевернутой картинкой в прошлый раз не то было задумано, не то ошибка была, которую исправили, не помню )

    01_ScreenColor - зеленый фон
    01_GL3_Triangle - статичный оранжевый треугольник, если окно распахнуть оказывается смещен в нижний левый угол, там отцентрирован.
    Визуально якобы на 0,5-1 градус задран правый нижний угол, но если сравнить с горизонтальной прямой (линия окна, например), то видно что это визуально, находится правильно

    TestAll - не понял что должно происходить, действия нет

    debian 12 под virtualbox с установленными драйверами
     
    Последнее редактирование: 17 фев 2024
  5. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    535
    Добавил поддержку палитры.

    Пример кода. Код для всех систем одинаков. К примеру я его просто перекомпилировал для DOS без изменений.

    Пример закрашивает экран и выводит красный квадрат. Для завершения порта под DOS, осталось добавить вывод примитивов, линия, круг. И добавить загрузку и вывод палитровых изображений. Сейчас поддерживатся только 24 и 32 битные изображения bmp из коробки.

    Код:
    #include <LDL/LDL.hpp>
    #include <stdio.h>
    
    void InitPalette(LDL_Palette& palette)
    {
      palette.Set(0, LDL_Color(0, 162, 232));
      palette.Set(1, LDL_Color(237, 28, 36));
    }
    
    int main()
    {
      LDL_Result result;
    
      LDL_Palette palette;
      InitPalette(palette);
    
      LDL_Window window(&result, LDL_Vec2i(0, 0), LDL_Vec2i(320, 200), "04Clear");
      LDL_Render render(&window, &palette);
    
      LDL_FpsCounter     fpsCounter;
      LDL_NumberToString convert;
    
      if (result.Ok())
      {
        LDL_Event report;
    
        while (window.Running())
        {
          fpsCounter.Start();
    
          while (window.GetEvent(report))
          {
            if (report.Type == LDL_Event::IsQuit)
            {
              window.StopEvent();
            }
          }
         
          render.Begin();
    
          render.SetColor(0);
          render.Clear();
    
          render.SetColor(1);
          render.Fill(LDL_Vec2i(5, 10), LDL_Vec2i(55, 75));
    
          render.End();
    
          if (fpsCounter.Calc())
          {
            window.Title(convert.Convert(fpsCounter.Fps()));
            fpsCounter.Clear();
          }
    
          window.PollEvents();
        }
      }
      else
      {
        printf("%s/n", result.Message());
      }
    
      return 0;
    }
    Так выглядит под Windows.
    ai.ibb.co_pwsC95K_1.png

    Так выглядит под DOS. DOS поддерживает RGB палитру, но на цвет досутпно только первые 6 бит. То есть вместо 24 битного пикселя, возможно отобразить 18 бит. Из за этого такой эффект.
    ai.ibb.co_SrkhyRh_2.png
    --- добавлено 19 фев 2024, предыдущее сообщение размещено: 19 фев 2024 ---
    Разрабатывая версию под DOS, можно минимальными усилиями получить версию под другие старые или современные системы.

    Но всегда есть нюансы. К примеру под dos доступно 2 разрешения 320x200 и 640x480

    Написав игру в рамках библиотеки. Игру можно собрать и она будет работать под современными ОС. Но разрешение экрана не поменяется. То есть в любом случае нужно будет дописать код указав разрешение окна больше, размеры gui адаптировать под новое разрешение экрана. Как вариант, могу добавить режим растягивания картинки. Если он указан, картинка растягивается на прозвольное разрешение экрана. Нужно продумать данный момент.
    --- добавлено 19 фев 2024 ---
    Напоминалка для себя.

    1. Добавить примитивы линия, круг, дуга.
    2. Добавить поддержку палитровых изображений.
    3. Загрузка 8 битных bmp из коробки.
    4. Добавить resize изображений в рендер, без поддержки аппаратного ускорения.
    --- добавлено 19 фев 2024 ---
    По итогу. Возможно разрабатывать под 16 и 32 битные процессоры под ms-dos. И главное, не требуется писать каждую версию игры или по под конкретную ОС. Библиотека занимает 25кб под dos.

    Есть планы по портированию на микроконтроллеры.
     
    Tigoro, Gamerun и Dar_Morar нравится это.
  6. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    535
    Добавил полную поддержку палитры во все рендеры.
    Добавляю поддержку альфа канала. Для каждой поверхности и текстуры, можно задать цвет прозрачности.
    К примеру в OpenGL, цветовой ключ и поддержка палитры отсутствует. Поэтому, при загрузке палитровых изображений, единожды конвертирую палитровое изображение, в rgb или rgba текстуру.
     
    Tigoro нравится это.
  7. Jordan 63

    Jordan 63

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

     
    rusty_dragon, Чёрный Думер и Gamerun нравится это.
  8. Чёрный Думер и все виды материала

    Чёрный Думер

    Регистрация:
    17 мар 2010
    Сообщения:
    2.434
    Потому что надо компоненты цвета на 2 бита вправо посдвигать (дописать >> 2). Вот где-то тут, видимо:
    LDL_Proj/source/Platform/DOS/SoftWin.cpp at e4b1fd3d36fb4b00db02490b01595553aa3e9d9e · JordanCpp/LDL_Proj
    Однако я не уверен, что выставлять палитру на каждом кадре - хорошая идея. Она-то не меняется, если пользователь явно не попросил.

    Для справки:
    VGA-палитра — Old-Games.RU Wiki
    VGA Palette - ModdingWiki
    What is the most accurate way to map 6-bit VGA palette to 8-bit?
     
  9. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    535
    Ок сделаю.

    Выше по коду проверка, заполнена ли палитра. Если нет, единожды заполняется. Палитра выставляется один раз.

    Спасибо, за инфу. Отличные ссылки.
     
    Чёрный Думер нравится это.
  10. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    535
    Заканчиваю с графикой. И добавлю больше примеров.
    Поддержки звука пока не будет из коробки.

    Но уже можно будет начать использовать библиотеку.

    И подготовлю несколько библиотек расширений, для загрузки изображений png, jpg и т. д

    Текущие поддерживаемые системы.
    Windows 95 и выше.
    Linux debian 3 и выше.
    Ms dos real mode 16 бит.
    Ms dos 32 бит, пока не тестировал. Но думаю проблем не должно быть.
     
    rusty_dragon, AndyFox, Gamerun и ещё 1-му нравится это.
  11. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    535
    Создал репозиторий для библиотеки LDL_Image. Библиоека сделана по аналогии с библиотекой расширения SDL_Image, но не имеет зависимостей от самой библиотеки LDL. Вы можете легко использовать в своем проекте используя единственный класс LDL_ImageLoader.

    Пример кода загрузки png

    Код:
    #include <LDL/LDL_Image.hpp>
    
    int main()
    {
      LDL_ImageLoader imageLoader;
    
      int width;
      int heigth;
      int bpp;
      unsigned char* pixels;
    
      if (imageLoader.Load("test.png"))
      {
       width  = imageLoader.Width();
       heigth = imageLoader.Heigth();
       bpp    = imageLoader.Bpp();
       pixels = imageLoader.Pixels();
      }
    
      return 0;
    }
     
    Gamerun и Tigoro нравится это.
  12. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    535
    Для релиза и публикации новости на новостных ресурсах Linux.org.ru, opennet. ru и habr осталось дописать поддержку 8 битной загрузки bmp и несколько примеров. В целом на текущем этапе минимальный функционал готов.
     
    Gamerun и Tigoro нравится это.
  13. rusty_dragon

    rusty_dragon

    Регистрация:
    17 ноя 2007
    Сообщения:
    6.275
    Для звука есть openal-soft, который покроет большое число систем.
     
    Чёрный Думер нравится это.
  14. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    535
    Я смотрел разные варианты. Остановился пока в будущей реализации на DirectSound первых версий, что бы было больше совместимости как со старым железом, так и с современным, так как современные directx, совместимы с ранними версиями. Для Linux возьму, что то изкоробочное, досутпное для всех дистров.

    openal-soft довольно жирная зависимость, для небольшого ядра LDL это избыточно.

    Сейчас ядро библиотеки LDL весит в сборке под DOS 40 кб. Для windows, linux в райне 100 кб.
     
    Последнее редактирование: 8 мар 2024
    Gamerun нравится это.
  15. rusty_dragon

    rusty_dragon

    Регистрация:
    17 ноя 2007
    Сообщения:
    6.275
    Т.е. openal-soft. Для простой 2D графики с одной музыкальной дорожкой и игр годятся легковесные решения как SDL Mixer. Но для серьёзных задач легковесного решения будет просто недостаточно. Из серьёзных решений есть ещё развиваемый с поддержкой Valve проект FAudio. Но при преимуществах подобия решениям под windows он накладывает свои ограничения. Почему в том же wine от openal-soft отказываться не собираются, как это сделали Valve в сборках Proton.

    Если хочется легковесности на данном этапе, возможно придётся сделать свой SDL_Mixer.
    --- добавлено 8 мар 2024, предыдущее сообщение размещено: 8 мар 2024 ---
    Ну и ещё openal-soft имеет широкую поддержку в разнообразных ОС. В т.ч. используется для разработки под Android.
    https://www.openal-soft.org/
     
    Последнее редактирование: 8 мар 2024
  16. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    535
    Я согласен. Идея всех мытарств, что бы создать минимальную кросплатформенную библиотеку обёртку для всех поддерживаемых и будущих портируемых платформ с единым API. Абстракции над окном, событиями ОС, базовой 2D графикой, звуком, загрузчиком dx, gl, vk из коробки. Остальные расширения и продвинутой графики с шейдерами, 3D звуком это отдельные библиотеки. Пока их нет, но очень надеюсь, что кому то из разработчиков идея понравится и они будут созданы по примеру библиотек расширяющих SDL.
    Я ратую за функциональную но небольшую базовую библиотеку LDL, для того, что бы было проще портировать на другие системы, ос, платформы, консоли, микроконтроллеры. Весь дополнительный функционал в библиотеки расширения. Думаю, что данный вектор развития более приемлем. Чем писать всё в одну библиотеку. Раннее я так и сделал, что затрудняло портирование под dos и другие старые платформы. Весь код ядра LDL, самописный, что и позволяет адаптировать, под всё.
    --- добавлено 8 мар 2024, предыдущее сообщение размещено: 8 мар 2024 ---
    Да придётся делать свой LDL_Mixer, можно и на базе openal-soft. Спасибо за идею, обязательно использую данную библиотеку. Главное время найти на разработку:)
    Технически получается, а вот заинтересовать других разработчиков, нет:(
    --- добавлено 8 мар 2024 ---
    План дорожная карта.
    LDL - базовая библиотека.
    LDL_Image загрузка графических форматов.
    LDL_Ttf вывод векторных шрифтов.
    LDL_Mixer загрузка форматов звука + контроль над аудио потоком
    LDL_Font Рисование растровых шрифтов, некий общий API с возможностью подгрузить свой растровый шрифт. Так как не на всвсе платформы реально портировать freetype. Некая альтернатива.
     
    Gamerun и rusty_dragon нравится это.
  17. Чёрный Думер и все виды материала

    Чёрный Думер

    Регистрация:
    17 мар 2010
    Сообщения:
    2.434
    Ещё очень желательно избавиться от второго репозитория, чтобы звёздочки капали, куда надо. :) Я выше писал, как.
    Невесело, конечно, но без общественного мнения в нашем нынешнем сегодня, увы, никуда.

    Дорогу осилит идущий. Ну и см. выше, да. Проектам, младше трёх-четырёх лет, вообще редко и мало кто доверяет сходу.

    А есть ли смысл так сильно распиливаться? Всё же отдельные библиотеки это отдельные накладные расходы. Не проще ли сделать одну библиотеку, но с opt-in?
     
    rusty_dragon нравится это.
  18. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    535
    Ага это обзательно сделаю. Звездочки важны.

    Потому и иду. Прям надеюсь на помощь, долго разработка идёт.

    Будет не удобно поставлять теже dll, so с разными вариантами сборки функционала. Главное преимущество, это минимальное ядро + каждую библиотеку можно разрабатывать отдельно и независимо.
    --- добавлено 8 мар 2024, предыдущее сообщение размещено: 8 мар 2024 ---
    Ещё как вариант, создать репозиторий с готовыми сборками всех доступных библиотек под множетсво систем и компиляторов. Разработка в своих репах, релизы в одной с сохранением истории.
    --- добавлено 8 мар 2024 ---
    @Чёрный Думер, если создать ветку, удалить файлы из нее и скопировть новые. Это колхоз?
     
    Gamerun нравится это.
  19. rusty_dragon

    rusty_dragon

    Регистрация:
    17 ноя 2007
    Сообщения:
    6.275
    Дело доброе, нужное и своевременное. Ну а с признанием сообществом и пониманием необходимости требуется время.

    Не получится, там лицензия несовместимая. Только линковать
    =====================
    Главная функция того же лора подрывная, чтобы не было сильного отечественного линукс-сообщества. Не стоит тамошнее мнение принимать всерьёз.
     
    Чёрный Думер нравится это.
  20. Jordan 63

    Jordan 63

    Регистрация:
    26 янв 2010
    Сообщения:
    535
    Я даже не о признании, а о заинтересованных программистов. Что бы пилить проект вместе, команда из более одного человека. :) Релизов больше, добавлять функционал и т. д Для меня большая помощь и просто собрать и запустить и отписаться, что всё ок или не ок.

    Эх жаль. Хорошая штука, но не свободная. Посмотрим, не одной библиотекой как говориться.
    --- добавлено 8 мар 2024, предыдущее сообщение размещено: 8 мар 2024 ---
    Проект переехал в изначальный репозиторий. Создал ветку main. Теперь вся активность будет вестись в данной ветке.
    --- добавлено 8 мар 2024 ---
    Сделал ветвь по умолчанию. И звездочки сохранил:)
     
    rusty_dragon нравится это.
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление