VB6 и DirectDraw7

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

Модератор: Mikle

vladikcomper
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 18.03.2009 (Ср) 17:13

VB6 и DirectDraw7

Сообщение vladikcomper » 18.03.2009 (Ср) 18:29

Совсем недавно начал изучать DirectDraw7. Он немного устарел, многие юзают Direct3D для создания 2д игр, но все-таки надо же с чего-то начинать.
Я понял, как эта штука рисует, потом откопал примеры и состряпал свой более-менее работоспособный движок, для облегчения доступа к функциям ДиректДроу.
Но у меня возникло несколько вопросов, на которых я так и не смог найти ответа:

1. Как зафиксировать FPS?
Когда поставил счетчик fps на свою программу, я обнаружил, что fps неустойчивый. При частоте 60Гц прога выдает 70-75fps, при 75Гц - 90-95fps. Из-за этого на разных компьютерах у моей проги будет разная скорость. Так вот как зафиксировать fps, скажем на 60 кадров в сек?

2. Как реализовать прозрачность?
Мне многого не надо. Только появляющаяся и затухающая картинка на тайтл-скрине.

3. Как масштабировать?
Слышал, что это можно, юзая для 2д графики Direct3D, а можно ли реализовать на DirectDraw?

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: VB6 и DirectDraw7

Сообщение MIT » 18.03.2009 (Ср) 18:43

vladikcomper писал(а):1. Как зафиксировать FPS?
Я, конечно, не мега профессионал в D3D и т.п., но расчет всего изменения картинки должен быть относительно времени (секунд, миллисекунд), а не относительно fps, он может быть любым, и это надо учитывать.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

vladikcomper
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 18.03.2009 (Ср) 17:13

Re: VB6 и DirectDraw7

Сообщение vladikcomper » 18.03.2009 (Ср) 19:09

MIT писал(а):Я, конечно, не мега профессионал в D3D и т.п., но расчет всего изменения картинки должен быть относительно времени (секунд, миллисекунд), а не относительно fps, он может быть любым, и это надо учитывать.

Я в DirectX пока вообще начинающий, но вроде точно знаю, что для рисования кадров используются циклы, а не таймеры. Так что временем управлять не получится.
Можно конечно юзать таймеры, но видеть все это дрыганье я даже врагу не пожелаю...
И fps - это тоже "время" - frame per second, кадров в секунду.

MIT
Мега гуру
Мега гуру
Аватара пользователя
 
Сообщения: 2211
Зарегистрирован: 17.09.2006 (Вс) 22:46

Re: VB6 и DirectDraw7

Сообщение MIT » 18.03.2009 (Ср) 19:31

