Re[9]: GDI+ быстрый вывод
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.12.10 10:16
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

I>>И это говорит человек, который знает! Винапи



PD>UpdateWindow заставляет немедленно выполниться обработчик WM_PAINT. А пока что там всего лишь один инвалидный прямоугольник шириной в 1 пиксель. После OnPaint он будет зарисован и флаг QS_PAINT в очереди сообщений снят.


...

PD>Последующие InvalidateRect + UpdateWindow аналогичным образом сработают на оставшиеся 3 линии.


PD>Контраргументы есть ?


Конечно. Сделай решение для общего случая — например прямоугольник с заливкой, маркерами, подписями к маркерам и ты поймешь почему такой способ не используется.
Re[12]: GDI+ быстрый вывод
От: Pavel Dvorkin Россия  
Дата: 15.12.10 10:35
Оценка:
Здравствуйте, Ikemefula, Вы писали:


I>А если надо будет чтото сложнее пустого прямоугольника рисовать ?


Речь в задаче ТС шла о резиновом контуре, только.
With best regards
Pavel Dvorkin
Re[10]: GDI+ быстрый вывод
От: Pavel Dvorkin Россия  
Дата: 15.12.10 10:37
Оценка:
Здравствуйте, Ikemefula, Вы писали:

PD>>Контраргументы есть ?


I>Конечно. Сделай решение для общего случая — например прямоугольник с заливкой, маркерами, подписями к маркерам и ты поймешь почему такой способ не используется.


Я спросил про контраргументы насчет моего якобы незнания винапи , то есть как работает InvalidateRect и UpdateWindow. Есть что по этому поводу сказать ?
With best regards
Pavel Dvorkin
Re[8]: GDI+ быстрый вывод
От: samius Япония http://sams-tricks.blogspot.com
Дата: 15.12.10 10:48
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, samius, Вы писали:


PD>>>Это значит, что у тебя был не GDI. Direct3D по крайней мере тогда работал через DirectDraw.

S>>О, наверное в те времена DirectDraw умел работать с 3D и GDI?

PD>HDC в DirectDraw получают иным способом, через directdraw surface


PD>http://programmersforum.ru/showthread.php?p=432552


PD>Ты просто, видимо, не в курсе всего этого.


Ты видимо не в курсе того, что если я делаю вызов DrawString по HDC, полученному у IDirect3DSurface, то работает именно GDI. Ты меня уговариваешь что GDI на самом деле не было и я не в курсе и заместо GDI работал DirectDraw. Если там DirectDraw где и учавствует — то только в процесе лока. GDI он собой никак не заменяет.
Re[13]: GDI+ быстрый вывод
От: samius Япония http://sams-tricks.blogspot.com
Дата: 15.12.10 10:49
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, Ikemefula, Вы писали:



I>>А если надо будет чтото сложнее пустого прямоугольника рисовать ?


PD>Речь в задаче ТС шла о резиновом контуре, только.


Речь в задаче ТС шла о том что бы убрать флики. R2_NOT резинкой флики полностью не исключить, даже если посылать на отрисовку отдельными гранями.
Re[9]: GDI+ быстрый вывод
От: Pavel Dvorkin Россия  
Дата: 15.12.10 11:18
Оценка:
Здравствуйте, samius, Вы писали:

S>Ты видимо не в курсе того, что если я делаю вызов DrawString по HDC, полученному у IDirect3DSurface, то работает именно GDI. Ты меня уговариваешь что GDI на самом деле не было и я не в курсе и заместо GDI работал DirectDraw. Если там DirectDraw где и учавствует — то только в процесе лока. GDI он собой никак не заменяет.


Я всего лишь утверждаю, что при работе D3D работа шла через DirectDraw, Использует ли внутри себя DirectDraw GDI или нет и где именно — это другой вопрос. Да, использует.
With best regards
Pavel Dvorkin
Re[14]: GDI+ быстрый вывод
От: Pavel Dvorkin Россия  
Дата: 15.12.10 11:21
Оценка:
Здравствуйте, samius, Вы писали:

PD>>Здравствуйте, Ikemefula, Вы писали:


I>>>А если надо будет чтото сложнее пустого прямоугольника рисовать ?


PD>>Речь в задаче ТС шла о резиновом контуре, только.


S>Речь в задаче ТС шла о том что бы убрать флики. R2_NOT резинкой флики полностью не исключить, даже если посылать на отрисовку отдельными гранями.


Флики мы с тобой уже обсудили, а здесь речь идет о другом. Просто Икемефулв решил мне задачу усложнить (что будет если...), ну я ему и ответил, что усложнение не рассматривается.
With best regards
Pavel Dvorkin
Re[10]: GDI+ быстрый вывод
От: samius Япония http://sams-tricks.blogspot.com
Дата: 15.12.10 11:23
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, samius, Вы писали:


S>>Ты видимо не в курсе того, что если я делаю вызов DrawString по HDC, полученному у IDirect3DSurface, то работает именно GDI. Ты меня уговариваешь что GDI на самом деле не было и я не в курсе и заместо GDI работал DirectDraw. Если там DirectDraw где и учавствует — то только в процесе лока. GDI он собой никак не заменяет.


PD>Я всего лишь утверждаю, что при работе D3D работа шла через DirectDraw, Использует ли внутри себя DirectDraw GDI или нет и где именно — это другой вопрос. Да, использует.


Я не пытаюсь с тобой спорить, использует ли DirectDraw GDI.
До этого ты утверждал что у меня не было GDI. Я настаиваю на том, что если делается вызов GDI, то работает GDI. А DirectDraw может оперировать лишь буферами и пикселформатами, в то время как кистями, шрифтами и т.п. он не владеет. Даже растровую развертку полигона сделать средствами DirectDraw не выйдет.
Re[11]: GDI+ быстрый вывод
От: Pavel Dvorkin Россия  
Дата: 15.12.10 11:43
Оценка:
Здравствуйте, samius, Вы писали:

S>Я не пытаюсь с тобой спорить, использует ли DirectDraw GDI.

S>До этого ты утверждал что у меня не было GDI.

Я утверждал, что ты работал через DirectDraw в том, что касается получения HDC. HDC у тебя не от GDI, а от DirectDraw. То есть это иной контекст. Используются ли при работе с ним средства от GDI — я не говорил вообще.
With best regards
Pavel Dvorkin
Re[12]: GDI+ быстрый вывод
От: samius Япония http://sams-tricks.blogspot.com
Дата: 15.12.10 12:09
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, samius, Вы писали:


S>>Я не пытаюсь с тобой спорить, использует ли DirectDraw GDI.

S>>До этого ты утверждал что у меня не было GDI.

PD>Я утверждал, что ты работал через DirectDraw в том, что касается получения HDC. HDC у тебя не от GDI, а от DirectDraw. То есть это иной контекст. Используются ли при работе с ним средства от GDI — я не говорил вообще.


Иной контекст твого утверждения, я полагаю?

Это значит, что у тебя был не GDI. Direct3D по крайней мере тогда работал через DirectDraw.

Потому как контекст устройства там именно от GDI.
Re[13]: GDI+ быстрый вывод
От: Pavel Dvorkin Россия  
Дата: 15.12.10 12:19
Оценка:
Здравствуйте, samius, Вы писали:

PD>>Я утверждал, что ты работал через DirectDraw в том, что касается получения HDC. HDC у тебя не от GDI, а от DirectDraw. То есть это иной контекст. Используются ли при работе с ним средства от GDI — я не говорил вообще.


S>Иной контекст твого утверждения, я полагаю?

S>

S>Это значит, что у тебя был не GDI. Direct3D по крайней мере тогда работал через DirectDraw.

S>Потому как контекст устройства там именно от GDI.

Что-то я уже вообще не понимаю. Ты согласился вроде, что там через DirectDraw идет ?

Ну вот тебе куски моего кода 10-летней давности




LPDIRECTDRAWSURFACE4        g_pDDSBack = NULL;   // DirectDraw back surface
...

    // Get a pointer to the back buffer
    ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
    hRet = g_pDDSPrimary->GetAttachedSurface(&ddscaps, &g_pDDSBack);
...
    g_pDDSBack->Blt(NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx);

