Вторник, 03 Декабря 2024, 21:57

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Пишу фреймворк LDL, аналог SDL но на С++ и с поддержкой стар
JordanCppДата: Вторник, 21 Ноября 2023, 08:42 | Сообщение # 1
был не раз
Сейчас нет на сайте
Тема перекочевала с дружественного сайта gamedev.ru

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

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

На данный момент фреймворк работает начиная с Windows 95 и Debian Linux 3.

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

Сатья о фреймворке на хабре. Немного устарела.

Сам проект. Лицензия boost. На гитхабе есть примеры и скриншоты.
GitHub - JordanCpp/Lib-LDL

Примеры кода.

Особенности проекта.

Поддержка старых систем 25+ лет.
Модульный дизайн.
Динамическая загрузка рендера при запуске приложения.
Весь код написан на С++ 98, для поддержки большего числа компиляторов и систем. Но разработчик, может использоать любой стандарт языка, хоть С++ 23. Ограничение есть лишь у меня как у разработчика фреймворка.
Высокоуровневый ООП API. Есть возможнось заюзать свои кастомные аллокаторы.
Поддержка старого железа 25+ лет.
Производительность.
Минимальная внешняя зависимость.
Проект собирается следующими компиляторами.
Windows: Visual C++ 6.0 и выше вплоть по MSVC 2022 (На нём под Windows и разрабатываю), OpenWatcom v2
Linux: gcc начиная с версии 3 и выше.

В проекте есть тесты, но пока нет документации.

Что сделано:
1. Статическая и динамическая линковка фреймворка.
2. Реазизована поддержка 2D API.
3. Реализована поддержка звука
4. Рендер OpenGL 1.2, OpenGL 3.3, Sowfware рендер.
5. Загрузка графических форматов png,bmp, tga, jpeg и т.д
6. Загрузка звуковых форматов mp3,wav, ogg, и т.д

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

Выступил на конференции по С++ 2023 с темой: Вперед в прошлое, или Разрабатываем фреймворк под Windows 95 в 2023 году

Видео по правилам конференции пока недоступно. Но доступны слайды.

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


Сообщение отредактировал JordanCpp - Вторник, 21 Ноября 2023, 08:49
KxarogДата: Вторник, 21 Ноября 2023, 18:34 | Сообщение # 2
участник
Сейчас нет на сайте
Я не спец в этой теме, но за Арканум готов простить почти что всё и поставить лайк, а также написать положительный отзыв.

Я вроде понял общую мысль и доводы. НО! Можно я выскажу свое мнение(ни в коем случае не хейт или недовольство, я же понимаю как для разрабов важны мотивация и хорошие комментарии, что бы не загубить всё на корню). Прочитав вашу статью меня немного удивляет ваше решение. Особенно когда вы в статье высказали те же мысли что пришли мне, а уж тем более когда я встретил похожее в комментариях. Если обобщить одним словом - проблема то не в софте, а в людях. Причем даже не всегда в людях, а в заданиях/обстоятельствах.
Грубо - программисту говорят допилить чужой код в сжатые сроки, у него нет выбора сделать хорошо или плохо.
Или такой момент. Допустим мы доживём до завершения вашего проекта, как вы(и остальные) думаете каковы шансы что это изменит ситуацию? Те же инди разрабы(и не только инди) слезут с того же юнити?
В комментариях уже кто-то сказал - тема поднимается не в первый раз и решение тоже не первое, но как бы сдвигов нету.
JordanCppДата: Среда, 22 Ноября 2023, 07:41 | Сообщение # 3
был не раз
Сейчас нет на сайте
Спасибо за отзыв.

Вы же понимаете, что я писал статьи с долей иронии и сарказма. Конечно многие вещи я гиперболизировал, но это больше подчеркивает явную проблему между всё растущими требованиями софта к железу. Я сам фулл стек разработчик, понимаю, вижу как я или используемые мной библиотеки во многом неоптимальны и т.д

