Здравствуйте, Pavel Dvorkin, Вы писали:
I>>Интересный аргумент — в байте 8 бит и поэтому вложенность 5 и всякие константы это нормально
PD>Во-первых, не 5, а все же 4.
5 = if + 4 for
В своем же коде не можешь вложенность посчитать А еще рассказываешь какие нынче плохие программисты.
>Во-вторых, это тест (стану я сюда что-то иное постить!). В третьих, в байте 8 бит, а окно это под байт
Для теста еще сгодится. А с байтом всетаки не ясно " 400 + j*9+b, 200 + i*9+a"
А>>Мерцания прекратились но всё ещё заметно как линии не успевают за курсором. в windows explorerе или любом графическом редакторе так сильно не отстают. S>Открыл Paint, там резиновая R2Not рамка, как Павел советует. И отстает от курсора, но меньше. И моргает. S>Открыл Paint.NET, там рамка с затемнением. Не моргает, но отстает от курсора сильнее.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, samius, Вы писали:
S>>Открыл Paint, там резиновая R2Not рамка, как Павел советует. И отстает от курсора, но меньше. И моргает. S>>Открыл Paint.NET, там рамка с затемнением. Не моргает, но отстает от курсора сильнее.
PD>Вот здесь
PD>http://files.rsdn.ru/187/BLOKOUT2.C
PD>пример из Петцольда. Если можешь, попробуй его и скажи, мигает или нет и как насчет отставания курсора
Скомпилил в best-optimization на GCC, запустил.
Мигает безбожно. Курсор отстает. Менее заметно, чем в Paint.NET, но не меньше чем в MS Paint. При быстром движении курсора легко отстает пикселов на 10-15. Машина не новая, но и не тормоз. C2D E6600 Win7.
PD>Компилировать без Unicode. 1995 год, однако
PD>P.S. В примере ошибка — неправильно берутся координаты при выходе курсора влево от окна или выше. Исправляется элементарно.
Оно мне надо? Своих хватает.
Здравствуйте, samius, Вы писали:
PD>>пример из Петцольда. Если можешь, попробуй его и скажи, мигает или нет и как насчет отставания курсора S>Скомпилил в best-optimization на GCC, запустил. S>Мигает безбожно. Курсор отстает. Менее заметно, чем в Paint.NET, но не меньше чем в MS Paint. При быстром движении курсора легко отстает пикселов на 10-15. Машина не новая, но и не тормоз. C2D E6600 Win7.
Любопытно.
На моей машине Phenom 955 / GeForce 9600 тоже мигает безбожно, более того, линии не всегда прорисовываются, так что иногда вместо видно только 3 стороны (конечно, тут же исправится, но заметно) А вот на работе старенький Athlon 4200/ GeForce 6150, что у нас в учебном классе стоит, не мигает, не отстает и вообще ведет себя замечательно.
Надо будет поисследовать.
Здравствуйте, Ikemefula, Вы писали:
I>В OnMouseMove ничего рисовать нельзя, иначе мерцание побороть не удастся. OnMouseMove должен устанвливать флаг обновления.
А можно поподробнее, какие проблемы с рисованием в OnMouse... ? Если AllPaintingInWmPaint, чем плохо в мышином обработчике делать синхронный Refresh() (или Invalidate+Update), вместо отложенного Invalidate ?
Хотя если ты имел ввиду в мышином обработчике this.CreateGraphics() , то понятно.
Для вызовов из OnMouseMove, Update (а из него OnPaint) — с этим противопоказаний нет?
Здравствуйте, Silver_S, Вы писали:
I>>В OnMouseMove ничего рисовать нельзя, иначе мерцание побороть не удастся. OnMouseMove должен устанвливать флаг обновления.
S_S> А можно поподробнее, какие проблемы с рисованием в OnMouse... ? Если AllPaintingInWmPaint, чем плохо в мышином обработчике делать синхронный Refresh()
(или Invalidate+Update), вместо отложенного Invalidate ?
Refresh это очень дорогое удовольствое, т.к. перерисовыват всю клиентскую область и все дочерние контролы. Update тоже недалеко ушел — это принудительный вызов OnPaint. В треде выше предлагалось вызывать не Update а рисовать прямо на экран. Во это и есть проблема.
Можно словить кое какие артефакты. Например Graphics, созданый явно руками, по мелочевке все равно отличается от того, что придет в OnPaint. Вроде все доступные проперти одинковые, а в отрисовке есть небольшая разница и это сильно раздражает. Ну и мерцание это отдельнй вопрос. Полностью подавить его можно только отрисовывая в битмап который в свою очередь нужно рисовать в OnPaint.
Кроме того, разделяя логику поведения и отрисовки код упрощается до безобразия. Но это конечно если ты понимаешь такие концепции как MVC
Здравствуйте, Silver_S, Вы писали:
S_S>Хотя если ты имел ввиду в мышином обработчике this.CreateGraphics() , то понятно. S_S>Для вызовов из OnMouseMove, Update (а из него OnPaint) — с этим противопоказаний нет?
Есть, это будет как минимум лишнее или же просядет перформанс. Напримерй в свей проге я такое просто не могу себе позволить
Не ясно, зачем тебе Update этот. Мне хватает одного Invalidate в OnMouseMove.
Здравствуйте, Ikemefula, Вы писали:
I>Можно словить кое какие артефакты. Например Graphics, созданый явно руками, по мелочевке все равно отличается от того, что придет в OnPaint. Вроде все доступные проперти одинковые, а в отрисовке есть небольшая разница и это сильно раздражает.
Что за разница? WinAPI.BeginPaint очищает фон и устанавливает Clip, в чем еще отличаи от WinAPI.GetDC, что-то связанное с фонтами и палитрами?
Если я рисую через Direct2D/3D а GDI используется только чтобы сбросить Bitmap на экран (иногда, если карточка слабая и надо обновить только маленький участок, поскольку DX10/11 умеет только все окно обновлять).
Какие-то проблемы могут быть? Не видел никаких артефактов.
Если код примерно такой:
_Texture.CopySubresourceRegionFrom(0, 0, 0, 0, backBuffer, 0, BoxMake.From2D(rect));
IntPtr hdc = GDIInterop.GetDC(_WindowHandle);
var mapped = _Texture.Map(0, Staging_MapMode.Read, false);
var rs = new SizeU(mapped.SystemMemoryPitch / 4, _CurSize.Height);
GDIInterop.SetDIBitsToDevice_BGRX(hdc, mapped.SystemMemory ,rs, true,
new Point2U(rect.Left, rect.Top), new RectU(0,0,rect.Width,rect.Height)
);
_Texture.Unmap(0);
GDIInterop.ReleaseDC(_WindowHandle, hdc);
I>Кроме того, разделяя логику поведения и отрисовки код упрощается до безобразия.
Одно другому не мешает. Разделить всегда можно.
Здравствуйте, Silver_S, Вы писали:
I>>Можно словить кое какие артефакты. Например Graphics, созданый явно руками, по мелочевке все равно отличается от того, что придет в OnPaint. Вроде все доступные проперти одинковые, а в отрисовке есть небольшая разница и это сильно раздражает.
S_S> Что за разница? WinAPI.BeginPaint очищает фон и устанавливает Clip, в чем еще отличаи от WinAPI.GetDC, что-то связанное с фонтами и палитрами?
Да, шрифты и палитры.
S_S> Если я рисую через Direct2D/3D а GDI используется только чтобы сбросить Bitmap на экран (иногда, если карточка слабая и надо обновить только маленький участок, поскольку DX10/11 умеет только все окно обновлять). S_S> Какие-то проблемы могут быть? Не видел никаких артефактов.
Мало ли чего ты не видел Но если ты рисуешь чисто битмапы, то проблем быть не должно. Но вот зачем это делать в OnMouseMove — ума не приложу.
S_S> Если код примерно такой:
Код я скипнул, т.к. мне непонятны названия и операции.
I>>Кроме того, разделяя логику поведения и отрисовки код упрощается до безобразия. S_S> Одно другому не мешает. Разделить всегда можно.
Ну да, все в одном обработчике и это называется разделение Если тебе нужно прорабатывать сложный бехевиор типа драг-дроп со всякими феньками и тд, то рисование в OnMouseMove просто невозможно отладить.
Здравствуйте, Ikemefula, Вы писали:
I>Есть, это будет как минимум лишнее или же просядет перформанс. Напримерй в свей проге я такое просто не могу себе позволить I>Не ясно, зачем тебе Update этот. Мне хватает одного Invalidate в OnMouseMove.
Почему здесь экран не перерисовывается пока мышка не остановится? 10 секунд ждать обновления экрана это нормальный перфоманс?
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.Opaque, true);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer,true);
}
public Point p;
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
p = e.Location;
System.Threading.Thread.Sleep(10);
Invalidate();
//Update();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
e.Graphics.Clear(Color.White);
e.Graphics.DrawLine(Pens.Black, new Point(p.X, p.Y), new Point(p.X, p.Y + 100));
}
}
Здравствуйте, Silver_S, Вы писали:
I>>Не ясно, зачем тебе Update этот. Мне хватает одного Invalidate в OnMouseMove.
S_S>Почему здесь экран не перерисовывается пока мышка не остановится? 10 секунд ждать обновления экрана это нормальный перфоманс?
Ты прав, Update и Refresh хороши аккурат для Sleep в OnMouseMove.
Здравствуйте, Ikemefula, Вы писали:
I>Ты прав, Update и Refresh хороши аккурат для Sleep в OnMouseMove.
HitTesting от Sleep чем нибудь отличаются?
Ты предлагаешь делать(неявно) BeginPaint, перед HitTest и если не надо обновлять то return?
Да и где гарантии что перерисовка не станет залипать даже если OnMouseMove только флажок устанавливает.
И за счет чего должен перфоманс повыситься — за счет потери некоторых кадров (Inbalidate'ов) ?
Где гарантии что они будут теряться именно как надо?
По какому принципу теряются кадры при Invalidate не ясно, исходников нет, в документации это подробно не описано.
Зачем полагаться на такой скользкий функционал.
Не ясно, что у тебя за софтина с отрисовкой
S_S>HitTesting от Sleep чем нибудь отличаются?
Конечно. Правильно написаный хиттест много времени не отнимает. Проверено примерно на 100-200 тыс объектов.
S_S>Ты предлагаешь делать(неявно) BeginPaint, перед HitTest и если не надо обновлять то return?
Я этого не предлагаю Нужен хиттест — напиши его правильно.
S_S>Да и где гарантии что перерисовка не станет залипать даже если OnMouseMove только флажок устанавливает.
Перерисовка может замерзнуть, я про это писал. В своей проге например Hover пришлось отключить, потому что он влечет полную перерисовку в силу ряда причин.
S_S> И за счет чего должен перфоманс повыситься — за счет потери некоторых кадров (Inbalidate'ов) ?
Перформанс проседать не должен. Про повышение никто не говорил. Если тебе надо какие то клочки рисовать и насрать на побочные эффекты — рисуй где хочешь.
S_S>Где гарантии что они будут теряться именно как надо?
У тебя какая задача, что ты хочешь отрисовывать и какой хочешь бехевиор мышиный ?
S_S> По какому принципу теряются кадры при Invalidate не ясно, исходников нет, в документации это подробно не описано.
Какие еще выпадения кадров ?
S_S>Зачем полагаться на такой скользкий функционал.
Ты придумал какого то коня в вакууме. Я ведь вроде про русски написал :
"Это если ты конечно не игру пишешь и нет никаких тяжелых анимаций. Основной битмап обновляется крайне редко — у меня где то раз в несколько секунд или даже минут.
Вспомогательный, для мышиных операций, обновляется каждый раз когда есть выделение мышом и тд."
Функционал никакой не скользкий. Техника старая ка GDI32.
Здравствуйте, Ikemefula, Вы писали:
I>Какие еще выпадения кадров ?
Залипания. Когда не каждый MouseMove+Invalidate вызывает перерисовку, некоторые пропускаются.
Не вижу причин удалять Update, не уговоришь
Здравствуйте, Silver_S, Вы писали:
I>>Какие еще выпадения кадров ? S_S> Залипания. Когда не каждый MouseMove+Invalidate вызывает перерисовку, некоторые пропускаются.
В каком софте критичны эти кадры ?
S_S>Не вижу причин удалять Update, не уговоришь
Не удаляй, мне фиолетово чего у тебя в коде творится.
Здравствуйте, Ikemefula, Вы писали:
I>Не удаляй, мне фиолетово чего у тебя в коде творится.
Я привел пример когда вариант без Update может быть хуже.
Можешь привести пример когда с Update будет хуже? Я пока такого не видел.