Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/43: Рейтинг темы: голосов - 43, средняя оценка - 4.77
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335

Двойная буферизация

28.01.2013, 22:01. Показов 8813. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно, не работает ни при DoubleBuffered = true;, ни при SetStyle(ControlStyles.OptimizedDoubleBu ffer, true);.. Форма состоит из одного окна без управляющих элементов. На форме стоит таймер на 25мс. При каждом тике вызывает рисования.
Я так понимаю, как-то нужно отрубить заливку формы, но как? :/ В интернете сколько ни читаю, всем либо SetStyle(), либо DoubleBuffered помог, ибо они и сами ERASEBKGRND убивают..
Что мне скинуть, чтобы больше инфы было? :\

Добавлено через 2 часа 56 минут
Дело в том, что у меня стоит
C#
1
2
 Graphics g; 
g.Clear(Color.White);
Конечно, если её убрать, мерцания исчезнут, но и отчиски экрана не будет..

Добавлено через 11 часов 11 минут
up-to-date. Так и не смог решить проблему.. :/
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.01.2013, 22:01
Ответы с готовыми решениями:

Двойная буферизация в GDI+
Я написал простое тестовое приложение - в нём за мышью движется мяч. Но на экране появлялось мерцание. Я сделал двойную буферизацию, но...

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

Двойная буферизация.
подскажите, что я делаю не так. protected override void OnPaint(PaintEventArgs e) { // Graphics g =...

13
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.01.2013, 22:36
Весь код отрисовки предоставьте и то как вызываете перерисовку.
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
28.01.2013, 22:58  [ТС]
В конструкторе формы следующее :
C#
1
2
3
4
5
6
 brush = Brushes.MediumPurple;
            pen = new Pen(Color.Yellow, 5);
InitializeComponent();
            graphics = CreateGraphics();
 
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
На форме при помощи конструктора закинул таймер, который вызывает функцию рисования, в которой :
C#
1
2
3
4
5
graphics.Clear(Color.White);
           for (int i = 0; i < circles.Count(); ++i)
           {
               circles[i].Draw(graphics, pen, brush);
           }
Функция Circle.Draw :
C#
1
2
3
4
5
6
public void Draw(Graphics graphics, Pen pen, Brush brush)
        {
            GenerateRectangle(); // Создает прямоугольник на основе центра и радиуса и пихает его в rectangle
            graphics.DrawEllipse(pen, rectangle);
            graphics.FillEllipse(brush, rectangle);
        }
Переменные объектов - открытые поля в классе формы :
C#
1
2
3
public Pen pen, penPausedCircle, penPausedVector;
        public Brush brush;
        public Graphics graphics;
Больше с графикой нигде не работаю.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
28.01.2013, 23:06
Цитата Сообщение от nexen Посмотреть сообщение
graphics = CreateGraphics();
Самая главная ошибка, Вы рисуете на устаревшей поверхности.
Рисуйте в методе Paint нужного компонента/формы, при вызове события Paint передается актуальный дескриптор поверхности на которой можно рисовать (e.Graphics), его и используйте.

Добавлено через 2 минуты
Примеры подобных Вашей проблем:
Мерцание формы при перерисовке
Как убрать моргание при реализации анимации?
Следы от эллипса на форме при его движении (как здесь поможет многопоточность?)
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
28.01.2013, 23:53  [ТС]
Дело в том, что при нажатии на определенную клавишу у меня вызывается функция Draw, куда параметром идет graphics. Когда он был полем, всё было просто, но теперь graphics - часть аргумента в методе, вызываемом при событии. Ну ладно, я воспользовался тем, что это нажатие "замораживает" время, посему в метод передал CreateGraphics(), однако, сразу после того, как метод отрисовал то, что нужно, вызвается метод события Paint, а перед этим Invalidate().. Как с этим быть, ума не приложу, как и не пойму, почему они неявно вызываются : |
Что нужно : при нажатии клавишы вызвать метод :
C#
1
circles[i].Draw(CreateGraphics(), pen);
, чтобы после него не вызвался Invalidate() и Paint-event.
p.s Добавил invalidate по таймеру, прикрепил к event'у Paint функцию с отрисовкой всех крушляшек.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
29.01.2013, 00:05
Проект можете прикрепить?
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
29.01.2013, 17:31  [ТС]
SSTREGG, всё-таки остановился на том, что добавлю доп. boolean-переменную в Paint-делегат. Спасибо, вопрос снят.

Добавлено через 2 часа 38 минут
Тот подход, который вы описали с использованием Paint-события сработал у меня, но когда я скинул release-exe другу, у него мерцания были.. Как? У меня совсем никаких догадок, почему у меня есть, а у него нет.

Добавлено через 6 часов 22 минуты
up-to-date
Как это возможно?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
29.01.2013, 19:47
Цитата Сообщение от SSTREGG Посмотреть сообщение
Проект можете прикрепить?
....
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
29.01.2013, 20:00  [ТС]
S-Sharp_Programs.rar
Если будете запускать (вдруг у вас тоже мерцания будут), то кликните на h.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
29.01.2013, 22:51
Запустил 15 шаров, мерцания не заметил, но контуры конечно при такой скорости довольно сложно различить, они летают как сумасшедшие поэтому кажется что шары размытые.
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
29.01.2013, 22:54  [ТС]
Таки нет, у друга именно мерцания были :< Попробуйте шарикам скорости убивать или рандомизировать скорость, тогда она будет не слишком большой (на s)
Я так понимаю, у вас тоже нет идей по этому поводу (почему при стиле DoubleBufferingOptimize у одного есть, у другого нет)?
p.s Если вдруг знаете что-нибудь по поводу коллизий, то, пожалуйста, не могли бы вы прочитать https://www.cyberforum.ru/grap... ost4068192 ? Вдруг вы знаете то, что мне поможет..
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
29.01.2013, 23:08
Цитата Сообщение от nexen Посмотреть сообщение
Таки нет, у друга именно мерцания были
Без понятия, можно конечно попробовать на железо свалить, но у меня на 2х виртуалках (Win8 x86 и Win7 x86, одновременно запущенные, 2 ядра выделено каждой и по 4 (2 для Win7) гига памяти) с 15 шарами никаких мерцаний не было, на S нажимал (мануал прочитал).
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
30.01.2013, 08:38  [ТС]
SSTREGG, хорошо, спасибо.
0
0 / 0 / 0
Регистрация: 17.03.2023
Сообщений: 2
24.05.2023, 21:33
запускал 200 шаров.
на S нажимал
рабоает прекрасно.
Только тяжело уследить за каким-то конкретным шаром.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.05.2023, 21:33
Помогаю со студенческими работами здесь

двойная буферизация
Здравствуйте! У меня есть объект Panel с именем infoPanel, рисую я в нём так: private void infoPanel_Paint(object sender,...

Двойная буффиризация
Доброго времени суток, помогите решить проблему с мерцанием формы проблему видно на видео: qFhzuTFuVZI Так же ссылка на видео:...

BindingSource двойная связь
Здравствуйте. Можно ли через BindingSource сделать так называемую двойную связь чтобы можно было не только изменять через list&lt;&gt; но и...

Двойная оброботка двойного нажатия
Есть panel при двойном щелчке панел разворачивается на весь экран, хочу что бы при повторном двойном клике окно панели принимала исходный...

Двойная буферизация на С++
Можно её реализовать для консоли, а то больно уж сильно экран мигает. Если можно то подскажите как или линки дайте. Заранее спасибо


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru