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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2013, 20:59   #71
ruN00b
Почетный нуб
Форумчанин
 
Аватар для ruN00b
 
Регистрация: 07.05.2013
Сообщений: 155
По умолчанию

Beermonza, интервал равен 10.
ruN00b вне форума Ответить с цитированием
Старый 13.05.2013, 22:14   #72
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от ruN00b Посмотреть сообщение
Beermonza, интервал равен 10.
Ой-йой-йой-йой-йой. Windows с библиотекой GDI, через которую в финале всё равно через функцию BitBlt выводится изображение не может работать быстрее 16 мс, поэтому ставить меньше 16 мс смысла нет. Смена кадров, соответствующая общепринятой стандартной величине "24 кадра/сек." - 32 мс.

Посмотрим на FPS производительность, если бы вывод изображения выполнялся аппаратными средствами видеокарты:

Интервал 10 мс ~ 100 fps;
Интервал 16 мс ~ 64 fps;
Интервал 32 мс ~ 32 fps;

Объект TTimer использует стандартные виндовые команды SetTimer и KillTimer, процесс работы которых сопровождается "наброской" времени по 16 мс, если в теле процедуры код не успевает выполниться за указанный интервал. Т.е. быстрее 16 мс в принципе не будет, а если код не успеет в 16 мс, следующий кадр будет только через 32 мс. Это и есть причина рывков и мерцаний. Объект TTimer не реагирует на интервалы 1,2,3,4 ...15, это бесполезно, только на кратные 16.

У меня в игре установлен интервал - 32 мс, чего достаточно, если учесть, что анимация выполнена по стандарту для 2D на 24 кадра/сек.

...поставь 16, 32, посмотри что происходит с изображением и с загрузкой CPU.

Теперь по оптимизации. Вот этот код можно облегчить, если вынести статические величины за цикл:

Код:
  for x := -1 to width div 40+1 do begin
    for y := -1 to height div 40+1 do begin
      if (charx-image1.width div 80+x>=0)
         and (charx-image1.width div 80+x<=999)
         and (chary-image1.height div 80+y>=0)
         and (chary-image1.height div 80+y<=999) then begin
        image1.Canvas.Draw(x*40+x1,y*40+y1,imgid[current[charx-image1.width div 80+x,chary-image1.height div 80+y]]);
      end; //Рисую локацию
    end;
  end;
...видишь статику? ...это:

width div 40+1
height div 40+1
image1.width div 80
image1.height div 80

Запиши их до цикла в переменные:

Wdiv40
Hdiv40
ImgWdiv80
ImgHdiv80

...тогда тормозящих вычислений в цикле не будет. Оптимизируй все коды отрисовки. Выноси за циклы все статичные выражения и их составные части. Старайся избавиться от умножения и деления в циклах - это самые тормозные операции.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 13.05.2013 в 22:37.
Beermonza вне форума Ответить с цитированием
Старый 14.05.2013, 07:07   #73
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,883
По умолчанию

Я, к сожалению, предполагал, что всё именно так печально...
Собственно потому и предлагал определиться с целью и либо "дотерзать проект" учебными пробами (для учебной цели) либо рефакторить сразу (при нацеле на игровой проект). Собственно, и хотел помочь, ибо вижу рвение и желание работать, но на данном этапе без должной теоретической подготовки и практики на примерах, кодирование будет только выливаться в килотонны лапшекода.
Для начала всё же советовал бы поизучать пачку тем этого раздела (где есть код и обсуждения), например http://programmersforum.ru/showthread.php?t=146277 (там мой древнючий пример есть) ну и прикреплённые темы обязательно.
Потом могу познакомить с более прогрессивными методами оптимизации (в пределах текущего инструментария - GDI ), есть наброски, вроде приложения на с полноэкранной графикой и с анимацией на GDI съедающий 0-2%цпу

Безотносительно выше написанного - используйте типы (енумы, сеты, "массив"-ные), структурирование(модули, записи/классы), константы, подпрограммы, уменьшение времени жизни сущностей, областей видимости и связности. Читайте основы, вроде http://www.transl-gunsmoker.ru/p/97.html Возможно, стоит начинать работать с ООП.

Я говорю это потому, что я видел, когда многообещающие ребята, невзирая на советы более опытных, начинаю делать по своему, энергии им не занимать и они пластают сотни килобайт кода из лапши методом копипасты по заветам Мао. И это плохо и для них самих и для окружающих, поэтому советую "наиграться" сколько интересно будет и переходить к серьёзным подходам.
phomm вне форума Ответить с цитированием
Старый 14.05.2013, 07:54   #74
ruN00b
Почетный нуб
Форумчанин
 
Аватар для ruN00b
 
Регистрация: 07.05.2013
Сообщений: 155
По умолчанию

Beermonza, спасибо за совет! В четверг выложу новую версию с новой отрисовкой и чем-нибудь еще.

