Несколько хитростей с D3D8

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

Модератор: Mikle

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Несколько хитростей с D3D8

Сообщение Gemini » 02.12.2008 (Вт) 17:45

Добрый день!

Вот у меня несколько вопросов:
1. Создаю Dx в полноэкранном режиме. После чего хочу его свернуть... И тут вылетает ошибка на рендере либо на слербуфере
Попытался сделать такую вещь:
Код: Выделить всё
If frmMain.WindowState <> vbMinimized Then
рендерим
End If

Но ошибки стали вылетать при разворачивании окна!
Вот сколько не пытался победить эту штуку, не получается!


2. Как правильно сделать ограничение по ФПС в оконном режиме (что бы не было рывков) (что - то даже в голову не приходит)???

3. Как сделан эффект в играх (затемнённый экран по которому водишь мышкой и круглая область вокруг курсора становиться более яркой - Эффект фонарика)????
В нашем деле главное ЛОГИКА.

косил косой косой косой.

|( () ( T |/| |(
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 211
Зарегистрирован: 01.10.2005 (Сб) 15:49

Re: Несколько хитростей с D3D8

Сообщение |( () ( T |/| |( » 02.12.2008 (Вт) 23:58

На счёт первого:
Код: Выделить всё
If Me.WindowState <> vbMinimized Then
If Min = False Then
  D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
Else
  D3DDevice.Reset PRESENT_PARAMS
  Min = False
End If
Else
Min = True
End If
С=[::::::::::> ™ e398wallpapers.narod.ru

Master_Zolan
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 63
Зарегистрирован: 07.10.2008 (Вт) 12:11
Откуда: г. Ростов-на-Дону

Re: Несколько хитростей с D3D8

Сообщение Master_Zolan » 03.12.2008 (Ср) 11:15

Насчет второго:
http://www.gotdotnet.ru/LearnDotNet/VBNET/500739.aspx
конкретно вот этот кусочек
Код: Выделить всё
While Created
     If (Now - DateTime1).TotalMilliseconds > 30 Then ' Прорисовку выполняем через каждые 30 миллисекунд
                ' если не устанавливать временной интервал, то цикл будут выполняться
                ' через разные промежутки времени, и движение корабля будет неравномерным
                ' Также если ваша система не будет успевать выполнять код за 30 миллисекунд
                ' то движение корабля тоже будет неравномерным, можно увеличить до 40
                ' но это уже будут видимые глазу скачки в движении
                ' Реальное время в миллисекундах, за которое происходит выполнение
                ' цикла отображаем в заголовке окна
                ' Если система успевает выполнить цикл, в заголовке будет отображаться число 31.25
                Me.Text = (Now - DateTime1).TotalMilliseconds
                DateTime1 = Now ' Создание точки отсчета времени
                    [код вывода графики и обработки событий]
     End If
End While


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

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Re: Несколько хитростей с D3D8

Сообщение Gemini » 03.12.2008 (Ср) 19:03

|( () ( T |/| |( писал(а):На счёт первого:
Код: Выделить всё
If Me.WindowState <> vbMinimized Then
If Min = False Then
  D3DDevice.Present ByVal 0, ByVal 0, 0, ByVal 0
Else
  D3DDevice.Reset PRESENT_PARAMS
  Min = False
End If
Else
Min = True
End If



Код выдает ошибку на : D3DDevice.Reset d3dpp. Где d3dpp - начальные настройки (при инициализации)
Чувствую что у же близко но что-то не то!
Последний раз редактировалось Gemini 04.12.2008 (Чт) 10:37, всего редактировалось 1 раз.
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Несколько хитростей с D3D8

Сообщение Debugger » 03.12.2008 (Ср) 22:03

Насчет рывков - я долго с этим сражался. Дело в том, что проект приходилось писать на разных компах. На одном FPS было 2000, на другом - 150 :D . Решение старое, но работает -
Код: Выделить всё
Option Explicit

Public Type int64
  dw1 As Long
  dw2 As Long
End Type

Public Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As int64) As Long
Public Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As int64) As Long
Dim QSpeed As Double
Dim QTime As Double
Public BetweenTime As Double 'Клон QTime. ToDo: слить их воедино
Dim QLastTime As Double
Const K_TIMER = 50

Public Sub QFreqIni()
Dim QD As int64
  QueryPerformanceFrequency QD
  If QD.dw1 < 0& Then QSpeed = QD.dw1 + 4294967296# Else QSpeed = QD.dw1
  If QD.dw2 < 0& Then QSpeed = QSpeed + (QD.dw2 + 4294967296#) * 4294967296# Else QSpeed = QSpeed + QD.dw2 * 4294967296#
  QSpeed = 1# / QSpeed
End Sub

Sub CalcTime()
    Dim QD As int64
    Dim T As Double
    Dim tmp As Double
    QueryPerformanceCounter QD
   
    If QD.dw1 < 0& Then T = QD.dw1 + 4294967296# Else T = QD.dw1
    If QD.dw2 < 0& Then T = T + (QD.dw2 + 4294967296#) * 4294967296# Else T = T + QD.dw2 * 4294967296#
   
    QTime = T * QSpeed
   
    tmp = QTime
    If QLastTime = 0 Then QLastTime = QTime
   
    QTime = QTime - QLastTime
    BetweenTime = QTime
    QLastTime = tmp
End Sub
Sub CT()
    CalcTime
End Sub
Function TimeVar(var)
    TimeVar = var * QTime * K_TIMER
End Function
Function TV(var)
    TV = TimeVar(var)
End Function

Соответсвенно, в самом начале вызываем QFreqIni. При каждой прорисовке вызываем CalcTime( или CT), а каждую переменную, которая должна быть связана со временем, засовываем в TimeVar (TV).

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Re: Несколько хитростей с D3D8

Сообщение Gemini » 04.12.2008 (Чт) 10:42

Debugger
Не вариант засовывать все переменные зависящие от времени в одну функцию!
пример Master_Zolan более подходящий но там VB2005 у меня так в вб6 не работает!

Должно быть какое-то комуникабельное решение...

И по поводу сворачивания, есть у кого нибудь мысли почему reset ругаеться на передаваемые ему параметры?
В нашем деле главное ЛОГИКА.

косил косой косой косой.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Несколько хитростей с D3D8

Сообщение djalex777 » 04.12.2008 (Чт) 14:53

Gemini писал(а):Debugger
Не вариант засовывать все переменные зависящие от времени в одну функцию!
пример Master_Zolan более подходящий но там VB2005 у меня так в вб6 не работает!

Должно быть какое-то комуникабельное решение...

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

И по поводу сворачивания, есть у кого нибудь мысли почему reset ругаеться на передаваемые ему параметры?

А может дело не в передаваемых параметрах? (точнее так скорее всего и есть :) ) Reset можно использовать в определённом состоянии устройства. Для определения состояния используют функцию TestCooperativeLevel у класса Direct3DDevice8

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Re: Несколько хитростей с D3D8

Сообщение Gemini » 04.12.2008 (Чт) 22:56

Во какой клёвый сайт нашел: Сайт
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Re: Несколько хитростей с D3D8

Сообщение Gemini » 08.12.2008 (Пн) 17:03

Люди может кто нибудь сможет выложить пример 100% рабочего кода (лучше исходник) По сворачиванию и разворачиванию окна (в полноэкранном режиме) без ошибок.
В нашем деле главное ЛОГИКА.

косил косой косой косой.

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Несколько хитростей с D3D8

Сообщение djalex777 » 08.12.2008 (Пн) 18:59

Можно так. В функцию рендеринга вставь это:
Код: Выделить всё
on error resume next   
Select Case d3ddevice.TestCooperativeLevel
   Case D3DERR_DEVICENOTRESET
      d3ddevice.Reset d3dpp
      Exit Function
   Case Is <> D3D_OK
      Exit Function
End Select
on error goto ErrorNow
... 'Твой код прорисовки и вывода на экран
Exit Function
ErrorNow:

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Re: Несколько хитростей с D3D8

Сообщение Gemini » 08.12.2008 (Пн) 22:18

djalex777

Тоже не помогает. Вылетает при попытке развернуть окно!
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Re: Несколько хитростей с D3D8

Сообщение Vovik » 08.12.2008 (Пн) 23:46

Gemini писал(а):djalex777

Тоже не помогает. Вылетает при попытке развернуть окно!

Set RenderTergetSurf = obj.GetSurfaceLevel(0)
Set DepthStencilSurf = D3DDevice.CreateDepthStencilSurface(...)
- эти объекты нужно уничтожать перед вызовом d3dpp.Reset . еще MainFont.OnLostDevice - перед вызовом, а после MainFont.OnResetDevice. :wink:

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Несколько хитростей с D3D8

Сообщение djalex777 » 09.12.2008 (Вт) 17:57

Vovik писал(а): Set RenderTergetSurf = obj.GetSurfaceLevel(0)
Set DepthStencilSurf = D3DDevice.CreateDepthStencilSurface(...)
- эти объекты нужно уничтожать перед вызовом d3dpp.Reset . еще MainFont.OnLostDevice - перед вызовом, а после MainFont.OnResetDevice.


Естественно! При Reset все сурфейсы в памяти будут потеряны, из видео-памяти будут "выброшены" текстуры, которые в ней хранятся, а также информация обо всех состояниях устройства будет потеряна. До вызова Reset нужно освободить все Render Target и Depth Stenicl Surface, блоки состояний и ресурсы созданные в D3DPOOL_DEFAULT. Соответственно всё надо будет восстановить после Reset

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Re: Несколько хитростей с D3D8

Сообщение Gemini » 09.12.2008 (Вт) 18:58

Вот теперь понятно.

Всем Спасибо!!!!
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Re: Несколько хитростей с D3D8

Сообщение Vovik » 09.12.2008 (Вт) 21:45

djalex777 писал(а):
Vovik писал(а): Set RenderTergetSurf = obj.GetSurfaceLevel(0)
Set DepthStencilSurf = D3DDevice.CreateDepthStencilSurface(...)
- эти объекты нужно уничтожать перед вызовом d3dpp.Reset . еще MainFont.OnLostDevice - перед вызовом, а после MainFont.OnResetDevice.


Естественно! При Reset все сурфейсы в памяти будут потеряны, из видео-памяти будут "выброшены" текстуры, которые в ней хранятся, а также информация обо всех состояниях устройства будет потеряна. До вызова Reset нужно освободить все Render Target и Depth Stenicl Surface, блоки состояний и ресурсы созданные в D3DPOOL_DEFAULT. Соответственно всё надо будет восстановить после Reset
Естественно? Видимо для человека не особо естественным это было :wink:

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Re: Несколько хитростей с D3D8

Сообщение Gemini » 10.12.2008 (Ср) 17:58

Блин! Не выходит! Если кому не трудно приаттачте примерчик плз!

Буду Очень благодарен!
В нашем деле главное ЛОГИКА.

косил косой косой косой.

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

Re: Несколько хитростей с D3D8

Сообщение Mikle » 10.12.2008 (Ср) 18:37

Лови.
У вас нет доступа для просмотра вложений в этом сообщении.

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Re: Несколько хитростей с D3D8

Сообщение Gemini » 10.12.2008 (Ср) 22:42

Mikle

Спасибо! Проверю у себя в проекте и отпишусь!
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Re: Несколько хитростей с D3D8

Сообщение Gemini » 14.12.2008 (Вс) 17:52

Mikle
Попробовал сделать у себя в проекте так же но при разворачивании окна все равно происходит косяк с d3ddevice.Reset d3dpp.
Не могу понять в чём проблема....
Объясните плз последовательность.

Надо ли выгружать все загруженные текстуры и т.д.
В нашем деле главное ЛОГИКА.

косил косой косой косой.

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

Re: Несколько хитростей с D3D8

Сообщение Bazilius » 16.12.2008 (Вт) 14:28

2Gemini
Может быть не в тему выкладываю пример, но у меня сворачивается/разворачивается вроде-бы без ошибок (пробовал на разных компах под XP), правда без 3d. Текстуры не выгружаю, просто часть параметров (см. InitDevice() в модуле) инициализируем заново (в т.ч. спрайты) и восстанавливается без проблем :) Рендер обязательно находится в форме.
Не смог сделать поддержку D3DXFont, вылетает в каком-то месте, пришлось делать шрифт через спрайты/тайлы.
У вас нет доступа для просмотра вложений в этом сообщении.
In the grim darkness of the far future, there is only war!

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Re: Несколько хитростей с D3D8

Сообщение Gemini » 17.12.2008 (Ср) 18:05

Вот как делаю я.....

Посмотрите пожалуйста в чём ошибка...
У вас нет доступа для просмотра вложений в этом сообщении.
В нашем деле главное ЛОГИКА.

косил косой косой косой.

|( () ( T |/| |(
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 211
Зарегистрирован: 01.10.2005 (Сб) 15:49

Re: Несколько хитростей с D3D8

Сообщение |( () ( T |/| |( » 18.12.2008 (Чт) 21:52

Решение проблемы с текстом.
У вас нет доступа для просмотра вложений в этом сообщении.

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

Re: Несколько хитростей с D3D8

Сообщение Bazilius » 19.12.2008 (Пт) 7:54

2Gemini
У меня были такие-же проблемы.
1. Насколько я понял, рендер обязательно должен находится в форме, а не в модуле. Посмотри примеры, в модулях, в основном, происходит только инициализация DX. В твоем случае попробуй перенести процедуры Render() и ClearBack() непосредственно в текст формы.
2. ShowInTaskbar в свойствах формы сделай True.
3. Вывод текста как у |( () ( T |/| |( а.

2|( () ( T |/| |(
Огромное спасибо :D
In the grim darkness of the far future, there is only war!

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Re: Несколько хитростей с D3D8

Сообщение Gemini » 19.12.2008 (Пт) 16:51

3. Вывод текста как у |( () ( T |/| |( а.


Запустил пример... И так же вылетает ошибка при разворачивании формы....
В нашем деле главное ЛОГИКА.

косил косой косой косой.

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

Re: Несколько хитростей с D3D8

Сообщение Bazilius » 21.12.2008 (Вс) 23:24

2Gemini
Чей пример пробовал?
In the grim darkness of the far future, there is only war!

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Re: Несколько хитростей с D3D8

Сообщение Gemini » 22.12.2008 (Пн) 16:31

Bazilius писал(а):2Gemini
Чей пример пробовал?


|( () ( T |/| |( а.
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Re: Несколько хитростей с D3D8

Сообщение Gemini » 22.12.2008 (Пн) 19:26

Блин! (Код: d3dDevice.Reset PRESENT_PARAMETERS, номер ошибки -2005530520 (88760868) ) - Эта ошибка меня достала!!!! я не могу понять.... Что - то не правильно в настройках PRESENT_PARAMETERS или почему vb так ругаеться?????

Bazilius - спасибо! твой пример работает! Только я чуть ли не символ в символ перенёс твой код в свой но все равно вылетает ошибка!!!!

(Блин Уже срочно надо решение проблеммы (начальники гонят!!!!))
В нашем деле главное ЛОГИКА.

косил косой косой косой.

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

Re: Несколько хитростей с D3D8

Сообщение Bazilius » 23.12.2008 (Вт) 8:19

2Gemini
Создай проект, состоящий из одной только формы. Инициализируй только DX, без лишних прибамбасов, и шаг за шагом наращивай функциональность: сначала только рендер, потом подгружай текстуры, выводи изображения и т.д. Короче, делай все поэтапно, чтоб вычислить на каком из этапов вылетает ошибка...
Вот ссылка на старую тему по сворачиванию формы. Просто перенеси последний пример от Mikle в форму и посмотри как будет работать...
In the grim darkness of the far future, there is only war!

djalex777
Постоялец
Постоялец
 
Сообщения: 461
Зарегистрирован: 23.03.2006 (Чт) 16:02

Re: Несколько хитростей с D3D8

Сообщение djalex777 » 23.12.2008 (Вт) 15:18

Gemini, Хм... Вроде всё написали же как и что делать. Что должно быть до Reset и после него. Не читал видимо...

Посмотрел твой исходник:
1. В функции D3DInit ты делаешь проверку на то создалось ли устройство или нет после установки RenderState устройства. Где логика????
2. Функция рисующая текстуру. Рисуешь без установки VertexShader и как же оно по-твоему рисовать должно???? Где-то выше писал - после вызова Reset вертекс шадер нужно устанавливать заново. Либо непосредственно перед отрисовкой вставь установку VertexShader.

Сделаешь эти два пункта и вуаля - всё работает :D

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Re: Несколько хитростей с D3D8

Сообщение Gemini » 23.12.2008 (Вт) 17:01

djalex777 -Магия!
по поводу:
1. В функции D3DInit ты делаешь проверку на то создалось ли устройство или нет после установки RenderState устройства. Где логика????

Мой косяк... Проглядел пока вставлял RenderState.

2. Функция рисующая текстуру. Рисуешь без установки VertexShader и как же оно по-твоему рисовать должно???? Где-то выше писал - после вызова Reset вертекс шадер нужно устанавливать заново. Либо непосредственно перед отрисовкой вставь установку VertexShader.


В примере он устанавливался в функции D3DInit. :)

РЕБЯТА ВСЕМ ОГРОМНОЕ СПАСИБО!!!!! (век не забуду :) )
В нашем деле главное ЛОГИКА.

косил косой косой косой.


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

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

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

    TopList