Как да избегнете трептене в графични чертежи с помощта на X11

Чертаем графика в прозорец. Актуализираме кривите на всеки 50 милисекунди със стойностите, получени от хардуер, например сензори. Трябва да покажем стойностите в графичен формат. Така че ние актуализираме графиката на всеки 50 ms. Това създава проблем с трептене. Пишем кода в X11. Има ли начин да се избегне трептенето в графичното чертане в X11. Благодаря предварително.


person VigneshK    schedule 18.02.2013    source източник
comment
библиотека с прозорци? Рисувате ли директно на екрана? Ако е така, защо не рисувате в буфер извън екрана? Един, който след това се изстрелва на екрана след завършване на изчертаването на кривите за текущия „прозорец“ от 50 ms.   -  person enhzflep    schedule 18.02.2013
comment
Благодарим ви за предложението, но вече рисуваме графиката с помощта на растерно изображение и след това копираме в прозореца, в този случай и прозорците трептят. Ние правим тази графика в дъщерен прозорец. Бяхме създали три дъщерни прозореца с един основен прозорец. рисуваме графики в дъщерен прозорец. Съмнявам се дали трябва да обработваме събития, но сега не използвахме никакви събития   -  person VigneshK    schedule 19.02.2013
comment
Отговорът е твърде дълъг за коментар – вижте добавения „отговор“   -  person enhzflep    schedule 19.02.2013


Отговори (2)


Ключовата дума тук е двойно буфериране. Но не знам дали x11 предлага това готово или трябва да го внедрите сами, така че ще оставя търсенето в Google за вас;)

Освен това може да помислите за по-рядко актуализиране. Може би е достатъчно да актуализирате с период от 250, 500 или 1000 ms? Това зависи от вашия случай на употреба, разбира се.

person SvenS    schedule 18.02.2013

Моля. Хм. Е, в такъв случай бих проверил настройките на X-Server за машините, които ще го изпълняват. Наскоро получих нова видеокарта и открих, че приложенията на openGL изпълняват по-голям брой кадри/секунда, но качеството е ужасно - имаше видимо "разкъсване" на изображението - постоянно можеше да се види комбинация от последния и текущи кадри по едно и също време. След като активирах изчакайте VSynch в настройките на XServer, проблемът изчезна. Обаче звучи по-скоро като проблем, който съм срещал под MS windows в миналото. В този конкретен случай, всеки път, когато изпращах ново изображение към контролата, windows преначертаваше фона на прозореца/диалоговия прозорец, който беше под прозореца на изображението. Така че, вместо просто да замени старото изображение, то ще изтрие изображението до стандартно сиво, преди да продължи да заменя изображението (grrr). Ако имате достъп до достатъчно бърз софтуер за запис на екрана, можете да записвате видео на приложението, докато работи, след което да възпроизвеждате видеото кадър по кадър. Като алтернатива може да получите известно сцепление, ако търсите „деактивиране на преначертаване/изтриване на фона на прозорец X11“ или нещо подобно. :)

Предполагам, че ще зависи и от това дали сте използвали или не Gtk+, wxWidgets или просто суров X11 код.

person enhzflep    schedule 19.02.2013
comment
Използваме суров X11 код. Използваме XCopyArea за рисуване на пикселната карта към прозореца. Трябва ли да използваме командата XSync в кода? където трябва да направим това. - person VigneshK; 19.02.2013
comment
Четейки от страницата на ръководството на XCopyArea, отбелязвам с особен интерес текста Ако регионите на изходния правоъгълник са затъмнени и не са били запазени в резервното хранилище или ако са посочени региони извън границите на източника, който може да бъде изчертан, тези региони не са копиран. Вместо това се случва следното във всички съответни целеви региони, които са или видими, или се запазват в резервното хранилище. Ако дестинацията е прозорец с фон, различен от „Няма“, съответните региони на дестинацията са подредени с този фон – бих проверил фона на прозореца на дестинацията. - person enhzflep; 19.02.2013
comment
Благодаря ви за отговора. Използваме XCopyArea с правилен регион. В нашия код не сме задали фон като никакъв. Опитах се да задам XSetBackgroundPixmap на none, но не получих правилния резултат, вместо това целият прозорец е боядисан с цвета на преден план - person VigneshK; 19.02.2013
comment
Добре дошли сте. (съжалявам, забравих да го кажа и последния път) Наистина изобщо не съм запознат с X11, така че се страхувам, че сега нямам предложения, съжалявам. :( Маркирах въпроса и ще проверя отново, ако имам още идеи. :) - person enhzflep; 19.02.2013