Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / OGL-Почему так медленно ?

OGL-Почему так медленно ?

Удалёнwww6 фев. 200315:29#0
Кто знает, скажите, почему выигрыш в скорости анимации (ращение вокруг оси через таймер - set(..1..) при использовании GF2 MX400 64 (c 3D ускорителем) по сравнению с S3 32/64 (без 3D ускорителя), только 3,5 раза. Модель состоит только из  100 000 разноцвентых полигонов, учитывется только освещение и перспектива. Использеутся б-ка OGL, VisualFortran 6.1 и Win2000.
IronPeterПостоялецwww6 фев. 200315:37#1
TOLIK

В принципе, нетипично. Если можешь, покажи исходники.

Удалёнwww7 фев. 200311:33#2
IronPeter

за основу взят пример из MS FPS4
CUBE5: Spinning cube, made of five smaller cubes

посмотри, пожалуйста.
буква f в начале функций OGL означает Фортран


subroutine DrawScene (hdc, nAngle)
!MS$  ATTRIBUTES VALUE :: hdc
!MS$  ATTRIBUTES VALUE :: nAngle
use msfwin
use opengl
use cubeinc
integer(4)  hdc, nAngle
logical(4)  bret


    !//
    !//  Clear the color and depth buffers
    !//
    call fglClear(IOR(GL_COLOR_BUFFER_BIT , GL_DEPTH_BUFFER_BIT))
    call fglFrontFace(GL_CW)
    !//
    !//  Define the modelview transformation.
    !//

  call fglMatrixMode(GL_MODELVIEW)
  call fglLoadIdentity()
  call fglTranslatef(0.0, 0.0, -32.0)
  call fglRotatef(REAL(nAngle), 0.0, 1.0, 0.0)


                call fglCallList (DRAWCUBE)

    !//
    !//  Swap the buffers.
    !//
    bret = SwapBuffers(hdc)
end

приведу также фрагмент заполнения списка, в нем только 3- и 4-угольники.
их можно заменить на полигон - ничего не меняется.

    if(nt.eq.3)then
call fglBegin(GL_TRIANGLES)
    else
call fglBegin(GL_QUADS)
endif

call fglNormal3f(-aaa,-bbb,-ccc)
        call fglVertex3f(x1,y1,z1)
        call fglVertex3f(x2,y2,z2)
        call fglVertex3f(x3,y3,z3)

        if(nt.eq.4)then
call fglVertex3f(x4, y4, z4)
endif

call fglEnd()

IronPeterПостоялецwww7 фев. 200312:03#3
TOLIK

Не-не, так нельзя. Нельзя включать glBegin()...glEnd() так часто. Лучше сказать сначала glBegin(GL_TRIANGLES), потом отрисовать все треугольники, потом сказать glEnd(). Потом с четырехугольниками. В принципе, если все это помещено в список, то драйвер мог сам разобраться, что делать - но сейчас мало оптимизуют драйверы под "старый OpenGL codepath"
Если не хватит прироста, надо будет разбираться дополнительно.


Скажи, сколько кадров в секунду в маленьком окне. Должно быть порядка 50-100.

Надеюсь, список создается однажды, а не пересоздается каждый кадр?

Удалёнwww7 фев. 200315:44#4
на 100 000  угольников порядка 10 кадров в секунду.Со списком все  в порядке.
однако, amd k6/2-500. а не PenIV
KasheyПостоялецwww7 фев. 200316:55#5
10 кадров это очень мало. минимум 40 должно быть при 100к три.
Lord RuslanНовичокwww8 фев. 20032:45#6
Насчет того, что нельзя часто делать Бегин и Энд - а если у него объекты, скажем, с разной прозрачностью? Между бегином и эндом, по-моему, допускаются только строго определенные команды OpenGL, и glBlendFunc() в них, например, не входит...
Хотя, можно перед прорисовкой пробежать все объекты и разбить их на однородные по критическому признаку группы...Но это уже бред :)
IronPeterПостоялецwww8 фев. 20039:54#7
Lord Ruslan

Ну да, основня идея понята правильно. Только лучше не glBegin/glEnd(), а glDrawElements().

ChebПостоялецwww8 фев. 200320:06#8
Интересно - а на каких ещё FPSах k6/2 500 с GF2MX400 может тянуть такое зверское количество треугольников ?.. Мой Duron 800 c GF2MX400 на ста тысячах полигонов выдаёт не больше 20 FPS - и это при минимальной чёткости текстур и 16и-битном 640х480!..

Это всё похоже на тему из арии "а чего это на моей Voodoo2 Doom III тормозит?..." - хорошо  бы было быть богатым и иметь GF3 и Atlon XP, да кто ж нам столько даст... :(

IronPeterПостоялецwww8 фев. 200323:03#9
Cheb

Конкретно про зверское число. На этих картах  от процессора при правильной постановке задачи тут почти ничего не зависит.

На сценах из 100тысяч треугольников, подготовленных специальным образом (оптимизация индексов + сохранение в видеопамяти), на MX400 должно быть  100+ кадров. Если сцена наивно отрисована кусками этак по сто-тысяча (очень плохо маленькие куски, но и один большой - тоже хреново) треугольников  ( а лучше - strips) вызовами glBegin()/glEnd() и засунута в список - то 50+ кадров.  Хошь тест? А правильный видеоускоритель и под  700 кадров выдаст :-).

ChebПостоялецwww9 фев. 20031:06#10
Это всё, конечно, хорошо, но вот у меня например тысяча 100-треугольниковых ёлок, каждая на 90% состоит из разрозненных квадратов по 2 треугольника каждый, на которых нарисованы ветки... Текстуры они могут использовать разные - в зависимости от степени повреждения. Некоторые могут быть анимированы, если между ними продирается монстр. И список ёлок, попадающих в зону видимости тоже может меняться очень быстро, если игрок вертит головой... Как это-то можно оптимизировать?..

Да, и ещё забыл сказать: полигоны ёлок двусторонние.

Удалёнwww10 фев. 200320:13#11
Спасибо всем за полезные советы !
Скорость удалось поднять в 2 раза !

/ Форум / Программирование игр / Графика

Тема в архиве.

2001—2018 © GameDev.ru — Разработка игр