Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 | 2 | 3 |

 

  Вопрос: GDI vs GDI+ Добавлено: 14.04.05 19:41  

Автор вопроса:  Artyom
Павел Сурменок:

Еще по теме: GDI работает гораздо быстрее GDI .NET, поэтому если
важна скорость отрисовки, то лучше действительно использовать GDI.


Кто имеет желание сейчас провести бенчмарк на сабжевую тему?

Рисуем разнопрофильные вещи.
Например, 40-угольник, каждые 2 точки которого соединены друг с другом, кривые, графики функций, заливку шаблонами, текстурами, градиентами, кто еще что предложит.

Ы?

Ответить

  Ответы Всего ответов: 45  

Номер ответа: 1
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #1
Добавлено: 15.04.05 09:40
А какие ты цели этим преследуешь?
Я конечно бенчмарков не производил, но компетентные специалисты,
мнение которых я уважаю (в частности, MVP Сергей П., с gotdotnet.ru)
утверждают, что GDI быстрее, чем GDI+ в разы.

Ответить

Номер ответа: 2
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #2 Добавлено: 15.04.05 13:24
А какие ты цели этим преследуешь?

Узнать, действительно ли GDI+ медленне GDI, если да, то насколько.

Я конечно бенчмарков не производил, но компетентные специалисты,
мнение которых я уважаю (в частности, MVP Сергей П., с gotdotnet.ru)
утверждают, что GDI быстрее, чем GDI+ в разы.

Ну, "в разы" - тоже очень расплывчатое понятие.
В 2 раза или в 100 раз?

В свое время я получил цифру 2, но это было давно и неправда - надо оценивать все более правильно.

Вобщем, я сделал такой вывод:
Наши многоуважаемые низкоуровневые программисты наконец смирились, что GDI+ никак не медленне GDI, а может даже и быстрее и не хотфт опозориться

Или они просто не могут написать код, который будет работать с GDI.

Ответить

Номер ответа: 3
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #3 Добавлено: 15.04.05 15:02
Artyom, непонятно какие цели преследуются?
Откуда такое мнение, что кто-то с чем-то смирился? Ты что-ли написал эту GDI+, что пожинаешь тут лавры? Или кому-то надо упереться и доказывать тебе, что GDI быстрее, чем GDI+ ? Для чего нужно это доказывать? В чем цель?
И если я не использую GDI+, то с чего ты решил, что я опозорился?

Для чего нужно рисовать 40-угольник? С какой целью? И заливая его градиентом, что мы будем иметь?
Узнаем в очередной раз, что API быстрее, чем классы .NET.
Так доказывалось это уже. Зачем ещё раз?

Ответить

Номер ответа: 4
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #4 Добавлено: 15.04.05 15:22
Тогда остается только один вывод - ни один из крутых системных программистов на форуме не умеет работать с GDI.

Ответить

Номер ответа: 5
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #5 Добавлено: 15.04.05 15:54
Во - первых: я не системный программист. Это к слову.
Во - вторых: крутыми бывают яйца, если их варить более 5 минут.
В - третьих: я не хочу впустую тратить время. Помнится, как-то сделал программу сортировки массивов структур, которую ты же и предложил, а ты куда-то исчез на пол-года, и получилось, что я впустую потратил время. Это элементарное неуважение к моему времени. Зачем мне это?
В - четвертых: когда что-то предлагают, то сначала делают свой вариант, а затем начинают трубить на всех углах: вот что я сделал. Кто сделает, чтобы работало быстрее?

Так что не надо пустых слов бросать на ветер.
Нарисуй форму. Залей её градиентом, нарисуй на этом градиенте свой 40-угольник. Выложи его.
А потом посмотрим.

И я оставляю за собой право поступить так же, как поступил когда-то ты: наплевать на твоё время, которое ты потратишь на изготовление тестового проекта.

Ответить

Номер ответа: 6
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #6 Добавлено: 15.04.05 16:33
В - третьих: я не хочу впустую тратить время. Помнится, как-то сделал программу сортировки массивов структур, которую ты же и предложил, а ты куда-то исчез на пол-года, и получилось, что я впустую потратил время. Это элементарное неуважение к моему времени. Зачем мне это?


Не понял, где это ты ее сделал? И почему мне о ней не сказал?

В свое вермя, насколько мне известно, флеймовый топик был перенесен в раздел "Оффтопик", на который я не был подписан в Forum by
Email.
Если интерисует эта тема, напомни мне условия, я предоставлю свой код.

Кстательно бенчмарка.

