Форум: "Игры";
Текущий архив: 2007.06.10;
Скачать: [xml.tar.bz2];
Вниз"Вертикальная синхронизация" Найти похожие ветки
← →
Зм1й © (2006-07-16 21:13) [0]Как её програмно (и вообще) отключить? И ещё вопрос: что она на самом деле из себя представляет? :)
← →
KreeS © (2006-07-16 22:07) [1]Вертикальная синхронизация означает, что отрисовка нового кадра каждый раз будет совпадать с обновлением экрана, т.е. частота обновления монитора будет ограничителем для FPS.
Через OpenGL...procedure UseVSync(ToUse: Boolean);
var
wglSwapIntervalEXT : function(Interval: Integer) : ByteBool; stdcall;
wglGetSwapIntervalEXT: function : Integer; stdcall;
begin
wglSwapIntervalEXT := wglGetProcAddress("wglSwapIntervalEXT");
wglGetSwapIntervalEXT := wglGetProcAddress("wglGetSwapIntervalEXT");
if addr(wglGetSwapIntervalEXT) <> nil then
if wglGetSwapIntervalEXT <> ord(ToUse) then
begin
if addr(wglSwapIntervalEXT) <> nil then
wglSwapIntervalEXT(ord(ToUse));
end;
end;
← →
Cash © (2006-07-16 22:22) [2]... А через Direct3D эта блямба отрубается так:
// В структуре PresentParams: TD3DPresent_Parameters делаем так:
PresentParams.PresentationInterval := D3DPRESENT_INTERVAL_ONE; // для включения
PresentParams.PresentationInterval := D3DPRESENT_INTERVAL_IMMEDIATE; // для выключения
// А потом:
Device.Reset(PresentParams);
← →
@!!ex © (2006-07-16 23:34) [3]Ваще то, для отключения в OpenGL достаточно:
wglSwapIntervalEXT(1); - для включения.
wglSwapIntervalEXT(0); - для выключения.
А зачем ее отключать? Чем мешаеться?
ИМХО отключать нужно только тогда, когда реальные FPS необходимо посчитать.
← →
Cash © (2006-07-16 23:49) [4]А я ваще эту фичу на усмотрение юзверя оставляю... :)
← →
TWINc © (2006-07-17 01:17) [5]а я сам ограничиваю фпс ;)
← →
tButton © (2006-07-17 04:39) [6]а вообще, больше 30 ФПС на глаз не видно =)
← →
Cash © (2006-07-17 07:42) [7]tButton © (17.07.06 04:39) [6]:
Гы-гы-гы. :)
Особенно, когда мышу со скоростью 45-120 пикселей в секунду двигаешь! :)
← →
tButton © (2006-07-17 08:09) [8]странно.
двигаю мышу со скоростью ~100пкс/с
развёртка монитора стоит 72Гц
один хрен глаз не видит плавного движения
(винда)
или это у меня глаза такие? =)
← →
Cash © (2006-07-17 08:47) [9]КВС (FPS) для устройства GDI составляет 320 - 400, в зависимости от
конфига. 72 квс, а ты со скоростью ~100 пвс. Дай мыше сразу 150 и более
пвс, тогда увидишь неплавное перемещение мыши. У меня min 1500 пвс, дак
я не то чтобы скачков, у меня мышь как по маслу ялозит! Так все плавно,
что прям противно! :)))
← →
tButton © (2006-07-17 08:53) [10]да я его плавного и так не вижу =)
а во всяких FPS (First Person Shooter) курсора вообще нет, там только прицел =)
и вообще, нефик мышью так дёргать! =)))
← →
ancara © (2006-07-17 11:26) [11]
> а вообще, больше 30 ФПС на глаз не видно =)
не, к играм это не относится. Была где-то статейка, если найду ссылку, выложу, там подробно так рассказывалось, почему для фильма 25 fps нормально, а для игрушки нет. Главная причина - физика и движение объектов, остальные не помню... щас поищу...
← →
tButton © (2006-07-17 11:28) [12]
> Главная причина - физика и движение объектов
пардоньте, 30 фпс для вывода картинки - вполне достаточно
никто не мешает обсчитывать физику с частотой 500ФПС
это вообще отдельная вещь.
← →
ancara © (2006-07-17 11:29) [13]во нашел: http://www.nvworld.ru/docs/30fps.html
← →
Зм1й © (2006-07-17 17:43) [14]
> KreeS © (16.07.06 22:07) [1]
Спасибо большое. Но странно, что отключение синхронизации никак не повлияло на fps. Вывожу 3 тыс. треугольников с текстурой и fps 62-66 к/с. В чём может быть загвоздка?
> Cash © (16.07.06 22:22) [2]
Спасибо, может тоже когда-нибудь пригодится! :)
← →
cyborg © (2006-07-17 19:44) [15]> Но странно, что отключение синхронизации никак не повлияло
> на fps.
Могу предположить что рисуешь по таймеру?
← →
KreeS © (2006-07-17 19:46) [16]
> Зм1й © (17.07.06 17:43) [14]
А частота экрана какая?
Можт это тормоза просто?
← →
Зм1й © (2006-07-17 19:58) [17]
>
> Могу предположить что рисуешь по таймеру?
Нет
> Можт это тормоза просто?
Нет, ничего не тормозит, всё идёт быстро
> А частота экрана какая?
Что ты имеешь ввиду?
← →
cyborg © (2006-07-17 20:16) [18]В драйвере посмотри, может стоять принудительная синхронизация, поставь "по выбору приложения".
← →
Зм1й © (2006-07-17 20:54) [19]
> cyborg © (17.07.06 20:16) [18]
Я тут, честно говоря, не особо шарю.. :)
Там есть пункты "Режим и синхронизация", "Стандарт синхронизации". Везде установлено "Пользовательские значения". Ещё есть варианты DMT, CVT, GTF...
← →
KreeS © (2006-07-18 01:06) [20]
> Что ты имеешь ввиду?
Полазь в свойствах экрана, найди частоту обновления, посмотри какая. Если совпадает с ФПС, значит поставлена принудительная синхронизация, хотя поидее должна все равно отключаться.
← →
Зм1й © (2006-07-18 15:32) [21]
> KreeS © (18.07.06 01:06) [20]
Нет, частота обновления 75 герц, а fps принимает одно из трёх значений: 62.5, 66.7, inf.
P.s. Даже когда вывожу пару треугольников...
← →
cyborg © (2006-07-18 16:02) [22]> [21] Зм1й © (18.07.06 15:32)
Sleep?
← →
Зм1й © (2006-07-18 16:06) [23]
> cyborg © (18.07.06 16:02) [22]
Использую ли я sleep? Нет, конечно :)
← →
@!!ex © (2006-07-18 16:20) [24]Зм1й ©
Это однозначно не верт. синх виноват.
При нем у тебя бы значение было стабильно 75 кадлров, в редких случаях колеблется на +-1FPS.
inf - это от infinity(бесконечность)
Как же ты считаешь ФПС-то???
← →
Зм1й © (2006-07-18 16:27) [25]Для предотвращения возможных вопросов
while not QUIT_GAME and not FATAL_ERROR do
if PeekMessage (Msg, 0, 0, 0, PM_NOREMOVE) then
begin
if GetMessage (Msg, 0, 0, 0) then
begin
Translatemessage (Msg);
DispatchMessage (Msg);
end;
end else Rendering (Wnd);
procedure Rendering (hWnd: HWND);
var
ps: TPaintStruct;
begin
FPS := 1000 / (GetTickCount - GlobalCntr);
GlobalCntr := GetTickCount;
DC := BeginPaint(hWnd, ps);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
DrawGame (hWnd);
SwapBuffers(DC);
EndPaint(hWnd, ps);
Inc (ShowFpsCntr);
if ShowFpsCntr = 20 then
begin
TextFPS.Text[0] := "FPS " + FloatToStr(FPS);
ShowFpsCntr := 0;
end;
end;
← →
cyborg © (2006-07-18 16:30) [26]Что это такое?
FPS := 1000 / (GetTickCount - GlobalCntr);
GlobalCntr := GetTickCount;
Где тут кол-во кадров?
← →
Зм1й © (2006-07-18 16:36) [27]GlobalCntr - последнее замеченное время
GetTickCount - GlobalCntr - врямя, которое уходит на одну процедуру Rendering
1000 / (GetTickCount - GlobalCntr) - сколько таких процедур можно выполнить за одну секунду
← →
@!!ex © (2006-07-18 16:39) [28]>>GetTickCount - GlobalCntr
Время которое заняла отрисовка предидущего кадра
>>FPS := 1000 / (GetTickCount - GlobalCntr);
Делим 1000 на длительность прорисовки одного кадра. Получаем, сколько кадров за секунду отрисуеться при такой скорости отрисовки одного кадра.
Это не реальное FPS. Это предполагаемое FPS.
Зм1й
Попробуй отрисовывать не раз в 20 кадров. А каждый кадр. Какой результат будет?
← →
@!!ex © (2006-07-18 16:40) [29]Упс. Прошу прощения. Зм1й уже ответил.
← →
Зм1й © (2006-07-18 16:45) [30]
> Попробуй отрисовывать не раз в 20 кадров. А каждый кадр.
> Какой результат будет?
Как это раз? DrawGame вызывается каждый кадр, а вот обновление текстовой строки с fps - каждый двадцатый
← →
cyborg © (2006-07-18 16:49) [31]В расчётах у тебя не хватает кол-вао кадров.
Каждый кадр увеличивай счётчик кадров. Затем, если прошло времени больше секунды (1000 мс.), то делай перерасчёт времени, умножай на кол-во кадров текущую формулу и счётчик кадров сбрасывай.
← →
@!!ex © (2006-07-18 16:54) [32]cyborg ©
все у него хватает.
Зм1й
я имел ввиду, отрисовывай FPS не раз в 20 кадров, а каждый кадр.
← →
Зм1й © (2006-07-18 17:01) [33]
> cyborg © (18.07.06 16:49) [31]
если сделать так
Inc (GlobalCntr);
if GetTickCount - LastTickCntr >= 1000 then
begin
FPS := GlobalCntr;
LastTickCntr := GetTickCount;
GlobalCntr := 0;
end;
то fps = 75 :((
> @!!ex © (18.07.06 16:54) [32]
такой же результат (62,66)
← →
@!!ex © (2006-07-18 17:12) [34]cyborg ©
поршу прощения. не обратил внимания. Вы были права.
← →
Зм1й © (2006-07-18 17:21) [35]Вот допустим у меня по методу cyborg"а теперь 75 к/с. Значит всё-таки дело в синхронизации?
← →
grisme © (2006-07-18 17:39) [36]Да, теперь к-во кадров совпадает с частотой вертикальной развертки твоего экрана..если это не меняется даже в случае описанных выше примеров, то скорее всего, включена принудительная верт.синхронизация..как быть в этом случае, описывалось у С.Гайдукова "OpenGL проф.программрование 3d графики на C++"..
← →
cyborg © (2006-07-18 17:46) [37][33] Зм1й © (18.07.06 17:01)
Только у тебя здесь всё равно с ошибкой считает (хотя это не относится к решению вопроса). Например вдург время межэду расчётами прошло не 1 секунда, а две грубо говоря.
Нужно так:
ФПС=кадры* 1000 / прошедшее время.
← →
Зм1й © (2006-07-18 17:48) [38]
> grisme © (18.07.06 17:39) [36]
А как хотя бы вручную отключить эту синхронизацию?
← →
ancara © (2006-07-18 17:48) [39]GetTickCount очень неточно тики показывает.
см. MSDN: If you need a higher resolution timer, use a multimedia timer or a high-resolution timer.
Если в цикле вызывать GetTickCount его значение будет изменятся скачками, по 55 кажись, непомню...
Так что мерить FPS надо как и полагается его сутью: считать количество кадров отрендеренных за посленюю секунду. В каждом кадре увеличивай счетчик, и каждую секунду показывай значение. Надо только хороший таймер организовать, чтоб РОВНО через секнду срабатывал.
А если стабильно показывает 75 fps - на 95% уверен, что включена верт. синхр.
Какая видюха у тебя кстати? У меня щас на работе GF2MX400 имеет опции вкл. выкл. и "определяется приложением", т.е. ее можно принудительно выключить. Дома на Радеоне 9600 та же история.
← →
grisme © (2006-07-18 17:52) [40]Обычно это в настройках экрана(Правый_щелчок_на_десктопе->свойства->параметры->дополнительно) где-то там, все зависит от твоей карты..
Страницы: 1 2 3 вся ветка
Форум: "Игры";
Текущий архив: 2007.06.10;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.037 c