phomm, не соглашусь с вами. Люди дают мне советы по улучшению игры, я их проверяю. Если это относится к лагам и багам, пытаюсь убрать. Например, человек 3 попросили создать главное меню, сделал. Попросили улучшить отрисовку, не сделал, так как ничего, в том числе и загрузка ЦП не изменились при улучшении кода отрисовки.

Ребят, забыл сокеты, появился вопрос: сделал TServerSocket и TClientSocket.

Код TServerSocket при создании:
RihtenServer.Port:=1337;
RihtenServer.Active:=True;
RihtenServer.Open;

Код TClientSocket при создании:
RihtenClient.Host:='127.0.0.1';
RihtenClient.Port:=1337;
RihtenClient.Active:=True;
RihtenClient.Open;

Проблема в том, что сервер не создается, ну и, конечно, вследствие этого клиент ругает меня ошибкой с номером вроде бы 10049. Какую команду добавить к серверной части? Давно не пользовался сокетами, забыл.

Последний раз редактировалось ruN00b; 14.05.2013 в 21:40.
ruN00b вне форума Ответить с цитированием
Старый 15.05.2013, 12:20   #75
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

Beermonza, а разве не лучше ли будет использовать Application.OnIdle вместо TTimer?
UPD:
Цитата:
Насколько я могу предположить, он тогда будет занимать 100% свободного процессорного времени.
Действительно.
Зато какая скорость! FPS 450

Последний раз редактировалось Kix.IV; 15.05.2013 в 14:37.
Kix.IV вне форума Ответить с цитированием
Старый 15.05.2013, 12:39   #76
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
Сообщение от Kix.IV Посмотреть сообщение
Beermonza, а разве не лучше ли будет использовать Application.OnIdle вместо TTimer?
Насколько я могу предположить, он тогда будет занимать 100% свободного процессорного времени.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 15.05.2013, 17:06   #77
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Kix.IV Посмотреть сообщение
Зато какая скорость! FPS 450
Попробуй объяснить, зачем молотить один и тот же кадр 15 раз подряд, если в сцене ничего не изменяется? ...объяснений и нет, это "шобы було", тот же момент, что и с фотоаппаратами "О! 15 мегапикселей, значит круто!", а что оно нафиг не нужно осознают не все
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 15.05.2013, 17:40   #78
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
Сообщение от Beermonza Посмотреть сообщение
Попробуй объяснить, зачем молотить один и тот же кадр 15 раз подряд, если в сцене ничего не изменяется? ...объяснений и нет, это "шобы було", тот же момент, что и с фотоаппаратами "О! 15 мегапикселей, значит круто!", а что оно нафиг не нужно осознают не все

Что бы где-нибудь в левом-верхнем углу вывести гордую надпись "450 FPS".
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 15.05.2013 в 17:43.
ROD вне форума Ответить с цитированием
Старый 15.05.2013, 17:47   #79
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

Не совсем.
Например, в примере, что вы выложили, если убрать ограничение в 16 мс, то скорость игры увеличится. При FPS 450 скорость игры увеличивается в раз 7.
Я бы не предложил этого, если бы это было абсолютно бессмысленно.
Kix.IV вне форума Ответить с цитированием
Старый 15.05.2013, 18:19   #80
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Kix.IV Посмотреть сообщение
Не совсем.
Например, в примере, что вы выложили, если убрать ограничение в 16 мс, то скорость игры увеличится. При FPS 450 скорость игры увеличивается в раз 7.
Я бы не предложил этого, если бы это было абсолютно бессмысленно.
Попробуй поставить 15 и ты заметишь, что разница между 15 и 16 неестественная, а всё от того, что вывод изображения в форму слишком медленный, ты больше 64 fps просто не получишь, ...накой тогда 450? ...это молотилка впустую. А если в игре есть анимация и она раскадрована таким образом, что кадры смещения соответствуют попиксельному (без пробуксовки на месте при ходьбе, беге), то и этого будет много.

Анимированное 2D и FPS характеристика видеокарты - вещи несовместимые. Вывод на экран считается по модели изменения мира. Если никакие текстуры не меняют кадр и не смещаются, то выводить подряд такую статичную картинку множество раз просто бессмысленно.

На счет скорости игры. Да, есть любители скоростных игр, или просто "прикольно" посмотреть в убыстренном темпе как происходят события, но если это не предусмотрено разработчиком, накой это нужно?

Главная ошибка большинства разработчиков, которая прослеживается и сегодня - это небрежное отношение к ресурсам. Берутся готовые прожорливые блоки и из них совершенно безбашенно собирается монстр потребления ресурсов. Потом вам интеллигентно рекомендуют сменить железо на более мощное, хотя достаточно просто произвести оптимизацию в коде игры, ...но! лень, и производители железа просто рады, когда вас отсылают за их новыми продуктами.

Вот и я вижу игру, которая со свистом должна летать и на 8-битной приставке к телевизору образца 1992 года, а вместо этого вижу дикую загрузку CPU современного двухядерного процессора по 1.8 ГГц каждое, и рваное движение картинки на экране. Это неправильно, и нужно бороться с помощью оптимизации.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Beermonza; 15.05.2013 в 18:23.
Beermonza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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