Вот мой код:

   Private Sub cmdStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStart.Click
        Dim mStart As Date = Now
        Dim mEnd As Date
        ;Drawing()
        mEnd = Now
        Dim mSpan As TimeSpan = mEnd.Subtract(mStart)
        MessageBox.Show(mSpan.ToString)
    End Sub

    Const PointsCount As Integer = 40
    Const AngleRadius As Integer = 350
    Const cWidth As Integer = 700
    Const cHeight As Integer = 700
    Sub Drawing()
        Dim Bmp As New Bitmap(cWidth, cHeight)
        Dim Rect As New Rectangle(0, 0, cWidth, cHeight)
        Dim Br As New Drawing2D.LinearGradientBrush(Rect, Color.White, Color.Blue, Drawing2D.LinearGradientMode.ForwardDiagonal)
        Dim Gr As Graphics = Graphics.FromImage(Bmp)

        Gr.FillRectangle(Br, Rect)
        pic.Image = Bmp

        Dim Points(PointsCount - 1) As Point

        For i As Integer = 0 To PointsCount - 1
            Points(i).X = AngleRadius * Math.Cos(i / PointsCount * 2 * Math.PI) + cWidth / 2
            Points(i).Y = AngleRadius * Math.Sin(i / PointsCount * 2 * Math.PI) + cHeight / 2
        Next

        For i As Integer = 0 To PointsCount - 1
            For y As Integer = 0 To PointsCount - 1
                If i = y Then Continue For
                Gr.DrawLine(Pens.Black, Points(i), Points(y))
            Next
        Next
    End Sub

Прямоугольник 700х700. Заливается градиентом, на нем строится 40-угольник, каждые 2 вершины между собой соединены.

VB 2005
Athlon 2000+
512 МБ RAM
Windows Server 2003
Выполняется от 280 мс до 230 мс.

Ответить

Номер ответа: 7
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #7 Добавлено: 15.04.05 16:34
Самое интересное - я все равно потрачу на это меньше времени, в частности, на этот проект я потратил меньше 5 минут.
И после этого будешь доказывать, что есть что-то круче .NET? (это не приглашение к флейму, можешь не отвечать, даже лучше если не ответишь).

Ответить

Номер ответа: 8
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #8 Добавлено: 15.04.05 17:05
Я помню, что ты приглашал меня в тот топик. И я отвечал тебе в том топике два или три раза, ожидая, что ты появишься, но ты так и не появился. Что, найти тот топик и показать тебе его???
Отчего не появился? Потому что знал, что проиграешь.

Касательно твоего примера: 280 мс - неприемлимо большое время. Сделай хотя бы 100 мс. Потом будешь предлагать.

Ответить

Номер ответа: 9
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #9
Добавлено: 15.04.05 17:06

Во - первых: я не системный программист.

 Во-во и я том же. Для него понятие системный программист где то рядом с понятием "кодер".

 Тебе что операционную систему написать чтобы ты понял наконец свой уровень?

Ответить

Номер ответа: 10
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #10 Добавлено: 15.04.05 18:37
Гы... Прикольно :)

На одном и том же компе (куда слабее приведённого) .NET стабильно 120 мс (релиз), VB6 20 мс...

Option Explicit

Private Type GRADIENT_TRIANGLE
  Vertex1 As Long
  Vertex2 As Long
  Vertex3 As Long
End Type

Private Type TRIVERTEX
  X As Long
  Y As Long
  Red As Integer
  Green As Integer
  Blue As Integer
  Alpha As Integer
End Type

Private Type POINT
  X As Long
  Y As Long
End Type

Const GRADIENT_FILL_TRIANGLE As Long = &H2

Private Declare Function GradientFillRect Lib "msimg32" Alias "GradientFill" (ByVal hdc As Long, pVertex As Any, ByVal dwNumVertex As Long, pMesh As Any, ByVal dwNumMesh As Long, ByVal dwMode As Long) As Long
Private Declare Function GetTickCount Lib "kernel32.dll" () As Long
Private Declare Function LineTo Lib "gdi32.dll" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function Polyline Lib "gdi32" (ByVal hdc As Long, lpPoint As POINT, ByVal nCount As Long) As Long
Private Declare Function PolyPolyline Lib "gdi32.dll" (ByVal hdc As Long, ByRef lppt As POINT, ByRef lpdwPolyPoints As Long, ByVal cCount As Long) As Long

Private Const PointsCount As Long = 40
Private Const AngleRadius As Long = 350
Private Const cWidth As Long = 700
Private Const cHeight As Long = 700

Private Sub Form_DblClick()
  Dim t As Long, t2 As Long
  
  t = GetTickCount
  Paint
  t2 = GetTickCount
  
  MsgBox t2 - t
End Sub

Private Sub Form_Load()
  Me.ScaleMode = vbPixels
  Me.Width = Me.ScaleX(cWidth, vbPixels, vbTwips)
  Me.Height = Me.ScaleY(cHeight, vbPixels, vbTwips)
End Sub

Private Sub Paint()
  Dim vert(0 To 3) As TRIVERTEX, gRect(0 To 1) As GRADIENT_TRIANGLE, p() As POINT, p2() As POINT
  Dim i As Long, j As Long, t As Long, arr() As Long
  
  Const PI As Double = 3.1415926
  
  With vert(0)
      .X = 0
      .Y = 0
      .Red = &HFF00
      .Green = &HFF00
      .Blue = &HFF00
      .Alpha = 0
  End With

  With vert(1)
      .X = Me.ScaleWidth
      .Y = Me.ScaleHeight
      .Red = 0
      .Green = 0
      .Blue = &HFF00
      .Alpha = 0
  End With
  
  With vert(2)
      .X = 0
      .Y = Me.ScaleHeight
      .Red = &H7F80
      .Green = &H7F80
      .Blue = &HFF00
      .Alpha = 0
  End With
  
  With vert(3)
      .X = Me.ScaleWidth
      .Y = 0
      .Red = &H7F80
      .Green = &H7F80
      .Blue = &HFF00
      .Alpha = 0
  End With
  
  gRect(0).Vertex1 = 0
  gRect(0).Vertex2 = 1
  gRect(0).Vertex3 = 2
  
  gRect(1).Vertex1 = 0
  gRect(1).Vertex2 = 1
  gRect(1).Vertex3 = 3
  
  GradientFillRect Me.hdc, vert(0), 4, gRect(0), 2, GRADIENT_FILL_TRIANGLE
  
  ReDim p(1 To PointsCount)
  
  For i = 1 To PointsCount
    p(i).X = CInt(AngleRadius * Cos(i / PointsCount * 2 * PI) + cWidth / 2)
    p(i).Y = CInt(AngleRadius * Sin(i / PointsCount * 2 * PI) + cHeight / 2)
  Next
  
  Polyline Me.hdc, p(1), PointsCount
  
  ReDim p2(1 To PointsCount * (PointsCount - 1) * 2), arr(1 To PointsCount * (PointsCount - 1))
  
  t = 1
  For i = 1 To PointsCount
    For j = 1 To PointsCount
      If i <> j Then
        p2(t) = p(i)
        p2(t + 1) = p(j)
        t = t + 2
      End If
    Next
  Next
  
  For i = 1 To PointsCount * (PointsCount - 1)
    arr(i) = 2
  Next
  
  PolyPolyline Me.hdc, p2(1), arr(1), PointsCount * (PointsCount - 1)
End Sub

Ответить

Номер ответа: 11
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #11 Добавлено: 15.04.05 18:56
На одном и том же компе (куда слабее приведённого) .NET стабильно 120 мс (релиз), VB6 20 мс

хм. Дело в том, что я недавно тут настраивал работу терминалов (совершенно об этом ничего не зная), машина после это немного подтормаживает.

PolyPolyline Me.hdc, p2(1), arr(1), PointsCount * (PointsCount - 1)

Э не, так не годится - рисуем честные линии.

Ответить

Номер ответа: 12
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #12 Добавлено: 15.04.05 18:59
Дык так же не интересно :)
Почему нельзя оптимизировать там, где можно? Вообще, надо было не 3 вызова к GDI сделать, а 2, потому что вообще все точки можно запихнуть в один массив :)

Ладно, ща проверим с "честными линиями"...

Ответить

Номер ответа: 13
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #13 Добавлено: 15.04.05 19:00
Я помню, что ты приглашал меня в тот топик. И я отвечал тебе в том топике два или три раза, ожидая, что ты появишься, но ты так и не появился. Что, найти тот топик и показать тебе его???
Отчего не появился? Потому что знал, что проиграешь.

Мне сказали, что там кто-то меня ищет, я сказал - отвечай в этот топик.
На тот момент я не подозревал, что этот топик перенесли в раздел "Оффтопик". Поэтому ни одного сообщения я себе через Forum By Email не получил.

Касательно твоего примера: 280 мс - неприемлимо большое время. Сделай хотя бы 100 мс. Потом будешь предлагать.

Считаю 280 с достаточно приемлемым уровнем.

Ответить

Номер ответа: 14
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #14 Добавлено: 15.04.05 19:02
Дык так же не интересно :)
Почему нельзя оптимизировать там, где можно?

Мы же сравниваем работу однотипных участков.

Ладно, ща проверим с "честными линиями"...

ОК. И мне скинь на artyom@soobcha.org

Ответить

Номер ответа: 15
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #15 Добавлено: 15.04.05 19:09
Ты будешь смеяться, но после убирания всех PolyLine и PolyPolyLine, и помещения в тело цикла строк
MoveToEx Me.hDC, p(i).x, p(i).y, ByVal 0&
LineTo Me.hDC, p(j).x, p(j).y


время выполнения снизилось вдвое. 10 мс.

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам