Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 57

StmGL :) Или хотим изобрести велосипед

22.09.2016, 18:30. Показов 4248. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Имеем STM32F7 с интерфейсом LTDC. Все работает очень шикарно с базовой поддержкой 1024*768*24B цвета.
Хотим сделать некую либу - что-то вроде OpenGL. Со всеми вытекающими: смешивание цветов, отрисовка примитивов, текстурирование и т.п.
В голове рождается небольшая схема памяти:
2 экрана <--Буфер построения
Каждый элемент (то есть, линия, треугольник и т.п.) строится в отдельном маленьком буфере потом перегоняется в соответствующие координаты в буфер построения со смешиванием с тем, что уже лежит в буфере.

Теперь проблемы: цикл от 0 до 1024*768 проходит за 200мс.
Сразу в голову пришла мысль об использовании DMA. Все четко - работает моментально, НО как использовать DMA и смешивать с тем что уже лежит по адресу назначения...
С радостью готов выслушать любые мысли на тему. Спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.09.2016, 18:30
Ответы с готовыми решениями:

Доделайте мне задачу, пожалуйста - Постройте иерархию классов: товар, велосипед, горный велосипед, самокат
Я начал делать задачу с условиями: Постройте иерархию классов: товар, велосипед, горный велосипед, самокат Требования: 1....

движущийся велосипед или машина
напишите программу для турбо паскаль движущийся велосипед или машину,Uses Graph

Файловая система. Велосипед или существующая
Я посмотрел файловые системы FAT, и подумал что там есть ограничения которые в некоторых случаях могут принести дискомфорт, и я решил...

12
0 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 334
22.09.2016, 18:54
Раз есть LTDC, то должен быть и DMA2D.
0
0 / 0 / 0
Регистрация: 15.02.2015
Сообщений: 444
22.09.2016, 23:37
Зачем вам порт OpenGL, да еще в таком разрешении? STM32F7 конечно мощная линейка, но на 3D-графику её едва хватит.
0
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
23.09.2016, 00:41
Цитата Сообщение от xokiz
С радостью готов выслушать любые мысли на тему.
При активном желании сделать быструю графику без ущерба основному алгоритму, почти всегда единственный выход - это использовать отдельный конвейер графических команд, для каждого слоя свой собственный. С наличием приоритетов по слоям, перекрываемым активным зонам и так далее.

Тут общий смысл в том что обрабатывается окно по всем слоям начиная с самого нижнего, в случае когда изменений много - считается вся изменяемая площадь одного слоя, потом второго и так далее. В представлении st - слой это графика с альфа каналом, подложка есно rgb, выхлоп то-же rgb. После смешивания первого слоя с подложкой - получаем новую подложку в формате rgb, физически расположенную в тех-же адресах.

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

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