Данным проектом я ещё хочу доказать, что не так уж и много требуется усилий для поддержки старого железа и обеспечения достаточной производительности. К примеру поддержка OpenGL 1.2 занимает 1000 строк, OpenGL 3.3 примерно столько же + код шейдеров, а взамен дает совместимость с десятилетиями железа.

Цитата Kxarog ()
Допустим мы доживём до завершения вашего проекта, как вы(и остальные) думаете каковы шансы что это изменит ситуацию? Те же инди разрабы(и не только инди) слезут с того же юнити?

Я не пилю игровой движок, делаю именно фреймворк как кроссплатформенную базу, для простой 2D графики, управлениями событиями ос. SDL но на С++ и с поддержкой в том числе и старых систем. Так же фреймворк инициализирует для разработчика, OpenGL от 1.0 по 4.6


Сообщение отредактировал JordanCpp - Среда, 22 Ноября 2023, 07:43
lvovandДата: Среда, 22 Ноября 2023, 09:58 | Сообщение # 4
старожил
Сейчас нет на сайте
Цитата JordanCpp ()
Данным проектом я ещё хочу доказать, что не так уж и много требуется усилий для поддержки старого железа и обеспечения достаточной производительности.

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


Разработка и продвижение сайтов. Дизайн
JordanCppДата: Среда, 22 Ноября 2023, 10:18 | Сообщение # 5
был не раз
Сейчас нет на сайте
Цитата lvovand ()
Но чтобы установить, нужно уже памяти побольше, ну и процессор поновее, а вместе с ним и материнку надо обновить, ну и места на диске надо побольше заодно. А если бы все и на старом работало, то резона обновлять железо поубавилось бы

Я согласен с вами. Мой проект поддерживает в том числе и очень старое железо и это его главная фича. Но если не брать системы 20+ лет, задача становится ещё проще по поддержке. Десятилетний ПК это современность, но уже на нём современные Windows и дефолтные Linux дистры уже начинают подлагивать и эта ситуация искусственная, библиотеки пожирнели, на старый код навесили ещё абстракций, запилили новые фичи не потратив время на их оптимизацию и т.д И конечно всё это зависит от экономики, если дешевле чик чик и в продакшн, так будет.

Начав работу над фреймворком, у меня был скепсис, я думал, что это не реально сделать один универсальный API для всех систем, но с каждой новой строчкой кода, после портирования под Linux очень старых годов к примеру тот же debian 3, я начал понимать, что оказывается это возможно. На практике проверил идею и она подтвердиась.

Мне ещё нравится тестировать производительность фреймворка на старом железе, сразу видны проблемы производительности.

Добавлено (22 Ноября 2023, 10:22)
---------------------------------------------
Я понимаю, что фреймворком под Windows 95 и старые версии Linux будут использовать пару человек в мире, один из которых я:) Но лучше когда есть такая возможность, чем ёё отсутствие. И поддержка всего этого зоопарка не так сложна, я не пишу движок, фреймворк лишь тонкая кроссплатформенная прослойка.

Очень важный момент, что API единое для всех новых и старых систем, не требуется как то иначе разрабатывать проект, что бы он завелся на большинстве старых систем и железяк.

Добавлено (22 Ноября 2023, 10:26)
---------------------------------------------
Я удивляюсь, как может тормозить графический интерфейс KDE, Gnome при аппаратном ускорении. Но у него получается:)

Добавлено (22 Ноября 2023, 10:48)
---------------------------------------------
И ещё один из моментов, у меня появился козырь в рукаве. Не просто рассуждение, что современный софт тормозит, а непосредственное практическое утверждение. Но я не первопроходец, те же кастомные дистры Linux запускающиеся и работающие на Pentium 2. Конечно я понимаю, что если сделать быструю ОС, программу, софт, игру, всё будет зависеть от браузера, современный веб всё равно отъест гигабайты данных и время ЦПУ.


Сообщение отредактировал JordanCpp - Среда, 22 Ноября 2023, 10:49
lvovandДата: Среда, 22 Ноября 2023, 11:06 | Сообщение # 6
старожил
Сейчас нет на сайте
Цитата JordanCpp ()
как может тормозить графический интерфейс KDE, Gnome при аппаратном ускорении.