...

    if (g_pDDSBack->GetDC(&hdc) == DD_OK)
    {
        SetBkMode(hdc, TRANSPARENT);
            HPEN hP = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
            HPEN hPOld = (HPEN) SelectObject(hdc, hP);

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


Как видишь, для получения этого hdc используется хоть и GetDC, но от LPDIRECTDRAWSURFACE4. Что не мешает потом вызывать SelectObject и SetBkMode
With best regards
Pavel Dvorkin
Re[14]: GDI+ быстрый вывод
От: samius Япония http://sams-tricks.blogspot.com
Дата: 15.12.10 12:46
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, samius, Вы писали:


PD>>>Я утверждал, что ты работал через DirectDraw в том, что касается получения HDC. HDC у тебя не от GDI, а от DirectDraw. То есть это иной контекст. Используются ли при работе с ним средства от GDI — я не говорил вообще.


S>>Иной контекст твого утверждения, я полагаю?

S>>

S>>Это значит, что у тебя был не GDI. Direct3D по крайней мере тогда работал через DirectDraw.

S>>Потому как контекст устройства там именно от GDI.

PD>Что-то я уже вообще не понимаю. Ты согласился вроде, что там через DirectDraw идет ?

Через — это значит что DirectDraw вызывает Lock, заполняет некую структуру GDI, и возвращает HDC. Больше здесь DirectDraw ни за что не отвечает.

PD>Ну вот тебе куски моего кода 10-летней давности

PD>
PD>    if (g_pDDSBack->GetDC(&hdc) == DD_OK)
PD>    {
PD>        SetBkMode(hdc, TRANSPARENT);
PD>            HPEN hP = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
PD>            HPEN hPOld = (HPEN) SelectObject(hdc, hP);
PD>


PD>Как видишь, для получения этого hdc используется хоть и GetDC, но от LPDIRECTDRAWSURFACE4. Что не мешает потом вызывать SelectObject и SetBkMode


Не мешает лишь потому что DirectDraw корректно заполнил заголовок. Всю работу SelectObject и SetBkMode делает именно GDI.
Re[15]: GDI+ быстрый вывод
От: Pavel Dvorkin Россия  
Дата: 15.12.10 12:57
Оценка:
Здравствуйте, samius, Вы писали:

PD>>Как видишь, для получения этого hdc используется хоть и GetDC, но от LPDIRECTDRAWSURFACE4. Что не мешает потом вызывать SelectObject и SetBkMode


S>Не мешает лишь потому что DirectDraw корректно заполнил заголовок. Всю работу SelectObject и SetBkMode делает именно GDI.


А я спорю ? Делает GDI, делает. Я же всего-то сказал, что HDC ты получмшь он DD, и хотя он бесспорно HDC, но относится к поверхности, созданной иными средствами — DirectDraw. И блиттинг там свой —

STDMETHOD(Blt)(THIS_ LPRECT,LPDIRECTDRAWSURFACE, LPRECT,DWORD, LPDDBLTFX) PURE;



            hRes = g_pDDSCopy->Blt(&r, g_pDDSBack, &r, DDBLT_WAIT, NULL);
With best regards
Pavel Dvorkin
Re[16]: GDI+ быстрый вывод
От: samius Япония http://sams-tricks.blogspot.com
Дата: 15.12.10 13:12
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, samius, Вы писали:


PD>>>Как видишь, для получения этого hdc используется хоть и GetDC, но от LPDIRECTDRAWSURFACE4. Что не мешает потом вызывать SelectObject и SetBkMode


S>>Не мешает лишь потому что DirectDraw корректно заполнил заголовок. Всю работу SelectObject и SetBkMode делает именно GDI.


PD>А я спорю ? Делает GDI, делает.

Я думал что ты споришь с тем, что там работает GDI.

>Я же всего-то сказал, что HDC ты получмшь он DD, и хотя он бесспорно HDC, но относится к поверхности, созданной иными средствами — DirectDraw. И блиттинг там свой —

GDI как раз поровну, чем там делана поверхность, хоть пальцем.

PD> STDMETHOD(Blt)(THIS_ LPRECT,LPDIRECTDRAWSURFACE, LPRECT,DWORD, LPDDBLTFX) PURE;

Логично, что там блиттинг свой
Re[4]: GDI+ быстрый вывод
От: Аноним  
Дата: 15.12.10 13:16
Оценка:
Здравствуйте, samius, Вы писали:

S>Взял форму из стандартного шаблона, внес изменения только в From1.cs (в дизайнере ничего не менял).

S>
S>public partial class Form1 : Form
S>{
S>    public Form1()
S>    {
S>        InitializeComponent();
S>        Paint += Form1_Paint;

S>        SetStyle(ControlStyles.ResizeRedraw, true);
S>        //SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
S>    }

S>    void Form1_Paint(object sender, PaintEventArgs e)
S>    {
S>        var rect = ClientRectangle;
S>        using (var pen = new Pen(Color.Red, 50))
S>            e.Graphics.DrawLine(pen, rect.Left, rect.Top, rect.Right, rect.Bottom);
S>    }
S>}
S>


S>При запуске в винде с включенной опцией "Рисовать окно при перетаскивании", рисуется красная жирная линия с безбожным фликанием во время ресайза формы. Раскомментирование второй строчки SetStyle флики убирает.

S>Первая строчка SetStyle нужна для того что бы организовать автоматическую перерисовку при ресайзе формы.

А если так

public partial class TestForm : System.Windows.Forms.Form
    {
        Point m_ChooseBegPos;
        Point m_LastMouseLocation;
        bool m_InChoosing;

        public TestForm()
        {
            InitializeComponent();
            Paint += Form1_Paint;

            SetStyle(ControlStyles.ResizeRedraw, true);
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        }

        void Form1_Paint(object sender, PaintEventArgs e) //или OnPaint(PaintEventArgs e) с вызовом base.OnPaint в конце
        {
            if(m_InChoosing)
            using (var p = new Pen(Color.Red, 5))
            {
                Graphics gr = e.Graphics;
                gr.DrawLine(p, m_ChooseBegPos, new Point(m_ChooseBegPos.X, m_LastMouseLocation.Y));
                gr.DrawLine(p, m_ChooseBegPos, new Point(m_LastMouseLocation.X, m_ChooseBegPos.Y));

                gr.DrawLine(p, new Point(m_ChooseBegPos.X, m_LastMouseLocation.Y), m_LastMouseLocation);
                gr.DrawLine(p, new Point(m_LastMouseLocation.X, m_ChooseBegPos.Y), m_LastMouseLocation);
            }

        }

        protected override void OnMouseDown(MouseEventArgs e)
        {
            m_ChooseBegPos = e.Location;
            m_InChoosing = true;

            base.OnMouseDown(e);
        }

        protected override void OnMouseUp(MouseEventArgs e)
        {
            m_InChoosing = false;

            Invalidate();
            base.OnMouseUp(e);
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            m_LastMouseLocation = e.Location;

            if (m_InChoosing)
            {
                Invalidate();
            }

            base.OnMouseMove(e);
        }
    }


то мерцает ещё особенно если форма на весь экран.
добавил
SetStyle(ControlStyles.AllPaintingInWmPaint, true);

Мерцания прекратились но всё ещё заметно как линии не успевают за курсором. в windows explorerе или любом графическом редакторе так сильно не отстают.
Re[17]: GDI+ быстрый вывод
От: Pavel Dvorkin Россия  
Дата: 15.12.10 13:22
Оценка:
Здравствуйте, samius, Вы писали:

S>Я думал что ты споришь с тем, что там работает GDI.


Да нет... В конце концов где там что в ядре в win32k.sys + драйвер видеокарты — черт разберется.

>>Я же всего-то сказал, что HDC ты получмшь он DD, и хотя он бесспорно HDC, но относится к поверхности, созданной иными средствами — DirectDraw. И блиттинг там свой —

S>GDI как раз поровну, чем там делана поверхность, хоть пальцем.

Верно, но свойства у этого HDC иные, недели у созданного через CreateCompatibleDC/GetDC, к примеру.

PD>> STDMETHOD(Blt)(THIS_ LPRECT,LPDIRECTDRAWSURFACE, LPRECT,DWORD, LPDDBLTFX) PURE;

S>Логично, что там блиттинг свой

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

I>>Слушай, не смешно. Дохлый комп может швырять битмапы на экран с такой скоростью, что загрузка процессора в этом случае нисколько не растет


PD>Этим не процессор, а скорее всего видеокарта занимается.


В том то и дело. А вот если ты начнешь свои примитивы херачить, то аппаратное ускорение поможет только в GDI32. GDI+ это уже софтверный рендеринг, какие то клочки используют акселерацию от GDI32.

Так что твои мега-алгоритмы рисовавния пустых прямоугольников вполне могут кушать _больше_ процессора, нежели в случае с битмапами.
Re[5]: GDI+ быстрый вывод
От: samius Япония http://sams-tricks.blogspot.com
Дата: 15.12.10 13:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, samius, Вы писали:


S>>Взял форму из стандартного шаблона, внес изменения только в From1.cs (в дизайнере ничего не менял).


S>>При запуске в винде с включенной опцией "Рисовать окно при перетаскивании", рисуется красная жирная линия с безбожным фликанием во время ресайза формы. Раскомментирование второй строчки SetStyle флики убирает.

S>>Первая строчка SetStyle нужна для того что бы организовать автоматическую перерисовку при ресайзе формы.

А>А если так


А>
А>public partial class TestForm : System.Windows.Forms.Form
А>

да, так моргает

А>то мерцает ещё особенно если форма на весь экран.

А>добавил
А>SetStyle(ControlStyles.AllPaintingInWmPaint, true);

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

Открыл Paint, там резиновая R2Not рамка, как Павел советует. И отстает от курсора, но меньше. И моргает.
Открыл Paint.NET, там рамка с затемнением. Не моргает, но отстает от курсора сильнее.
Re[14]: GDI+ быстрый вывод
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.12.10 13:34
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:


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


Ну и код, вложенность от 5 и выше и куча констант в коде Ты его один что ли писал ?
Re[6]: GDI+ быстрый вывод
От: Аноним  
Дата: 15.12.10 13:43
Оценка:
Здравствуйте, samius, Вы писали:

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

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

Значит мне кажется что больше
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.