Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Тормоза в OpenGl


Автор: Yura_Matsuk 21.9.2005, 20:40
Выложил модули своего 3д движка. Но фпс на примере простенького треугуольника не превышает 60-ти. Откуда такие тормоза?

Автор: p0s0l 22.9.2005, 22:51
SwapBuffers может ждать синхронизации (это зависит от драйвера/настроек драйвера), поэтому скорость ограничена...

Автор: Yura_Matsuk 24.9.2005, 15:53
Но если размер окна увеличить, то фпс и вовсе падает до 20.. smile

Автор: p0s0l 24.9.2005, 17:33
Какие FPS у тебя будут в следующих случаях:
1) Если убрать SwapBuffers (видеть ничего не будешь)
2) Оставить SwapBuffers, но убрать PFD_DOUBLEBUFFER (видеть будешь, но с мерцаниями)
3) Убрать SwapBuffers, и рисовать не 1 треугольник, а тысячу (for i := 1 to 1000 do Scene.Draw)

(+ во всех случаях нужно убрать вызов Randomize)

Автор: Yura_Matsuk 27.9.2005, 17:17
Измерил в уменьшенном окне.
Без изменений - 110
Без СвапБуфферсов - (192-384) - скачет ступенчатым образом
убрать PFD_DOUBLEBUFFER - (136-156)
Без Буфферсов и с 1000 треугольников - (8-12)

Автор: p0s0l 27.9.2005, 19:22
Хм... Скорее всего у тебя OpenGL работает в программном режиме...
Чтобы это проверить, проведи ряд испытаний:
Какое число покажет эта функция ?
Код
var
  pf : integer;
  pfd : PIXELFORMATDESCRIPTOR;

begin
  FillChar (pfd, SizeOf(pfd), 0);
  pfd.nSize := SizeOf(pfd);
  pf := GetPixelFormat (ghDC);
  DescribePixelFormat(ghDC, pf, SizeOf(pfd), pfd);
  ShowMessage (IntToHex(pfd.dwFlags, 8));
  if (pfd.dwFlags and PFD_GENERIC_FORMAT) <> 0 then ShowMessage('Software emulation');
end;
(эту функцию запускать после FormCreate, например, в обработчике OnShow)

И что у тебя возвращают:
glGetString(GL_RENDERER);
glGetString(GL_VERSION);
glGetString(GL_VENDOR);

И еще, для кучи:
Какой FPS будет, если в Draw оставить только inc(fps) ? smile

Автор: Yura_Matsuk 29.9.2005, 18:11
Если оставить только inc(fps), то где-то 35000

Renderer: GDI Generic
Version: 1.1.0
Vendor: (пустая строка)

Функция выдает:
00000465
Software emulation

Хех, а че делать-то? smile

Автор: p0s0l 29.9.2005, 22:59
А винда какая и видяха ? Дрова надо ставить, чтоб с поддержкой OpenGL были...
Можешь проверить свою прогу на других компьютерах...

Автор: Гость_Yura_Matsuk 1.10.2005, 12:42
А может это быть инициализация виновата?

Автор: p0s0l 1.10.2005, 13:01
Попробуй разные примеры OpenGL, как они у тебя пойдут...
Можешь попробовать GLScene...

Автор: Vetos 27.9.2007, 11:37
GLScene вообще ужасает своим фпс,около 300 , не знаю как они умудрились так сделать,
а прога написанная на чистом ОГЛ не дает больше 90 smile 

Автор: Alexeis 27.9.2007, 12:45
Vetos, это смотря как писать, если рисовать прямоугольник, то легко получается FPS 3000 и более.

Автор: Vetos 27.9.2007, 13:27
ну вот допустим я писал, вернее доправлял исходник из книги М.Красного, водопад.
Вообще если использовать Invalidate как и есть в примере то фпс всего 30, а я убрал инвалидат и поставил Paint;фпс стало больше 80-90.Вот так smile 

Автор: Alexeis 27.9.2007, 14:12
Vetos, не нужно путать тот FPS который в памяти рисуется и тот котрый реально на экран попадает. На экране FPS вообще не может превышать частоту экрана. А если рисовать по invalidatом по таймеру, то получим FPS зависящую от частоты таймера, тока лучше тогда уж юзать мультимедийный таймер, тогда равномерность кадров будет выше. 

Автор: Vetos 27.9.2007, 16:35
Можно по подробнее про мультимедийный таймер если это не касается GLScene, просто пишу свой движок на OpenGL, если можешь кинь ссылку про мультимедийный таймер, это как раз то что мне нехватает на начальной стадии развития движка, просто нехочу новую тему создавать  smile  smile если можно)))))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)