Xfce уже даже не та легонькая система, что ранее летала на любом старичке


Разработка и продвижение сайтов. Дизайн
JordanCppДата: Среда, 22 Ноября 2023, 11:16 | Сообщение # 7
был не раз
Сейчас нет на сайте
Цитата lvovand ()
Xfce уже даже не та легонькая система, что ранее летала на любом старичке

Что только подтверждает правило.

Добавлено (22 Ноября 2023, 11:25)
---------------------------------------------
Странная ситуация, что графическое окружение требует те же ресурсы, что и игра Far Cry 1-2. В игре мне понятно, в ней миллионы треугольников в секунду на экране рисуются.


Сообщение отредактировал JordanCpp - Среда, 22 Ноября 2023, 11:25
Storm54Дата: Среда, 22 Ноября 2023, 13:32 | Сообщение # 8
постоянный участник
Сейчас нет на сайте
Круто, но большой вопрос: зачем поддерживать старые системы? У меня у самого стоит в кладовке старый пенек 97 года с Windows 98 SE и даже до сих пор прекрасно работает, но какой от него реальный толк помимо ностальгии?
Индустрия сформировалась таким образом, что намного дешевле, приятнее и быстрее обновить железо, нежели ковыряться в старом хламе. И это хорошо! Хорошо, что мы не бегаем по барахолкам, помойкам и прочим злополучным местам в поисках железа, как это было раньше.

Вопрос производительности никак не связан со "старостью" системы и решается иным образом - пишите мерж реквесты в существующие библиотеки, чтобы оптимизировать медленные компоненты. Но, если мы возьмем Core технологии, например SQL СУБД, графические API и т.п, то там и так все очень сильно оптимизированно, особенно в последних версиях, того же DirectX 12/Vulkan API, например. Что Вы там будете оптимизировать - непонятно. Мелкие либы и фреймворки - уже другой вопрос, они могут в угоду производительности давать фундаментальные преимуществе в виде разных абстракций.
JordanCppДата: Среда, 22 Ноября 2023, 14:03 | Сообщение # 9
был не раз
Сейчас нет на сайте
Цитата Storm54 ()
Круто, но большой вопрос: зачем поддерживать старые системы? У меня у самого стоит в кладовке старый пенек 97 года с Windows 98 SE и даже до сих пор прекрасно работает, но какой от него реальный толк помимо ностальгии?


Моё желание, мне нравится ковыраяться со старым железом, а теперь ещё и программировать под него:) И нас таких не так уж и мало: www.old-games.ru, Железные призраки прошлого, Старый дос.

Цитата Storm54 ()
Индустрия сформировалась таким образом, что намного дешевле, приятнее и быстрее обновить железо, нежели ковыряться в старом хламе. И это хорошо! Хорошо, что мы не бегаем по барахолкам, помойкам и прочим злополучным местам в поисках железа, как это было раньше.

Это замечательно, но в то же время и породила другой момент, связанный с быстрым устареванием, тормозящими играми, программами, с высокими требованиями не пропорциональные функционалу софта или игры.(Я в презентации в первом сообщении, как раз рассматривал данный вопрос).

Что тот функционал требующий минимум времени на старых ПК и до сих пор являющийся константной сложностью. Пример десктопного GUI, сейчас реализуется по аналогии: нужен комбайн, а что бы его использовать требуется ещё и кран:)

Цитата Storm54 ()
Вопрос производительности никак не связан со "старостью" системы и решается иным образом - пишите мерж реквесты в существующие библиотеки, чтобы оптимизировать медленные компоненты. Но, если мы возьмем Core технологии, например SQL СУБД, графические API и т.п, то там и так все очень сильно оптимизированно, особенно в последних версиях, того же DirectX 12/Vulkan API, например. Что Вы там будете оптимизировать - непонятно. Мелкие либы и фреймворки - уже другой вопрос, они могут в угоду производительности давать фундаментальные преимуществе в виде разных абстракций.

