5 FPS на лучшем железе?
Вы только что потратили больше сотни тысяч рублей на компьютер, закупили к нему мышь и клавиатуру с RGB-подсветкой, сделали ремонт в комнате так, чтобы она подходила под вашего нового железного монстра, удобно развалились на своем превосходном кресле, включаете игру, в которую очень давно хотели поиграть...
И не можете избавиться от бесконечного негодования, ведь производительность в игре оставляет желать лучшего. Но как же так? Что вы сделали неправильно? Какое звено вашего ПК оказалось самым слабым?
Не торопитесь с выводами. Вероятно, это зависит абсолютно не от вас. Просто разработчик этой игры пожалел время/нервы/деньги на оптимизацию. А страдать приходится вам. Непорядок. Можно написать гневное письмо разработчику, вложить в него все свое недовольство. Но давайте сперва попробуем разобраться, что мог сделать разработчик, чтобы о нем думали только хорошее.
Карты, ОЗУ, два SSD
Когда речь идет о создании игр, ресурсы разработчика довольно сильно ограничены, особенно если мы, например, говорим о мобильных играх (кликеры не в счет, хотя и здесь можно "сожрать" все ресурсы устройства").
Давайте начнем, пожалуй, с самого простого. Вы могли догадываться (или твердо знать), что во время игры, очень многие вещи просчитываются в реальном времени. Но насколько часто? Буквально каждый кадр. Если игра идет 60 кадров в секунду, то ровно 60 раз за секунду игра будет просчитывать различные параметры. Скажем, если мы играем в какой-нибудь шутер, то каждый кадр просчитывается положение снарядов, положение игроков, угол их поворота, проигрываемые звуки, освещение, текстуры.
Этот список можно продолжать дальше, снова и снова. Очень много всего. Но давайте попробуем представить, как долго длится просчет, например, новой позиции пули.
Какие данные о пуле есть у устройства? Угол поворота, в виде трех чисел (по одному на каждую ось), координаты пули в пространстве (тоже три числа), вектор направления пули (да-да, по-прежнему три числа) и, разумеется, скорость пули. А если у нас еще есть гравитация, то и гравитация в виде одного числа. Может быть еще множество факторов, вплоть до силы и направления ветра, угла поворота планеты и степени разгневанности Нептуна беспрецедентной наглостью ленивых разработчиков, но не будем настолько усложнять нашу задачу.
Сейчас будет ложка математики в бочке игр. По сути, чтобы вычислить новую позицию пули, нам надо к исходной позиции прибавить направление пули, умноженное на скорость, после чего вычесть из высоты пули ее гравитацию.
Сколько здесь математических операций? Умножение направления пули на скорость включает в себя три операции, так как на скорость умножается каждое из трех чисел направления (помним про каждую ось, да?). Затем операция сложения с исходной позицией - еще 3 операции. А после этого еще и вычитание гравитации (+3 операции). Итого 9 операций просто для того, чтобы посчитать новую позицию пули. Не так много, не правда ли?
Но таких расчетов у нас 60 за секунду, то бишь 540 операций. Уже число побольше. А если игрок выпускает 2 пули за секунду и стреляет уже секунд 10? Это 10800 операция в секунду. А если таких игроков 100? А еще какие-нибудь боты?
А ведь это только пули! А если у нас есть сами игроки, техника, постройки, погода, рассыпающийся кусочек камня, песчинки - это же с ума сойти можно! Но естественно, все не так плохо. Очень многие процессы упрощаются за счет каких-то расчетов, сделанных заранее, что очень сильно снижает нагрузку на железо вашего игрового титана.
А как считать быстрее?
В нашем примере с пулей есть несколько путей решения. Например, можно вовсе отказаться от пули, просчитать точку начала ее полета, точку конца, рассчитать уравнение, по которой она будет лететь, тем самым снизив количество расчетов в каждом кадре.
Облегчит ли это задачу? Для программиста - едва ли, для компьютера - вполне возможно. А можно моментально "доставлять" пулю для цели, но это навредит ощущению "реальности" пули.
Процесс разработки игр - поиск постоянного баланса между теми или иными факторами. Например, иногда приходится пожертвовать возможным игровым опытом, который игрок мог бы получить, в угоду стабильной работе игры. Или занять больше оперативной памяти предварительными расчетами, дабы сэкономить время на расчетах, производимых каждый кадр. И, как и в любом деле, настоящее мастерство - это умение найти золотую середину.
А как оптимизировать еще?
Это был лишь один из немногих способов оптимизации. Очень многие способы касаются непосредственно текстур, света, моделей и т.д. Но об этих вариантах мы поговорим уже в следующих статьях.
Уже можно ругаться на почту разработчика?
Изначально было можно, но, вероятно, не стоит. Почему? Потому что вполне возможно, что разработчик даже не подозревает о проблеме. И если вы с ней столкнулись, попробуйте описать проблему. Возможно, вы замечаете, при каких условиях она возникает. Скажем, сообщение может быть таким: "Как только из моего супер-мега-деструктивного-автомата вылетает три патрона одновременно, FPS падает до 1. Не могли бы вы разобраться, в чем может быть дело и устранить проблему?". И кто знает, может быть, тем самым вы сделаете любимую игру лучше, и сможете спокойно наслаждаться ею, удобно развалившись в своем кресле за новым компьютером.