Страница: 1 | 2 | 3 |
|
Вопрос: GDI vs GDI+
|
Добавлено: 14.04.05 19:41
|
|
Автор вопроса: Artyom
|
Павел Сурменок:
Еще по теме: GDI работает гораздо быстрее GDI .NET, поэтому если
важна скорость отрисовки, то лучше действительно использовать GDI.
Кто имеет желание сейчас провести бенчмарк на сабжевую тему?
Рисуем разнопрофильные вещи.
Например, 40-угольник, каждые 2 точки которого соединены друг с другом, кривые, графики функций, заливку шаблонами, текстурами, градиентами, кто еще что предложит.
Ы?
Ответить
|
Номер ответа: 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.
Так доказывалось это уже. Зачем ещё раз?
Ответить
|
Номер ответа: 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
  rawing()
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 мс.
Ответить
|
Номер ответа: 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
Ответить
|
Страница: 1 | 2 | 3 |
Поиск по форуму