0 / 0 / 1
Регистрация: 12.01.2017
Сообщений: 104
|
||||||
1 | ||||||
Как сделать быструю графику?04.07.2020, 00:26. Показов 3191. Ответов 12
Метки нет (Все метки)
Пытаюсь собрать свою игру, и нужно быстро выводить на экран много картинок.
Вот пример кода:
Даже если не использовать CopyRect текстуры с масштабированием, на что, я думаю, всё же ресурсы нужны, а использовать простой графический примитив Rectangle() или Line() для вывода прямоугольника одного цвета -- ситуация не становится лучше. Видеокарта при этом не загружается вовсе, а вот процессор нагружается изрядно. Могу ли я повысить производительность этого алгоритма штатными средствами PascalABC.NET, без дополнительных библиотек? Могу ли я повысить производительность этого алгоритма с помощью дополнительных библиотек?
0
|
04.07.2020, 00:26 | |
Ответы с готовыми решениями:
12
Как сделать быструю сортировку? Как сделать быструю сортировку в деке? Как сделать быструю смену анимации? как сделать эту графику? |
2309 / 1420 / 516
Регистрация: 07.04.2017
Сообщений: 4,723
|
|
04.07.2020, 01:49 | 2 |
Потому что GDI, на котором основан GraphABC. GDI изначально задумывался только для простеньких окон с меню, обновляющимися раз в несколько сек.
А ещё GraphABC устарел. Используйте вместо него GraphWPF. Возможности примерно те же, но основано всё на WPF. Вообще, быстрее всего графика будет с чем то низкоуровневым типа OpenGL. Но с ним и код писать сложнее. --- Зачем вы явно объявляете тип? пишите просто var bar
0
|
0 / 0 / 1
Регистрация: 12.01.2017
Сообщений: 104
|
|
04.07.2020, 02:16 [ТС] | 3 |
Т.е. я пытался выводить сложную высокозатратную графику с помощью библиотеки рисования окошек для пользовательских приложений? Забавно.
А в чём тогда отличие, чем он лучше? Я слышал про SFML, но у меня не получилось нормально её запустить, да и я не уверен, что оно работает с чем-то низкоуровневым, мб это тоже библиотека для рисования окон? --- Сам не знаю, иногда явно объявляю, иногда нет.
0
|
2309 / 1420 / 516
Регистрация: 07.04.2017
Сообщений: 4,723
|
|
04.07.2020, 04:30 | 4 |
Сообщение было отмечено Kujivunia как решение
Решение
Тем что основан на WPF.
Ну а ещё он не устарел. То есть если вы найдёте в нём что то кривое - можно написать разработчикам и ожидать что это исправят. WPF тоже задумывался для рисования менюшек, но в отличии от GDI - в основные принципы не входило "для менюшек - и так сойдёт". На нём и 3D прекрасно идёт (есть модуль Graph3D ).Всё работает с чем то низкоуровневым. GDI, на самом деле, тоже использует GPU. Просто не для всего, для чего стоило бы. Вопрос только в том, как низкоуровневые библиотеки используются и сколько между ними и интерфейсом прокладок. Насчёт SFML - сам с ним не работал, но вроде обычно о нём хорошо отзываются. Ну, он, по крайней мере, явно лучше GDI. Хотя мне лично только что то низкоуровневое как OpenGL напрямую и подавай)
1
|
0 / 0 / 1
Регистрация: 12.01.2017
Сообщений: 104
|
||||||
04.07.2020, 13:25 [ТС] | 5 | |||||
Хорошо, попробую.
Но WPF гораздо сложнее и непонятнее. Вот мой список вопросов после первой пробы: 1) Что значит и как работает синтаксис
2) Как работать с изображениями, если graphWPF поддерживает только прямое рисование целой картинки из файла, насколько я понял? 3) Как подключить graph3D вместе с graphWPF , если вылезает "Ошибка времени выполнения: System.InvalidOperationException: Нельзя создать более одного экземпляра System.Windows.Application в одном AppDomain"? Или их не нужно подключать вместе, а для графики использовать graph3D, но для менюшек graphWPF? При этом, если подключить graph3D отдельно, то сразу начинает запускаться окно с просмотром непонятной 3д сцены. И в нём я тоже не нашёл, как работать с картинками. 4) Исходя из вопросов выше: а есть ли вообще способ воспроизвести алгоритм из шапки поста в graph3D/graphWPF ? 5) OpenGL хорошо работает с этим языком? Посоветуйте, что базово почитать про него, чтобы, опять же, можно было хотя бы воспроизвести алгоритм из шапки поста
0
|
2309 / 1420 / 516
Регистрация: 07.04.2017
Сообщений: 4,723
|
||||||||||||||||||||||||||
04.07.2020, 22:46 | 6 | |||||||||||||||||||||||||
Сообщение было отмечено Kujivunia как решение
Решение
1)
У разработчиков есть своя презентация: http://pascalabc.net/downloads... ambdas.pdf Но своё объяснение я тоже дам: Эта процедура принимает ссылку на другую процедуру в виде параметра. Эта запись примерно равноценна:
Action0 или ()->() лучше, потому что это встроенный тип делегата (ссылки на подпрограмму), в то время как d: procedure создаст новый тип.Если это не сразу интуитивно - integer->() это процедура принимающая integer . В то время как ()->integer это функция, ничего не принимающая и возвращающая integer . Если параметров несколько - добавляйте скобки и перечисляйте их типы через запятую.---
2. Лямбда это анонимная подпрограмма. Это значит что пространство имён (то что видно, к примеру, в Ctrl+пробел) - не забивается лишним именем. Обычно то что вы передаёте в Redraw - будет использовано только в 1 месте в программе, поэтому странно выделять ему своё имя.3. Лямбды могут захватывать локальные переменные:
Хотя лямбды - это сахар. То есть они превращаются в другой код при компиляции. А точнее:
Можно и так писать, но, опять же, п.1 и п.2 . Добавлено через 19 минут 2) В данный момент изображения кешируются при первом рисовании. То есть 1 раз читаются из файла и навсегда остаются в памяти (пока программа не завершится). ИМО в GraphABC с этим было лучше. Ну, можете сами и спросить разработчиков, почему всё ещё ничего лучше не сделали. У них свой форум для таких вопросов есть. Ну, в WPFObjects это уже нормально реализовано. 3) Таки не подключайте их вместе. GraphWPF , WPFObjects и Graph3D - не должны вместе использоваться. Хотя WPFObjects не упадёт если подключать вместе с GraphWPF . Но вполне возможно что они будут конфликтовать при попытках что то нарисовать.Координатную сетку можно отключить. Graph3D в основном используется как раз для создания и просмотра 3D сцен, поэтому она по дефолту - включена. Наверное, вы просто устали обыскав всё с GraphWPF Я сам точно не помню, но идея понятна - как и во всём низкоуровневом вроде OpenGL, чтобы нарисовать картинку в Graph3D - надо загрузить её как текстуру и наложить на какой то объект. Посмотрите в папку примеров. Там было наложение текстуры даже на шарики. На плоскость должно быть проще, наверное. 4) Честно - не знаю, не достаточно с ними работал чтоб в таком разбираться. Лучше, опять же, спрашивайте разработчиков, которые эти модули писали. Добавлено через 37 минут 5) Если начинать именно базово в OpenGL, а не с постройки космического корабля без понимания что такое F=ma - это пару недель чтения как минимум. Ну, я вас не отговариваю, сам считаю что это луший вариант, потому что он даст максимум возможной производительности и возможностей. Просто если решите таки использовать OpenGL - будьте готовы.--- Модуль OpenGL, который сейчас скачивается с последней версией паскаля - я сам делал. А в папке примеров есть .html файлы документации к ним.Ну, то документация к работе с модулям, документация по OpenGL - это вотъ эта жуть. Хотя, конечно, это как бетонная стена - большая, плотная и явно не пробиваемая с первой попытки. Сам пока модуль делал - несколько раз перепрочитал, чтоб хоть какой то минимум понять. Лучше начать с туториалов. А документацию использовать походу, для более точной инфы. Из того что могу по-быстрому найти - вот этот выглядит очень хорошо. Что касается минимального шаблона, что запустится в паскале - вообще с паскалем ставится пример программы. Но я только что понял, чтоб в папке примеров которая устанавливается с паскалем - не хватает файла шейдера (.glsl). А без него пример не запустится. В ближайшее время это исправится, но пока - берите версию этого примера из моего собственного репозитория. Там, кстати, всегда можно найти ещё и более новую версию модулей для OpenCL и OpenGL. Хотя это же значит что там эти модули менее протестированы.
1
|
15 / 13 / 3
Регистрация: 20.08.2017
Сообщений: 32
|
||||||
04.07.2020, 23:35 | 7 | |||||
В инсталляте (c:\PABCWork.NET) есть пример gr_MovingObjectsWPF.pas
Замените в нём функцию NewRandomABC на такую:
И укажите размеры изображения вместо 50 и 60 У меня скорость обновления при 1000 объектах - 120 кадров в секунду Не знаю, верно ли я понял, что вам нужно
2
|
0 / 0 / 1
Регистрация: 12.01.2017
Сообщений: 104
|
|
09.07.2020, 19:36 [ТС] | 8 |
В принципе, это хорошо, но всё равно, оно просто рисует картинку из файла. А мне нужно рисовать произвольную часть загруженной в память картинки.
0
|
257 / 149 / 70
Регистрация: 29.07.2018
Сообщений: 1,241
|
|
09.07.2020, 20:29 | 9 |
0
|
2309 / 1420 / 516
Регистрация: 07.04.2017
Сообщений: 4,723
|
|
09.07.2020, 21:36 | 10 |
Внимательно перечитайте. И не только последнее сообщение.
Ресурсы вообще не загружаются в память автоматически. Они живут на диске, как часть .exe файла, пока их явно не запросят.
0
|
257 / 149 / 70
Регистрация: 29.07.2018
Сообщений: 1,241
|
|
09.07.2020, 21:44 | 11 |
Sun Serega, А,понял.
0
|
15 / 13 / 3
Регистрация: 20.08.2017
Сообщений: 32
|
|
11.07.2020, 02:48 | 12 |
Да, тогда вам лучше использовать GraphABC. В GraphWPF мы не делали такой возможности как рисование части картинки
0
|
2309 / 1420 / 516
Регистрация: 07.04.2017
Сообщений: 4,723
|
|
11.07.2020, 03:41 | 13 |
С GraphABC начали, но у него не хватает производительности.
По моему из предложенных вариантов валидными остаются только: 1. OpenGL, который 100% будет работать, хоть это и сложный путь... 2. Высокоуровневые враперы, вроде SFML. Но с ними я уже не смогу помочь.
0
|
11.07.2020, 03:41 | |
11.07.2020, 03:41 | |
Помогаю со студенческими работами здесь
13
Как сделать примитивную графику.... Как сделать подпись к графику функции? Как сделать разметку на координатных осях по данному графику? Как оптимизировать быструю сортировку? Как вставить счетчик в быструю сортировку? Как реализовать быструю сортировку для структуры? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |