Re[15]: GDI+ быстрый вывод
От: Pavel Dvorkin Россия  
Дата: 15.12.10 13:45
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, Pavel Dvorkin, Вы писали:



I>
I>    if (g_pDDSBack->GetDC(&hdc) == DD_OK)
I>    {
I>..
I>            // Small window
I>            for(int i = - 3; i < 4; i++)
I>                for(int j = - 3; j < 4; j++)
I>                {
I>                    if(i + DebLineY < 0 || j + DebLineX < 0)
I>                        continue;
I>                    COLORREF cr = GetPixel(hdc, j + DebLineX, i + DebLineY);
I>                    for(int a = 0; a < 8; a++)
I>                        for(int b = 0; b < 8; b++)
I>                            SetPixel(hdc, 400 + j*9+b, 200 + i*9+a, cr);

I>


I>Ну и код, вложенность от 5 и выше и куча констант в коде Ты его один что ли писал ?


Размеры циклов посмотри. В байте, видишь ли, 8 бит
With best regards
Pavel Dvorkin
Re[16]: GDI+ быстрый вывод
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.12.10 14:18
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

I>>
I>>    if (g_pDDSBack->GetDC(&hdc) == DD_OK)
I>>    {
I>>..
I>>            // Small window
I>>            for(int i = - 3; i < 4; i++)
I>>                for(int j = - 3; j < 4; j++)
I>>                {
I>>                    if(i + DebLineY < 0 || j + DebLineX < 0)
I>>                        continue;
I>>                    COLORREF cr = GetPixel(hdc, j + DebLineX, i + DebLineY);
I>>                    for(int a = 0; a < 8; a++)
I>>                        for(int b = 0; b < 8; b++)
I>>                            SetPixel(hdc, 400 + j*9+b, 200 + i*9+a, cr);

I>>


I>>Ну и код, вложенность от 5 и выше и куча констант в коде Ты его один что ли писал ?


PD>Размеры циклов посмотри. В байте, видишь ли, 8 бит


Интересный аргумент — в байте 8 бит и поэтому вложенность 5 и всякие константы это нормально
Re[17]: GDI+ быстрый вывод
От: Pavel Dvorkin Россия  
Дата: 15.12.10 14:31
Оценка:
Здравствуйте, Ikemefula, Вы писали:


I>Интересный аргумент — в байте 8 бит и поэтому вложенность 5 и всякие константы это нормально


Во-первых, не 5, а все же 4. Во-вторых, это тест (стану я сюда что-то иное постить!). В третьих, в байте 8 бит, а окно это под байт

А в четвертых, надоел.
With best regards
Pavel Dvorkin
Re[18]: GDI+ быстрый вывод
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.12.10 14:34
Оценка: :)
Здравствуйте, Pavel Dvorkin, Вы писали:

I>>Интересный аргумент — в байте 8 бит и поэтому вложенность 5 и всякие константы это нормально


PD>Во-первых, не 5, а все же 4.


5 = if + 4 for

В своем же коде не можешь вложенность посчитать А еще рассказываешь какие нынче плохие программисты.

>Во-вторых, это тест (стану я сюда что-то иное постить!). В третьих, в байте 8 бит, а окно это под байт


Для теста еще сгодится. А с байтом всетаки не ясно " 400 + j*9+b, 200 + i*9+a"
Re[6]: GDI+ быстрый вывод
От: Pavel Dvorkin Россия  
Дата: 16.12.10 07:03
Оценка:
Здравствуйте, samius, Вы писали:


А>>Мерцания прекратились но всё ещё заметно как линии не успевают за курсором. в windows explorerе или любом графическом редакторе так сильно не отстают.

S>Открыл Paint, там резиновая R2Not рамка, как Павел советует. И отстает от курсора, но меньше. И моргает.
S>Открыл Paint.NET, там рамка с затемнением. Не моргает, но отстает от курсора сильнее.

Вот здесь

http://files.rsdn.ru/187/BLOKOUT2.C

пример из Петцольда. Если можешь, попробуй его и скажи, мигает или нет и как насчет отставания курсора

Компилировать без Unicode. 1995 год, однако

P.S. В примере ошибка — неправильно берутся координаты при выходе курсора влево от окна или выше. Исправляется элементарно.
With best regards
Pavel Dvorkin
Re[7]: GDI+ быстрый вывод
От: samius Япония http://sams-tricks.blogspot.com
Дата: 16.12.10 07:17
Оценка:
Здравствуйте, 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. В примере ошибка — неправильно берутся координаты при выходе курсора влево от окна или выше. Исправляется элементарно.

Оно мне надо? Своих хватает.
Re[8]: GDI+ быстрый вывод
От: Pavel Dvorkin Россия  
Дата: 16.12.10 12:51
Оценка:
Здравствуйте, 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, что у нас в учебном классе стоит, не мигает, не отстает и вообще ведет себя замечательно.
Надо будет поисследовать.
With best regards
Pavel Dvorkin
Re[2]: GDI+ быстрый вывод
От: Silver_S Ниоткуда  
Дата: 19.12.10 09:41
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>В OnMouseMove ничего рисовать нельзя, иначе мерцание побороть не удастся. OnMouseMove должен устанвливать флаг обновления.


А можно поподробнее, какие проблемы с рисованием в OnMouse... ? Если AllPaintingInWmPaint, чем плохо в мышином обработчике делать синхронный Refresh() (или Invalidate+Update), вместо отложенного Invalidate ?
Re[3]: GDI+ быстрый вывод
От: Silver_S Ниоткуда  
Дата: 19.12.10 09:46
Оценка:
Здравствуйте, Silver_S, Вы писали:

Хотя если ты имел ввиду в мышином обработчике this.CreateGraphics() , то понятно.
Для вызовов из OnMouseMove, Update (а из него OnPaint) — с этим противопоказаний нет?
Re[3]: GDI+ быстрый вывод
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.12.10 12:02
Оценка: :)
Здравствуйте, Silver_S, Вы писали:

I>>В OnMouseMove ничего рисовать нельзя, иначе мерцание побороть не удастся. OnMouseMove должен устанвливать флаг обновления.


S_S> А можно поподробнее, какие проблемы с рисованием в OnMouse... ? Если AllPaintingInWmPaint, чем плохо в мышином обработчике делать синхронный Refresh()

(или Invalidate+Update), вместо отложенного Invalidate ?

Refresh это очень дорогое удовольствое, т.к. перерисовыват всю клиентскую область и все дочерние контролы. Update тоже недалеко ушел — это принудительный вызов OnPaint. В треде выше предлагалось вызывать не Update а рисовать прямо на экран. Во это и есть проблема.

Можно словить кое какие артефакты. Например Graphics, созданый явно руками, по мелочевке все равно отличается от того, что придет в OnPaint. Вроде все доступные проперти одинковые, а в отрисовке есть небольшая разница и это сильно раздражает. Ну и мерцание это отдельнй вопрос. Полностью подавить его можно только отрисовывая в битмап который в свою очередь нужно рисовать в OnPaint.

Кроме того, разделяя логику поведения и отрисовки код упрощается до безобразия. Но это конечно если ты понимаешь такие концепции как MVC
Re[4]: GDI+ быстрый вывод
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.12.10 12:11
Оценка:
Здравствуйте, Silver_S, Вы писали:

S_S>Хотя если ты имел ввиду в мышином обработчике this.CreateGraphics() , то понятно.

S_S>Для вызовов из OnMouseMove, Update (а из него OnPaint) — с этим противопоказаний нет?

Есть, это будет как минимум лишнее или же просядет перформанс. Напримерй в свей проге я такое просто не могу себе позволить
Не ясно, зачем тебе Update этот. Мне хватает одного Invalidate в OnMouseMove.
Re[4]: GDI+ быстрый вывод
От: Silver_S Ниоткуда  
Дата: 19.12.10 14:36
Оценка:
Здравствуйте, 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>Кроме того, разделяя логику поведения и отрисовки код упрощается до безобразия.

Одно другому не мешает. Разделить всегда можно.
Re[5]: GDI+ быстрый вывод
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.12.10 14:47
Оценка:
Здравствуйте, 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 просто невозможно отладить.
Re[5]: GDI+ быстрый вывод
От: Silver_S Ниоткуда  
Дата: 19.12.10 16:35
Оценка:
Здравствуйте, 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));
        }       
    }
Re[6]: GDI+ быстрый вывод
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.12.10 16:55
Оценка: +1
Здравствуйте, Silver_S, Вы писали:

I>>Не ясно, зачем тебе Update этот. Мне хватает одного Invalidate в OnMouseMove.


S_S>Почему здесь экран не перерисовывается пока мышка не остановится? 10 секунд ждать обновления экрана это нормальный перфоманс?


Ты прав, Update и Refresh хороши аккурат для Sleep в OnMouseMove.
Re[7]: GDI+ быстрый вывод
От: Silver_S Ниоткуда  
Дата: 20.12.10 05:02
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Ты прав, Update и Refresh хороши аккурат для Sleep в OnMouseMove.


HitTesting от Sleep чем нибудь отличаются?
Ты предлагаешь делать(неявно) BeginPaint, перед HitTest и если не надо обновлять то return?
Да и где гарантии что перерисовка не станет залипать даже если OnMouseMove только флажок устанавливает.
И за счет чего должен перфоманс повыситься — за счет потери некоторых кадров (Inbalidate'ов) ?
Где гарантии что они будут теряться именно как надо?
По какому принципу теряются кадры при Invalidate не ясно, исходников нет, в документации это подробно не описано.
Зачем полагаться на такой скользкий функционал.
Re[8]: GDI+ быстрый вывод
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.12.10 08:48
Оценка:
Здравствуйте, Silver_S, Вы писали:

Не ясно, что у тебя за софтина с отрисовкой

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.
Re[9]: GDI+ быстрый вывод
От: Silver_S Ниоткуда  
Дата: 20.12.10 11:28
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Какие еще выпадения кадров ?

Залипания. Когда не каждый MouseMove+Invalidate вызывает перерисовку, некоторые пропускаются.
Не вижу причин удалять Update, не уговоришь
Re[10]: GDI+ быстрый вывод
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 20.12.10 11:33
Оценка:
Здравствуйте, Silver_S, Вы писали:

I>>Какие еще выпадения кадров ?

S_S> Залипания. Когда не каждый MouseMove+Invalidate вызывает перерисовку, некоторые пропускаются.

В каком софте критичны эти кадры ?

S_S>Не вижу причин удалять Update, не уговоришь


Не удаляй, мне фиолетово чего у тебя в коде творится.
Re[11]: GDI+ быстрый вывод
От: Silver_S Ниоткуда  
Дата: 20.12.10 11:38
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Не удаляй, мне фиолетово чего у тебя в коде творится.

Я привел пример когда вариант без Update может быть хуже.
Можешь привести пример когда с Update будет хуже? Я пока такого не видел.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.