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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2013, 23:08   #131
dampirik
Форумчанин
 
Регистрация: 02.07.2009
Сообщений: 722
По умолчанию

Цитата:
как выжать из цикла FOR максимум производительности
* уменьшить его размер
* упросить вычисления внутри
* "кэшировать" данные, если не требуется обновление
dampirik вне форума Ответить с цитированием
Старый 28.05.2013, 23:12   #132
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от ruN00b Посмотреть сообщение
Есть один вопрос: как выжать из цикла FOR максимум производительности? А то из-за него у меня FPS в игре 14-15 кадров вместо должных хотя бы 30.
Никогда не используй в объявлении глубины цикла выражения, только готовые числа или переменные, содержащие эти числа. Т.е. до цикла нужно всё вычислить и направить в переменные, ...ты уже это должен был проделать, выше разбирали.

Ещё одна типичная ошибка выражений в цикле:

Код:
  For i := 0 to 14 do
    Begin
      For j := 0 to 14 do
        Begin
          x := MapDispX + StepX * j;
          y := MapDispY + StepY * i;

          // отрисовать спрайт в клетку
          Form1.Canvas.Draw(x, y, MapSprites[mas[i, j]]);
        end;
    end;
...видно, да? ...совершенно лишнее многократное вычисление значения y которое внутри цикла по-j не изменяется. Правильно будет так:

Код:
  For i := 0 to 14 do
    Begin
      y := MapDispY + StepY * i;

      For j := 0 to 14 do
        Begin
          x := MapDispX + StepX * j;
          
          // отрисовать спрайт в клетку
          Form1.Canvas.Draw(x, y, MapSprites[mas[i, j]]);
        end;
    end;
Далее. Старайся избавляться от умножения и деления. Если есть умножение на целые числа, старайся эти числа выбирать кратные 8-ми, т.е.: 8, 16, 24, 32 и тд. Так же умножение и деление можно заменять сдвигами вправо или влево (shr, shl), ...процессор сдвиги выполняет быстрее.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 28.05.2013, 23:53   #133
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,569
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Старайся избавляться от умножения и деления.
Верно:

Код:
y := MapDispY;
For i := 0 to 14 do
    Begin
      x := MapDispX;
      For j := 0 to 14 do
        Begin
          // отрисовать спрайт в клетку
          Form1.Canvas.Draw(x, y, MapSprites[mas[i, j]]);
          Inc (x, StepX);
        end;
      Inc (y, StepY);
    end;
Arigato вне форума Ответить с цитированием
Старый 29.05.2013, 00:30   #134
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Arigato, понимаю твою радость, это не весь код.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 29.05.2013, 01:06   #135
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,569
По умолчанию

Лишь указал, что можно и в этом случае обойтись без умножений. А как внешний код может повлиять на эти циклы?
Arigato вне форума Ответить с цитированием
Старый 29.05.2013, 01:58   #136
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Лишь указал, что можно и в этом случае обойтись без умножений. А как внешний код может повлиять на эти циклы?
Я последовательность кусков сообщения уловил, однозначный намёк ...не? ...тогда я рад.

Если внутри циклов выражения со скобками и переменная не одна, то сложение Inc не выручает. Я, чтобы время не тратить, выдрал кусок и упростил, Canvas'а естественно у меня нет. А на элементарное смещение, конечно счетчик - лучший вариант. Смотреть нужно конкретно код.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 29.05.2013, 09:25   #137
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,569
По умолчанию

Не пойму, на что намек? Замечание по конкретному куску кода и в тему "как выжать из цикла FOR максимум производительности".
Arigato вне форума Ответить с цитированием
Старый 29.05.2013, 12:31   #138
ruN00b
Почетный нуб
Форумчанин
 
Аватар для ruN00b
 
Регистрация: 07.05.2013
Сообщений: 155
По умолчанию

Beermonza, сегодня постараюсь избавлиться от умножений и делений, вечером отпишусь.
Насчет кратности на 8,16,32... Я поставил все таймеры с интервалом 100 на 128, с 10 на 32 и игрушка заметно ускорилась. Вопрос таков: есть ли смысл ставить интервал 750 на кратное 8,16,32... и если есть, то на какое число менять?
ruN00b вне форума Ответить с цитированием
Старый 29.05.2013, 16:37   #139
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

ruN00b, кучу таймеров лучше не применять. Выбрав интервал для основного игрового таймера, остальные триггеры игры могут брать интервал из счетчика. Т.е. заведи переменные и в каждый такт в конце процедуры тела TTimer прибавляй 1. В триггерах будут условия, например: если счётчик t1 > 200, то {действие}. Таким образом достигается синхронизация всех "таймеров" игры.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 29.05.2013, 18:07   #140
ruN00b
Почетный нуб
Форумчанин
 
Аватар для ruN00b
 
Регистрация: 07.05.2013
Сообщений: 155
По умолчанию

Ну, я убрал деление и умножение, FPS повысился до 20. А таймеры еще не пробовал, завтра попробую и выложу с новой версией.
ruN00b вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi RPG ruN00b Мультимедиа в Delphi 1 07.05.2013 09:40
RPG-SpaceInvaders revaldo666 Gamedev - cоздание игр: Unity, OpenGL, DirectX 9 08.02.2012 18:04
Delphi-клиент для Online RPG "Dragon Knight" apromix Gamedev - cоздание игр: Unity, OpenGL, DirectX 0 23.05.2009 12:48
3D-RPG Кронос Gamedev - cоздание игр: Unity, OpenGL, DirectX 25 12.05.2007 11:21