Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2010, 12:57   #1
anyx
Форумчанин
 
Регистрация: 10.09.2009
Сообщений: 352
Радость 3D-шутер

у меня на 3 пентиуме при размере окна 640х480 уже начинает тормозить. хотя я всего-лишь вывожу 4 стены, пол и потолок, покрытые текстурой. я собираюсь ввести списки отображения, но сильно-ли это поможет?!
Сам ВОПРОС: как оптимизировать? код прилагается.
P.S. для начала надо нажать Esc
Вложения
Тип файла: rar Abstract.rar (238.8 Кб, 215 просмотров)

Последний раз редактировалось anyx; 03.02.2010 в 13:31.
anyx вне форума Ответить с цитированием
Старый 03.02.2010, 17:24   #2
Wicort
Форумчанин
 
Аватар для Wicort
 
Регистрация: 04.08.2009
Сообщений: 684
По умолчанию

не знаю, у меня на двух ядрах 1.8 не тормозит ни капельки
Еслия Вам помог, не поленитесь нажать на весы и оставить отзыв. Это не займет много времени, но даст понять, что я старался не зря =)
Мой ник зарегистрирован, а твой?
Wicort вне форума Ответить с цитированием
Старый 03.02.2010, 20:25   #3
Вадим Буренков
Участник клуба
 
Аватар для Вадим Буренков
 
Регистрация: 06.03.2009
Сообщений: 1,346
По умолчанию

У меня мощнейший компьютер, но назвать картинку плавной язык не поворачивается.
Вадим Буренков вне форума Ответить с цитированием
Старый 04.02.2010, 00:22   #4
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Первое, что пришло в голову:

1) уберите дисплейные списки.
2) уберите вывод текста
3) уберите glFlush
4)
Код:
procedure TFMain.SetTex(Index: Integer);
begin
  if texture[Index]<>nil then
    glTexImage2d(GL_TEXTURE_2D,0,3,128,128,0,GL_RGB,GL_UNSIGNED_BYTE,texture[Index]);
end;
У вас выполняется несколько раз за 1 рендер. Т.е. у вас кучу раз перегоняются на видюху одни и те же текстуры. Поэтому заранее создайте все текстуры:
Код:
glGenTextures( 3, texture_ids ); // Вот тут не помню, как массив передавать. Возможно даже ссылкой @
for i := 1 to 3 do
begin
glBindTexture( GL_TEXTURE_2D, texture_ids[ i ] );
// Загрузка из файла
glTexImage2D(...);
glBindTexture( GL_TEXTURE_2D, 0 );
end;
загрузите в них данные через glTexImage2D, а функцию поменяйте на:
Код:
procedure TFMain.SetTex(Index: Integer);
begin
  if ( index >= 1 ) and ( index <= 3 ) then
    glBindTexture( GL_TEXTURE_2D, texture_ids[Index] );
end;

Последний раз редактировалось Carbon; 04.02.2010 в 00:26.
Carbon вне форума Ответить с цитированием
Старый 04.02.2010, 00:41   #5
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Если уж выводите текст, включили бы фпс что ли.
Carbon вне форума Ответить с цитированием
Старый 20.05.2010, 20:06   #6
NapalmRain
Пользователь
 
Регистрация: 18.05.2010
Сообщений: 53
По умолчанию