vladikcomper писал(а):но вроде точно знаю, что для рисования кадров используются циклы, а не таймеры.
Верно, используются циклы, но все вычисления производятся по времени (за исключением редких случаев).
vladikcomper писал(а):Так что временем управлять не получится.
Зачем управлять временем? Пусть время само управляет :D
vladikcomper писал(а):И fps - это тоже "время" - frame per second, кадров в секунду.
FPS - это не время, а количество прорисовок за секунду.
Изображение
You can change your face, but can`t change your mind. No matter what you do.
Создайте еще более понятный интерфейс и мир создаст еще более тупого юзера. (с) Баш

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: VB6 и DirectDraw7

Сообщение iGrok » 18.03.2009 (Ср) 19:46

И таки как бы там ни было, и что бы ты ни думал, а привязывать логику событий надо не к ФПС а всё-таки ко времени.
Иначе через 5 лет на средней машине мы будем играть в тетрис на 850й скорости (потому, что кол-во фпс будет под несколько тысяч), а на Celeron-300 прошлого века - смотреть слайды (0.1-0.2 фпс)...
label:
cli
jmp label

vladikcomper
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 18.03.2009 (Ср) 17:13

Re: VB6 и DirectDraw7

Сообщение vladikcomper » 18.03.2009 (Ср) 20:08

iGrok писал(а):И таки как бы там ни было, и что бы ты ни думал, а привязывать логику событий надо не к ФПС а всё-таки ко времени.

Кажется, я понял! Просто все в примере игры на DD7, на котором я учился было завязано на FPS.
Но боюсь, сам не разберусь. Мне нужен примерчик на Vb6... чтобы "управлять временем". :wink:

vladikcomper
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 18.03.2009 (Ср) 17:13

Re: VB6 и DirectDraw7

Сообщение vladikcomper » 19.03.2009 (Чт) 15:53

Все, пример не нужен. Я разобрался сам...

|kerish|
Постоялец
Постоялец
 
Сообщения: 831
Зарегистрирован: 22.10.2004 (Пт) 0:31

Re: VB6 и DirectDraw7

Сообщение |kerish| » 09.04.2009 (Чт) 11:28

vladikcomper писал(а):2. Как реализовать прозрачность?
3. Как масштабировать?

Перейти на Direct3D.

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

Re: VB6 и DirectDraw7

Сообщение Debugger » 09.04.2009 (Чт) 14:51

Да, 2D в D3D несколько... проще и гибче.
Фиксировать FPS не надо. А точнее - нельзя не в коем случае. Если ты хочешь, чтобы скорость игры шла независимо от количества просчетов - замеряй среднее время выполнения одной перерисовки с пересчетом и множь все изменяющиеся параметры на это время.
Например: есть
Код: Выделить всё
Dim x
...
Do While ....
DrawRect (x,0,x+100,100)
x+1
Loop
...
Таким образом, квардратик будет смещаться на некое количество пикселей, причем при разных условиях - на разное. Поэтому замеряешь время и множишь (пишу грубо, это пример).
Код: Выделить всё
Dim x, c, Koef
...
Do While ....
t=Timer

DrawRect (x,0,x+100,100)
x+1

Koef=Timer-t
Loop
...

Вроде так, но тут тоже все не тип-топ: при просчете в первый раз Koef равен 0, и квадрат никуда не сместится. Еще надо тут аккуратничать с типами: если x As Integer, то квадрат никуда не поедет. Еще "моментом" является то, что иногда программа работает настолько быстро, что Koef постоянно равен нулю. И так далее...

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

Re: VB6 и DirectDraw7

Сообщение djalex777 » 09.04.2009 (Чт) 19:45

|kerish| писал(а):Еще "моментом" является то, что иногда программа работает настолько быстро, что Koef постоянно равен нулю

Поэтому для замеров временных промежутков не используют timer :)

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

Re: VB6 и DirectDraw7

Сообщение Debugger » 10.04.2009 (Пт) 20:52

djalex777 писал(а):
|kerish| писал(а):Еще "моментом" является то, что иногда программа работает настолько быстро, что Koef постоянно равен нулю

Поэтому для замеров временных промежутков не используют timer :)

Это писал не kerish, а я.
А используют QueryPerfomanceCounter.
Немного сбивает с толку описание в API Guide
The QueryPerformanceCounter function retrieves the current value of the high-resolution performance counter, if one exists.

А такое может быть?

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

Re: VB6 и DirectDraw7

Сообщение djalex777 » 11.04.2009 (Сб) 11:43

Debugger писал(а):Это писал не kerish, а я.
А используют QueryPerfomanceCounter.
Немного сбивает с толку описание в API Guide

Я тебе и писал ответ, воспользовался кнопкой "цитата" в твоём сообщении, но видимо как-то не так :)

Debugger писал(а):А такое может быть?

Чтобы оборудование не поддерживало query perfomance counter? Может. Только я с таким никогда не сталкивался :)

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

Re: VB6 и DirectDraw7

Сообщение Debugger » 11.04.2009 (Сб) 12:45

Тогда в системе нет счетчика времени. Маловероятно.

vladikcomper
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 18.03.2009 (Ср) 17:13

Re: VB6 и DirectDraw7

Сообщение vladikcomper » 20.04.2009 (Пн) 19:26

Debugger писал(а):А используют QueryPerfomanceCounter.
Немного сбивает с толку описание в API Guide

Зачем? Я пользуюсь timeGetTime.
The timeGetTime function retrieves the system time, in milliseconds. The system time is the time elapsed since Windows was started.

Таким образом, время выполения кода можно найти так:
Код: Выделить всё
Dim lngTime As Long, lngTimeGone As Long
lngTime = timeGetTime
... ' собственно, код
lngTimeGone = timeGetTime - lngTime ' определяем время

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: VB6 и DirectDraw7

Сообщение iGrok » 20.04.2009 (Пн) 20:02

vladikcomper писал(а):Зачем?

Так просто. От нефиг делать. :)

Ну или когда нужно более высокое разрешение, чем миллисекунда.
label:
cli
jmp label

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

Re: VB6 и DirectDraw7

Сообщение Mikle » 21.04.2009 (Вт) 14:39

когда нужно более высокое разрешение, чем миллисекунда.

timeGetTime - это то же, что простой vb Timer. Он возвращает миллисекунды, но ошибки бывают до 10 мс, даже бывает, что возвращается время меньшее, чем в предыдущий запрос.


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

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

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

    TopList