реклама на сайте
подробности

 
 
5 страниц V  « < 2 3 4 5 >  
Reply to this topicStart new topic
> Програмирование графики, вопрос
whale_nik
сообщение Sep 4 2016, 21:37
Сообщение #46


Местный
***

Группа: Участник
Сообщений: 364
Регистрация: 25-09-08
Пользователь №: 40 483



Никаких изменений, просто таймер отключил и все в цикле по кнопке.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 5 2016, 03:04
Сообщение #47


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(sigmaN @ Sep 5 2016, 00:14) *
Кто знает как по правильному реализовать гладкую анимацию(скроллинг)?

Только при помощи кадровой синхронизации. Если от видеокарты (или её низкоуровневого API) получите сигнал кадровой синхронизации, то сможете сделать.
Я в своё время находил такую опцию среди API DirectDraw, но уже точно не помню - или она не работала на моей карте или она там только в полноэкранном режиме работает.
Ну или должна быть какая-то функция в самом GDI API, которая копирует картинку в видеопамять синхронизируясь с кадровой развёрткой.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Sep 5 2016, 08:14
Сообщение #48


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Что-то мне подсказывает, что кадровая развертка тут не при чем.... В тех-же играх даже можно её включать и выключать(VSync или вертикальная синхронизация это обычно называется).
Отсутствие синхронизации с кадровой разверткой приводит к тирингу, я уже писал об этом https://en.wikipedia.org/wiki/Screen_tearing это то ладно, это другой вопрос.

Тут же задача состоит в том, чтобы просто гонять определенный кусок кода раз в 20миллисекунд например. И чтобы эти 20мс всегда были 20мс. Что, как мы понимаем, весьма затруднительно при точности таймера в плюс минус 15мс... Вот поэтому и нет плавности анимации.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
whale_nik
сообщение Sep 5 2016, 10:14
Сообщение #49


Местный
***

Группа: Участник
Сообщений: 364
Регистрация: 25-09-08
Пользователь №: 40 483



Похоже если надо плавнее и быстрее уже придется в видеокарту лезть.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Sep 5 2016, 10:46
Сообщение #50


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Глянул пару исходничков тут.. В том числе Quake 3 даже.
Похоже нормальные пацаны для измерения времени c миллисекундной точностью используют timeGetTime() вместо GetTickCount();
И таки в самом начале они разгоняют таймер использую timeBeginPeriod(1), что в том числе благотворно сказывается и на Sleep();

В общем вот усовершенствованная версия максимально плавной анимации, которую я смог достичь.
http://pastebin.com/gAQqdrJ0

Кстати по скорости тоже я впечатлен. Скроллинг удалось разогнать до 680FPS!

В принципе учитывая, что TCanvas даёт нам свой DC - можно то-же самое реализовать и в C++ Builder и в Delphi.
И даже в случае чего завернуть это в отдельный компонент, чтоб можно было эти графики ложить на форму. Я так когда-то самодельный DBGrid делал с нестандартной раскраской )
Прикрепленные файлы
Прикрепленный файл  Win32Project1_30FPS_Sleep___.zip ( 52.33 килобайт ) Кол-во скачиваний: 11
Прикрепленный файл  Win32Project1_maxFPS_.zip ( 52.33 килобайт ) Кол-во скачиваний: 9
 


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
DASM
сообщение Sep 5 2016, 10:49
Сообщение #51


Гуру
******

Группа: Свой
Сообщений: 3 644
Регистрация: 28-05-05
Пользователь №: 5 493



А чем вас DirectX кстати не устраивает? Ничего плавного и красивого на таймерах у вас не выйдет, не говоря уже про дурной стиль
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Sep 5 2016, 10:56
Сообщение #52


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



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

В принципе полученным результатом лично я сейчас доволен. И по скорости и по плавности. Для типичных задач типичного эмбэддера очень достойно. Нам то не игры тут писать )

Обратите внимание сколько 30FPS версия моего тестового образца жрет процессора. Красота же!

ADD:
очень интересные эффекты наблюдаются если плавно менять FPS. Используйте стрелки влево-вправо.
те кратность развертке очень важна! 60фпс лучше чем 70
на 40 вообще как-то странно все это выглядт....
Прикрепленные файлы
Прикрепленный файл  Win32Project1_tune_fps_.zip ( 52.41 килобайт ) Кол-во скачиваний: 15
 


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
whale_nik
сообщение Sep 5 2016, 13:24
Сообщение #53


Местный
***

Группа: Участник
Сообщений: 364
Регистрация: 25-09-08
Пользователь №: 40 483



Жалко что вы не в билдере пишете )
В принципе мне тоже хватит скорости.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Sep 5 2016, 17:42
Сообщение #54


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Адаптировать всё это для билдера пара пустяков.
Кстати для потоков там есть TThread, что в общем то позволит не лезть в API
Device Context у вас есть(TCanvas его даёт, как я уже гвоорил ранее). Немного пере компоновываете всё что я тут навоял и всё будет прекрасно работать!

Главный вывод моих экспериментов такой: BitBlt на экран нужно делать 60раз в сек(если конечно успевает проц). А саму отрисовку графики можно делать и с меньшей частотой, это не важно. Главное именно Blt в окно чтоб выполнялось 60fps. И тогда красота получается)

А билдер даже ставить не охота, систему засорять. Я в своё время вдоволь посидел на дэлфи, потом на билдере. Ну его нафиг, этот VCL!
Щас на Qt пересел и вам рекомендую! Раз уж всё равно осваивать почти с нуля, то ИМХО лучше сразу правильный фреймворк.
Кстати на Qt для быстрой прорисовки не приходится спускаться до самого Win API.
А если делать интерфейс на QML то и вовсе всё окно рендерится сразу в GL(прозрачно для программиста) позволяя делать всякие эффекты и приколы.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 6 2016, 05:18
Сообщение #55


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(sigmaN @ Sep 5 2016, 23:42) *
Главный вывод моих экспериментов такой: BitBlt на экран нужно делать 60раз в сек(если конечно успевает проц). А саму отрисовку графики можно делать и с меньшей частотой, это не важно. Главное именно Blt в окно чтоб выполнялось 60fps. И тогда красота получается)

И какой смысл? Перерисовывать 60раз/сек неизменяющуюся картинку?
Делать BitBlt из памяти на экран чаще чем частота обновления картинки - нет смысла. Видеопамять она не теряет предыдущую картинку, на то она и память.
Нарисовали картинку в памяти - копируете её BitBlt в видеоОЗУ. Можно даже параллельно (в другом thread) с отрисовкой новой картинки в памяти. Ещё лучше если сделать синхронизацию с кадровой развёрткой, для уменьшения всяких артефактов, типа дёрганья и искажения картинки из-за наложения частоты кадровой развёртки и частоты обновления картинки.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Sep 6 2016, 08:40
Сообщение #56


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Ну или ладно, можно не изменяющуюся не копировать(сделать флажок какой-то, что картинка изменилась), но выводящий на экран цикл всё равно должен крутиться с частотой 60Гц.

Кто бы сказал как нам в венде синхронизировать свой Thread с VSync - цены бы не было этому человеку!
Только я так понял, что даже в GL и DirectX VSync включается отправкой запроса драйверу типа: "давай я буду рисовать как хочу, а ты там синхронизируй всё это с VSync". И драйвер видяхи еще и имеет право не выполнять просьбу. Например в панели управления NVidia можно выключить VSync и всё ) Или наоборот включить принудительно.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 6 2016, 08:54
Сообщение #57


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(sigmaN @ Sep 6 2016, 14:40) *
но выводящий на экран цикл всё равно должен крутиться с частотой 60Гц.

Зачем?

Цитата(sigmaN @ Sep 6 2016, 14:40) *
Кто бы сказал как нам в венде синхронизировать свой Thread с VSync - цены бы не было этому человеку!
Только я так понял, что даже в GL и DirectX VSync включается отправкой запроса драйверу типа: "давай я буду рисовать как хочу, а ты там синхронизируй всё это с VSync". И драйвер видяхи еще и имеет право не выполнять просьбу. Например в панели управления NVidia можно выключить VSync и всё ) Или наоборот включить принудительно.

Там возможно другой механизм кадровой синхронизации есть. Например:
Двойная буферизация, с рисованием в теневой странице (в это время отображается другая страница). По завершении формирования картинки, рисующий алгоритм вызывает функцию - запрос переключения страниц. Но этот запрос выполнится только во время обратного хода луча и страницы поменяются местами. И с этого момента рисующему алгоритму должно прийти уведомление, что с этого момента его запрос выполнен и он может рисовать новый кадр в новой теневой странице.
Не знаю есть ли такой механизм, но такой вариант возможен.
С таким механизмом не будет случаев, когда часть картинки отобразилась в одном кадре (успела нарисоваться), а другая часть - в следующем.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Sep 6 2016, 09:12
Сообщение #58


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
Зачем?

Уж не знаю, эксперимент показал, что на 60Гц таки всё двигается плавнее. У меня Win10

Кстати я в своих экспериментах не видел тиринга. Терзают меня догадки, что GDI уже синхронизирован с VSync где-то внутри....
А вот именно синхронизировать поток с VSync это было бы полезно. Ну чтоб вместо Sleep() было что-нибудь типа WaitForVSync().


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
whale_nik
сообщение Sep 8 2016, 22:39
Сообщение #59


Местный
***

Группа: Участник
Сообщений: 364
Регистрация: 25-09-08
Пользователь №: 40 483



Подскажите еще допустим есть переменная 0-256, как вывести цвет точки так , чтобы при изменение переменной от 0 до 256 цвет менялся по спектру глаза те 0- фиолетовый, 128- желто-зеленый, 256- красный, долго думал пока не понял.
Цвет задается тремя цифрами (красный, зеленый синий ), но как их скомбинировать под эту задачу...

Те надо плавный спектр а не скажем (TColor)RGB(256-Col,128,Col); wink.gif

Те нужно знать весовые функции для каждого цвета в зависимости от переменной 0-256

Сообщение отредактировал whale_nik - Sep 8 2016, 23:10
Go to the top of the page
 
+Quote Post
alexr22b
сообщение Sep 9 2016, 03:17
Сообщение #60


Частый гость
**

Группа: Свой
Сообщений: 102
Регистрация: 11-10-04
Пользователь №: 849



Цитата(whale_nik @ Sep 9 2016, 02:39) *
Подскажите еще допустим есть переменная 0-256, как вывести цвет точки так , чтобы при изменение переменной от 0 до 256 цвет менялся по спектру глаза те 0- фиолетовый, 128- желто-зеленый, 256- красный, долго думал пока не понял.
Цвет задается тремя цифрами (красный, зеленый синий ), но как их скомбинировать под эту задачу...


http://stackoverflow.com/questions/7706339...jet-color-scale
Go to the top of the page
 
+Quote Post

5 страниц V  « < 2 3 4 5 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 02:31
Рейтинг@Mail.ru


Страница сгенерированна за 0.01506 секунд с 7
ELECTRONIX ©2004-2016