Понимаю что выглядит сложно, и даже страшно. Но в ином случае получаем дикий перерасход машинного времени, и муар на экране при смене графики. А в случае прямого рисования графики прямо из основного цикла - получаем, точнее теряем скорость работы основного алгоритма.
0
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 57
23.09.2016, 13:57
Цитата Сообщение от Riftistor
Раз есть LTDC, то должен быть и DMA2D.
Это есть, только вот сэкономить "памяти" пока не придумаю как.. имеется ввиду. Есть экран: 100*100px. Есть элемент 10*10px
Физически это дело хранится в одномерных массивах длиной 100*100 и 10*10 соответственно.
И вот не могу придумать как смешивать маленький элемент с большим... потому что DMA2D разложит весь элемент 10*10 в одну строку. Вариант в голове: смешивать по линиям. То есть, это цикл из 10 проходов и внутри 10 запусков DMA2D в нужном месте...
Или же под каждый элемент выделять слой равный размеру экрана... И по сути в нем будет 99% места не использоваться и будет требоваться только для быстрого смешивания.
0
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 57
23.09.2016, 14:01
Цитата Сообщение от OVY-srok
Понимаю что выглядит сложно, и даже страшно. Но в ином случае получаем дикий перерасход машинного времени, и муар на экране при смене графики. А в случае прямого рисования графики прямо из основного цикла - получаем, точнее теряем скорость работы основного алгоритма.
Да так-то идея понятна, единственное чего хочу понять - как можно сэкономить на памяти (см. сообщение выше). Ну а если прикрутить 512Мбит памяти (максимум для F7), то это получить всего 20 слоев 1024*768*32бит. Это крайне не экономно (как мне кажется должен быть какой-то более "правильный" инструмент).
0
0 / 0 / 0
Регистрация: 25.04.2016
Сообщений: 334
23.09.2016, 14:22
Цитата Сообщение от xokiz
Это есть, только вот сэкономить "памяти" пока не придумаю как.. имеется ввиду. Есть экран: 100*100px. Есть элемент 10*10px
Физически это дело хранится в одномерных массивах длиной 100*100 и 10*10 соответственно.
И вот не могу придумать как смешивать маленький элемент с большим... потому что DMA2D разложит весь элемент 10*10 в одну строку.
Перед тем, как что-то придумывать, неплохо бы открыть для начала главу про DMA2D и прочитать, что именно он умеет :)
0
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 57
23.09.2016, 16:46
Главу про dma2d пытаюсь найти :) только вот что-то толкового описания всех возможностей не найду...только примеры или готовые собранные библиотеки :(
0
0 / 0 / 0
Регистрация: 15.02.2015
Сообщений: 444
23.09.2016, 17:17
Вам нужен не даташит, а Reference Manual (#0385), страница 253.
0
0 / 0 / 0
Регистрация: 26.03.2015
Сообщений: 316
23.09.2016, 21:19
Цитата Сообщение от xokiz
Это крайне не экономно.
Отнють, это очень экономно и очень быстро.
Конвейер графических команд - исключительно для самих команд, он не содержит слои - но имеет команды для модификации каждого слоя.
В супер экономичном варианте, при использовании экранчика с параллельным интерфейсом, и достаточно свежим чипом - рисование происходит в ограниченной области экранчика. При этом два временных буфера могут быть меньше размеров экрана, но иметь размеры самого большого графического элемента, либо вовсе - динамически выделять память.
При обработке/изменении части экрана, на дисплей нужно подать команды ограничения видимой области, видимость - это для внешнего интерфейса, сам экран при этом не усохнет. Потом выделяем или ограничиваем имеющийся буфер. Первая команда из конвейера - копирует фон в эту память (цвет или картинку) - простым дма. Одновременно вторая команда рисует символ/графику с использованием прозрачности в отдельный буфер.
По завершении запускаем dma2d, с сохранением результатов в один из первичных буферов - теперь он считается подложкой. Как вариант - dma2d сразу пишет в экранную область жк экранчика.

В случае когда графика более сложная, подложка в выделенном участке экрана (буфере) - перерисовывается несколько раз.

Например ситуация:
1 подложка - потоковое видео от камеры, 2 первый слой - квадрат с прозрачностью определённого цвета под виртуальную кнопку, 3 второй слой - символ (буква/значёк) с неровными краями и использованием прозрачности, 4 третий слой - элемент управления с возможностью перекрытия (стрелка/перекрестье и так-далее) - это та графика которую рисуют в случае наложения.

Получаем три буфера под камеру - один приёмный, два для маштабирования в габариты экрана, один буфер под графический слой для LTDC, два мелких буфера под самый габаритный графический элемент. Обработка происходит исключительно в местах наличия изменившейся графики.
0
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 57
27.09.2016, 09:00
Да, reference manual все объяснил. И да, теперь смогу все элементы хранить по слоям и все в память влезает .
Камрады, спасибо.
0
0 / 0 / 0
Регистрация: 15.02.2015
Сообщений: 444
27.09.2016, 10:47
Пожалуйста. Обращайтесь если что. Или пишите о ходе работы, будет интересно почитать.
0
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 57
30.09.2016, 12:27
Сейчас нахожусь на стадии поиска алгоритмов для рисования гладких элементов (например линий).
Движок сейчас выполняет функции контроля памяти и смешивания элементов.
Пробовал на встроенном мониторе - без лагов смешиваются 90 слоев разных размеров. При частоте раз в 30мс.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.09.2016, 12:27
Помогаю со студенческими работами здесь

Мой Paint или изобретаем велосипед
Здравствуйте! Я пришёл сюда из другого довольно известного форума, активность на котором, к сожалению, спала и последние мои две темы так...

Надзиратель томагавков или что за велосипед я изобрел?
She's alive! Господа, в общем вдохновился я темой programina про статические поля класса и решил создать что-то похожее на сборщик...

Велосипед из костылей или две формы на одну таблицу
Всем категорическое здравствуйте! Знаю, что злоупотребляю вниманием уважаемой аудитории, но есть вопросик который мне кажется...

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

Создать классы: колесо, велосипед и автомобиль (иерархия или композиция)
Помогите решить задачу очень нужно: Создать классы: колесо, велосипед и автомобиль. Составить из них иерархию или композицию.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru