DirectX and GDI

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

DirectX and GDI

Сообщение Fedorfx » 30.04.2004 (Пт) 18:07

Можно ли использовать некоторые функции из DirectX на GDI контексте???
Например Я создам обьект DirectX и нарисую на нем линию LineTo
Или например Нарисовать функцией из DirectX на поверхности формы???

И еще вопрос, использует ли GDI аппартаное ускорение видеокарты или все процессор считает?? и если использует то насколько эввективно??

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 30.04.2004 (Пт) 18:32

DirectX рисует ВСЕГДА на поверхности формы (или PictureBox и т. п.)

Я создам обьект DirectX и нарисую на нем линию LineTo

вот это уже вряд ли.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 30.04.2004 (Пт) 21:12

gdi не использует ускоритель-это точно. все вычисления только програмные (проц считает).

Mikle прав, но я хочу дополнитьь. ты, в принципе, можешь одинаково использовать все в связке. например на vc++ при работе с dd так и делается. с vb сложнее, но так же можно. точно знаю что можно в dx7 в модуле dd использовать апи для вывода пикселей или переноса изображения. но какой в этом толк, если dx сделает это быстрее?
ХЎ

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 30.04.2004 (Пт) 23:23

Посмотрите вложенную картинку

Я сейчас это рисую используя LineTo

Массив данных 15 000 элементов.
Наступают тормоза.
Думаю переходить на DirectX но есть след вопросы.
1- Качество отображаемых данных. При использовании GDI если я нарисую линию то я уверен что она отображается точно в том маштабе что и экранный маштаб. А в DirectX я не отвечаю за вывод обьектов на экран и хрен его знает как он выводит линию. Мнебы DirectX но на двухмерной поверхности.
2- Сейчас я легко определяю свои координаты т.к. у меня есть MouseMove X Y а как я буду ориентироваться в трехмерке совсем не представлю.

Короче говоря мне нужен ДВУХМЕРНЫЙ мир с поддержкой возможностей современных акселераторов.
А то у меня RadeonXT за 500 баков а
For i=1 to 15 000
LineTo ......
next i
Выполняет чуть ли не за секунду. FPS =1

ПОСОВЕТУЙТЕ что делать, книг навалом и примеров куча но они все рисуют вращающие треугольники или готовые модельки а мне бы простую линию толщиной в 1 пиксель по координатам из массива. Без всяких текстур, прозрачностей итд.
У вас нет доступа для просмотра вложений в этом сообщении.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.05.2004 (Сб) 6:14

Фёдор, имей совесть :wink:

Код: Выделить всё
Option Explicit

Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Function Polyline Lib "gdi32" (ByVal hdc As Long, lpPoint As POINT, ByVal nCount As Long) As Long

Private Type POINT
  x As Long
  y As Long
End Type

Private Sub Form_Click()
  Dim p(1 To 16383) As POINT, i As Long
 
  Me.ScaleMode = vbPixels
  For i = LBound(p) To UBound(p)
    p(i).x = i / UBound(p) * Me.ScaleWidth
    p(i).y = Me.ScaleHeight * (Rnd / 3 + 1 / 3)
  Next
 
  i = GetTickCount
  Polyline Me.hdc, p(1), UBound(p) - LBound(p) + 1
  i = GetTickCount - i
 
  Debug.Print CStr(i) & " ms."
End Sub


Почему-то опытным путём мною установлено, что 16383 - максимальное количество точек, иначе не рисует...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 01.05.2004 (Сб) 11:49

Чес слово, совесть имею.
Только от безисходности все это.

Код: Выделить всё
Option Explicit

Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Function Polyline Lib "gdi32" (ByVal hdc As Long, lpPoint As POINT, ByVal nCount As Long) As Long

Private Type POINT
  x As Long
  y As Long
End Type
Private Sub Form_Resize()
  Dim p(1 To 16383) As POINT, i As Long, step As Long, Tick As Long
  Me.ScaleMode = vbPixels
  Me.Cls
  Tick = GetTickCount
  For step = 1 To 5
  For i = LBound(p) To UBound(p)
    p(i).x = i / UBound(p) * Me.ScaleWidth
    p(i).y = Me.ScaleHeight * (Rnd / 3 + 1 / 3)
  Next
  Polyline Me.hdc, p(1), UBound(p) - LBound(p) + 1
  Next step
  Tick = GetTickCount - Tick
  Debug.Print CStr(Tick) & " ms."
End Sub


Попробуй на своей машинке немного видоизмененный код.
У меня на Dual p4 2800, Ram-2Gb, Radeon XT Этот код выполняется при размере формы 1024*768 целых 969ms а таких окон у меня можеть быть несколько.
Я конечно понимаю что код гов....о. Что можно создать CreateCompatibleDC и на ней все отрисовывать, а потом BitBtl-кой отобразить, но поверь мне , это все равно получается не очень быстро. В моем понимании не очень быстро это хотябы 5 FPS тк данные в моей программе иногда обновляются 5 раз в секунду и комп несправляется с моим кодом :-(
Вот я и смотря на всякие MaxPain or Unreal 2004 подумал, а почему я не использую новые фенечки DirectX а пользуюсь GDI?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 01.05.2004 (Сб) 13:56

Athlon 1000, 256 DRAM, GeForce2 Pro 32 DDR.
Непрерывный ресайз почти полноэкранной формы:

212 ms.
205 ms.
200 ms.
205 ms.
210 ms.
208 ms.
205 ms.
215 ms.
210 ms.
205 ms.
205 ms.
195 ms.
210 ms.
210 ms.
212 ms.
210 ms.
204 ms.
205 ms.
205 ms.
210 ms.
204 ms.
209 ms.
205 ms.
205 ms.
210 ms.
205 ms.
205 ms.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 01.05.2004 (Сб) 20:23

P4 1800 256MB RAM GeForce 2 MX/MX 400 64MB
Аналогично

313 ms.
266 ms.
297 ms.
250 ms.
282 ms.
266 ms.
265 ms.
266 ms.
282 ms.
266 ms.
266 ms.
250 ms.
297 ms.
266 ms.
266 ms.
250 ms.
266 ms.
265 ms.
265 ms.
281 ms.
281 ms.
265 ms.
281 ms.
281 ms.
266 ms.
266 ms.
297 ms.
266 ms.
265 ms.
265 ms.
266 ms.
282 ms.
265 ms.
250 ms.
281 ms.
282 ms.
250 ms.
266 ms.
Нет меня больше

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 01.05.2004 (Сб) 21:31

Мля
Ну что тут сказать
Dual P4 Ram 2gb Sata Raid 0 Saphire Radeon XT
970 мс
P4 1700 Ram 750 Matrox Parhelia
250 mc

Скорее всего виной тому дрова, в другое просто не верится.
P.S. Сделал тот же тест без вывода графики
150 мс у дуала и почти теже 250 у матрокса.

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 01.05.2004 (Сб) 22:11

Смена дров не помогла
С новыми дровами 850 мс ( на 100 лучше) но все равно нивкакие ворота.
Есть у меня одна мыcля, у меня эта карта горела и я ее в ремонт отдавал.
Думаю может ее там не так отремонтировали.
Вопрос, чем можно карту протестировать на предмет 2д и где можно посмотреть табличку для сравнения производительности моей карты с другими. А то получается что у меня карта за 550 грина а хуже 2 жефорсв :-(

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 02.05.2004 (Вс) 1:09

Ээээ... Ну 3D Mark хотя бы...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 02.05.2004 (Вс) 8:10

епрст.
Я предположил что есть менее громозкие вещи.
ЧТо то типа прошлых Checkedit\ov
Да и где там взять попугаи для двумерки?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 02.05.2004 (Вс) 9:32

Помню со времен первых GeForce, что Matrox-ы от них во всем отставали, а вот в скорости 2D сильно опережали (я молчу про качество). И эту скорость с тех пор никто не наращивал - не нужно. Подозреваю, что на каком-нибудь S3 Virge может оказаться еще быстрее. Я прогнал на K6-2 400 SiS6326 - от 1200 до 1500. Учтите слабость процессора - станет все понятно.

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 09.05.2004 (Вс) 0:35

Ептить
Добил я все же эту тему.

Методом тыка и стечением обстоятелств, когда были прогнанны все тесты и перечитанны многие книги. Когда я уже собирался выбрасывать видеокрту и апгрейдить системный блок, дернуло меня поменять циферки в коде что вверху. Как выяснилось, для моей видеократы нет предела по размеру массива. Только если массив болше 16377 Polyline рисуется процессором, а если меньше то видеоадаптером.
При массиве =16377 время = 150 мс а при массиве 16378 850 мс.

P.S. Зато установил новые драйвера, перепрошил биос мамки, и завел охлаждение процессоров на фантан ( стоит у меня такой на кухне). Теперь емкость моей системы охлаждения компутера = 120 литров.
Температура процов выше 35 град и не поднимается :-)
Так что незря понервничал. :-)

Fedorfx
Постоялец
Постоялец
 
Сообщения: 371
Зарегистрирован: 10.10.2002 (Чт) 0:14

Сообщение Fedorfx » 11.05.2004 (Вт) 22:31

Может кому и пригодится.
Мне это открытие стоило дорого.

Pen_Fast = CreatePen(0, 1, vbRed)
если изменить толщину линии на 2 или болше то рисование линии LineTo данным пером будет в 7 раз дольше.

Bazilius
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 14.11.2003 (Пт) 16:07
Откуда: Пермь

Сообщение Bazilius » 13.05.2004 (Чт) 1:48

P4HT 2,6 2x256(512)MB GeForceFX5600 дали:
172 ms.
172 ms.
156 ms.
156 ms.
156 ms.
172 ms.
172 ms.
172 ms.
156 ms.
157 ms.
157 ms.
171 ms.
157 ms.
157 ms.
156 ms.
172 ms.
157 ms.
156 ms.


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 45

    TopList