Всё верно. Старое железо может показать, где и какой неоптимальный вызов присутсвует в коде. Какой функционал занимает много времени ЦПУ. К примеру когда тестируешь фреймворк на Pentium 166 mhz, открываются просто бездны тормозящего кода, а так как я позиционирую фреймворк как кроссплатформенную прослойку, она должна быть максимально тонкой и работать быстро. Чисто практичный подход. А если не тормозит на Pentium 166, тестируем на Pentium 75 mhz и далее по аналогии.

Добавлено (22 Ноября 2023, 14:24)
---------------------------------------------
В коде нет ни одной строчки на ассемблере, но используются контейнеры STL, namespace, исключения. И всё это непотребство работает на Windws 95 с соответствующим железом. Я стараюсь писать простой и понятный и модульный код. Без жесткого хардкода. Присутствуют тесты.


Сообщение отредактировал JordanCpp - Среда, 22 Ноября 2023, 14:25
OscillographДата: Среда, 22 Ноября 2023, 15:09 | Сообщение # 10
был не раз
Сейчас нет на сайте
Цитата Storm54 ()
зачем поддерживать старые системы?

Вот сейчас досадно было)

Чтобы уважать пользователя, которому комфортно в любимом окружении :)


Сообщение отредактировал Oscillograph - Среда, 22 Ноября 2023, 15:25
qomyqoДата: Среда, 22 Ноября 2023, 16:29 | Сообщение # 11
был не раз
Сейчас нет на сайте
Цитата JordanCpp ()
но в то же время и породила другой момент, связанный с быстрым устареванием, тормозящими играми, программами, с высокими требованиями не пропорциональные функционалу софта или игры.

Не сказать что это большая проблема. При цене серверного процессора в 300 рублей и серверной ОЗУ 32гб за 2000 рублей на Алиэкспресс.

В любом случае Вы молодцы. Интересный проект.
JordanCppДата: Среда, 22 Ноября 2023, 16:49 | Сообщение # 12
был не раз
Сейчас нет на сайте
Цитата qomyqo ()
Не сказать что это большая проблема. При цене серверного процессора в 300 рублей и серверной ОЗУ 32гб за 2000 рублей на Алиэкспресс.

Сам факт того, что миллиарды инструкций исполняются напрасно, грея проц и увеличивая энтропию, огорчает. Или возможно, у меня просто проф деформация от 4-ых лет высоконагруженного веба на С++.
GC-VicДата: Четверг, 23 Ноября 2023, 01:43 | Сообщение # 13
GcUp.ru
Сейчас нет на сайте
Сложно будет потянуть такой проект - этой весьма академическая задача, написать аналог SDL.

Закон Мерфи: "Если вы уверены, что ваш поступок встретит всеобщее одобрение, кому-то он обязательно не понравится".
JordanCppДата: Четверг, 23 Ноября 2023, 12:50 | Сообщение # 14
был не раз
Сейчас нет на сайте
Цитата GC-Vic ()
Сложно будет потянуть такой проект - этой весьма академическая задача, написать аналог SDL.

Я это осознаю. И немало сделано.
Что готово.
События и работа с окном ОС.
Api для 2D графики.
Воспроизведение звука.
Api для работы с ttf текстом.
Интегрирован opengl 1.0-4.6 и его загрузчик.

Осталось доделать для первого выпуска.
Поточное воспроизведение звука.
Доделать вывод ttf текста.
Интегрировать сеть, буду делать на основе enet.

А возможно для первой версии ограничиться только минимальным функционалом графики. Остальное доделать в следующей версии.

Для фреймворка я храню все зависимости в проекте, это freetype, std_image, и header only библиотеки для чтения звуковых форматов, портировал библиотеку glu. Всё в исходниках.

Добавлено (02 Декабря 2023, 09:27)
---------------------------------------------
Опубликовал новость на Хабре о первом выпуске библиотеки LDL. Возможно это привлечёт новых разработчиков и будет содействовать известности библиотеки.

Добавлено (19 Декабря 2023, 12:52)
---------------------------------------------
Сделал некоторые обновления, последующие обновления буду делать в новогодние праздники.
И ещё раз предлагаю всем желающим присоединиться к проекту.

Добавил базовую поддержку 3dfx Glide
Добавил поддержку сборки для Borland C++ 6.0 и выше.
Добавляю поддержку d3d11

Теперь общий список поддерживаемых компиляторов. И библиотека не просто собирается, но и корректно работает. Код очень портабелен и уверен соберется и на других компиляторах.
1. GCC 3 и выше
2. MinGW 3 и выше
3. OpenWatcom V2 и выше
4. Visual C++ 6.0 и выше
5. Borland C++ 6.0 и выше

Как всё это работает:
Библиотека поддерживает 2D API под капотом в зависимости от выбранного рендера это API работает на OpenGL, Directx и теперь Glide.
Но так же есть доступ к нативному программированию графических API напрямую, OpenGL, DirectX. Glide. К примеру можно написать игру на Glide и запускать как на нативном железе, так и используя врапперы.
Для разработки и тестирования интеграции с Glide я использую dgVoodoo.

Можно используя Glide создать игру и воспользоваться библиотекой LDL для управлениями окнами и событиями ОС. Работать будет на Windows, Linux + на нативном железе. Вполне не плохо.
Linux версия немного отстаёт от Windows, до нового года подтяну.

Заинтересовался портированием под Android. Пока гуглю информацию, настраиваю Android студию.

Добавлено (19 Декабря 2023, 13:28)
---------------------------------------------
Пример кода на Glide. Заливаем экран зелёным цветом.

Код

#include <LDL/Core/RuntimeError.hpp>
#include <LDL/Graphics/Window.hpp>
#include <LDL/Graphics/Render.hpp>
#include <LDL/Enums/RenderMode.hpp>
#include <LDL/APIs/Glide/GlideLoader.hpp>

#include <iostream>

using namespace LDL::Glide;
using namespace LDL::Graphics;
using namespace LDL::Events;
using namespace LDL::Enums;
using namespace LDL::Core;
using namespace LDL::Math;

int main()
{
  try
  {
    GlideLoader glideLoader;
    RenderContext renderContext(RenderMode::Glide);
    Window window(&renderContext, Vec2u(0, 0), Vec2u(800, 600), "01_Glide_Line");

    Event report;
    FxU32 handle = (FxU32)window.NativeHandle();

    grGlideInit();
    grSstSelect(0);

    FxBool result = grSstWinOpen(handle, GR_RESOLUTION_800x600, GR_REFRESH_60Hz, GR_COLORFORMAT_RGBA, GR_ORIGIN_UPPER_LEFT, 2, 1);

    if (!result)
      throw RuntimeError("grSstWinOpen failed");

    grVertexLayout(GR_PARAM_XY, 0, GR_PARAM_ENABLE);
    grColorCombine(GR_COMBINE_FUNCTION_LOCAL, GR_COMBINE_FACTOR_NONE, GR_COMBINE_LOCAL_CONSTANT, GR_COMBINE_OTHER_NONE, FXFALSE);

    Color screenColor(34, 177, 76);

    while (window.Running())
    {
      grBufferClear(screenColor.toInt(), 0, 0);

      while (window.GetEvent(report))
      {
        if (report.Type == IsQuit)
        {
          window.StopEvent();
        }
      }

      grBufferSwap(1);

      window.PollEvents();
    }

    grGlideShutdown();
  }
  catch (const RuntimeError& error)
  {
    std::cout << error.what() << '\n';
  }

  return 0;
}


Сообщение отредактировал JordanCpp - Четверг, 23 Ноября 2023, 12:51
Storm54Дата: Среда, 20 Декабря 2023, 16:57 | Сообщение # 15
постоянный участник
Сейчас нет на сайте
JordanCpp, прикольно было бы на глайде пописать, я бы даже откопал старый пенек с вуду)
Abel399Дата: Воскресенье, 24 Декабря 2023, 02:01 | Сообщение # 16
Surpass your limits. Right now.
Сейчас нет на сайте
JordanCpp, я правильно понимаю, что графический API выбирается на этапе компиляции и нельзя сменить в рантайме? Или эта проблема уже исправлена?
Btw проект интересный, добавил в копилку для копания в праздники. Надеюсь, у вас получится добиться задуманного (✿◡‿◡)