Что-то у меня вообще тупо чёрный экран. не горузится. видимо чего то не хватает(
NapalmRain вне форума Ответить с цитированием
Старый 16.12.2010, 08:43   #7
anyx
Форумчанин
 
Регистрация: 10.09.2009
Сообщений: 352
По умолчанию

Решил взяться за старое... Переделал структуру проекта с использованием ООП (кстати, как вам моя идея с виртуальными функциями - они не слишком тормозные для описания игрового цикла?).
Поставил glClearColor(1, 1, 1, 0) в FormCreate, но при рендеринге тупо чёрный экран. Дебажил, все строки кода выполняются как положено, но цвет фона чёрный. Помогите найти ошибку, возможно, просто глупость какая-нибудь...
Вот исходник и exe-шник

Цитата:
Сообщение от Carbon Посмотреть сообщение
Если уж выводите текст, включили бы фпс что ли.
Кстати, как посчитать ФПС?

И ещё, если смотрели первое вложение (первый пост), то там стены мерцают - то есть, то нету. Я использовал такие параметры теста глубины (не в том вложении, позже, но результат тот-же):

Код:
glEnable(GL_DEPTH_TEST);
glClearDepth(1);
glDepthFunc(GL_LEQUAL);
Стены всё-равно мерцают. Что делать?

И ещё, ранее сказали, что вызов glFlush стоит убрать. Но как я понимаю, в OpenGL команды не выполняются сразу, а записываются в очередь. Значит к следующему кадру могут быть не выполнены команды отрисовки предыдущего. Логично было бы вначале кадра сбросить очередь с помощью glFlush. Или я чего-то не понимаю?
Вложения
Тип файла: rar fezel.rar (196.0 Кб, 41 просмотров)

Последний раз редактировалось anyx; 16.12.2010 в 13:41.
anyx вне форума Ответить с цитированием
Старый 16.12.2010, 16:17   #8
.pixel
c++, dx/ogl
Форумчанин
 
Аватар для .pixel
 
Регистрация: 10.11.2008
Сообщений: 131
По умолчанию

«Черный экран»
Проблема в procedure TGraphic.FormCreate(Sender: TObject);

Сделай так…
Код:
if (FGLRC <> 0) then
  if (not wglMakeCurrent(FDC, FGLRC)) then
          raise EOutOfResources.Create('OpenGL rendering context');

«Просчет ФПС»
Код:
Implementation
uses…

var
FTick	:Cardinal; //локальная - (типо статическая) переменная 

// помещаем в главный цикл программы
procedure fps();
begin
if (FTick<GetTickCount) then begin

	FTick:=GetTickCount+1000;

	//выводим куда либо FrameCount

	// и сбрасываем в 0
	FrameCount:=0;
 	end
 else
	INC(FrameCount);
end;
«Стенки vs глубина»
Может быть, ты забыл маску включить попробуй так

Код:
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE); //<---- !
glDepthFunc(GL_LEQUAL);
glClearDepth(1.0f);
«glFlush»
Сколько видел примеров, если он и используется то пишется в конце прорисовки перед SwapBuffers()
“Batch, Batch, Batch:” What Does It Really Mean?
I am a donut! Ask not how many tris/batch, but
rather how many batches/frame!

Последний раз редактировалось .pixel; 16.12.2010 в 20:58. Причина: время
.pixel вне форума Ответить с цитированием
Старый 16.12.2010, 22:15   #9
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,691
По умолчанию

Код:
while (1)
{
  Расчтеты сцены на  ЦПУ;
  Отрисовка ;
  SwawBuffers();
}
Цитата:
With multithread applications, flush the drawing commands in any other threads drawing to the same window before calling SwapBuffers.
Цитата:
glFlush говорит, что результат команд которые мы послали раньше, необходимо показать пользователю. А то откуда device узнает, где у нас заканчивается рисование кадра
glFinish - это glFlush + ожидание конца прорисовки.
А glFlush действует асинхронно и возвращается сразу, а параллельно видеокарта срочно доделывает всё, что бы показать кадр.
в общем читаем Redbook
Kostia вне форума Ответить с цитированием
Старый 17.12.2010, 13:07   #10
anyx
Форумчанин
 
Регистрация: 10.09.2009
Сообщений: 352
По умолчанию

Спасибо за ответы. Но повторю вопрос, на него никто не ответил (или просто не заметили):
Не будет ли у меня потом проблем из-за столь активного использования наследования, виртуальных и абстрактных функций? Насколько быстро это всё работает?
anyx вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ничего себе... 3D шутер... mihali4 Gamedev - cоздание игр: Unity, OpenGL, DirectX 91 21.05.2011 13:29