Сообщение отредактировал Abel399 - Воскресенье, 24 Декабря 2023, 02:04
JordanCppДата: Воскресенье, 24 Декабря 2023, 08:30 | Сообщение # 17
был не раз
Сейчас нет на сайте
Цитата Abel399 ()
я правильно понимаю, что графический API выбирается на этапе компиляции и нельзя сменить в рантайме? Или эта проблема уже исправлена?


Да ситуация исправлена. Теперь есть возможность выбрать рендер при запуске приложения.

Цитата Abel399 ()
Btw проект интересный, добавил в копилку для копания в праздники. Надеюсь, у вас получится добиться задуманного (✿◡‿◡)

Спасибо за отзыв.
DmitriyIMДата: Понедельник, 25 Декабря 2023, 03:32 | Сообщение # 18
частый гость
Сейчас нет на сайте
Цитата JordanCpp ()
Данным проектом я ещё хочу доказать, что не так уж и много требуется усилий для поддержки старого железа и обеспечения достаточной производительности.


Неужели я дожил до этого дня, когда где-то могу прочитать такие строки? Не нашёл смайлик со слезами счастья для выражения эмоций, переделал грустный...

Цитата lvovand ()
помимо сложности, экономика роль начинает играть. Одно дело, когда выходит новый софт (операционка, игра, рабочий софт не суть), его красиво презентуют, показывают всевозможные преимущества и т.п. Но чтобы установить, нужно уже памяти побольше, ну и процессор поновее, а вместе с ним и материнку надо обновить, ну и места на диске надо побольше заодно. А если бы все и на старом работало, то резона обновлять железо поубавилось бы


Ага, только им как то абсолютно наплевать на то, что человек - это не машина, и со временем он привыкает к тому, чем пользуется, причём ещё так, что это становится частью его самого... Не зря же говорят, что привычка вторая натура?

Цитата JordanCpp ()
Конечно я понимаю, что если сделать быструю ОС, программу, софт, игру, всё будет зависеть от браузера, современный веб всё равно отъест гигабайты данных и время ЦПУ.


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

Сейчас писать что-то с нуля большинству просто лень, проще взять готовое, а какого оно будет качества не важно... Впрочем, это уже было написано выше, так что, желаю Вам, JordanCpp, удачи :) и пусть эти тру-программисты увидят, что при желании и должном стремлении, что-то выдающееся можно запустить даже на старом железе, и оно будет работать! А их поделкам нужна ещё одна порция оперативки и процессор поновей, и может быть тогда их код даст результат, а не просто подвесит систему, как в предыдущий раз...


Сообщение отредактировал DmitriyIM - Понедельник, 25 Декабря 2023, 03:35
JordanCppДата: Понедельник, 25 Декабря 2023, 13:01 | Сообщение # 19
был не раз
Сейчас нет на сайте
Цитата DmitriyIM ()
еужели я дожил до этого дня, когда где-то могу прочитать такие строки? Не нашёл смайлик со слезами счастья для выражения эмоций, переделал грустный...


Рад, что нахожу всё больше единомышленников.

Цитата DmitriyIM ()
Да, только веб сам по себе не существует, его реализуют программисты (если их так можно назвать), которые погрязли в абстракциях (в прочем, это касается не только веба), которые они готовы плодить тоннами, лишь бы только решить задачи из ТЗ...

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

Цитата DmitriyIM ()
А их поделкам нужна ещё одна порция оперативки и процессор поновей, и может быть тогда их код даст результат, а не просто подвесит систему, как в предыдущий раз


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

Добавлено (23 Февраля 2024, 08:20)
---------------------------------------------
Стало доступно видео доклада о библиотеке. Внимательно смотрите слайды, они доставляют:)



Сообщение отредактировал JordanCpp - Понедельник, 25 Декабря 2023, 13:02
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг