Сообщение от
Black Fox
MySQL несомненно является отдельным сервером, с этим я не спорил. Разница в том, что MySQL не может сам производить расчеты (есть хранимки, но это дургое).
Бэкэнд сервер в свою очередь может брать львиную часть работы на себя, тем самым снимая нагрузку с игрового сервера. Списать деньги со счетов всех домов (онлайн/оффлайн) игроков, например. Таких примеров может быть очень много. Да и вообще, для работы с данными намного приятнее и круче использовать то, что сделано для работы с ними (Entity Framework, LINQ).
Списать деньги со счетов всех домов? Легко.
Например, 1000 долларов (или в чём там исчисляются финансы):
PHP код:
UPDATE house SET balance = balance-1000
Всё. Сервер лишь отправит этот запрос в базу и она всё сама обработает.
А если ты подразумеваешь то, что результат вычислений должен прийти обратно на сервер, то что тебе мешает сразу запустить цикл и провести эти вычисления? Отнять от текущего баланса тысячу будет так же быстро, как и обработка результата работы твоего бэкэнд сервера (или ты придумал как передавать данные через ноосферу сразу в переменные?). А более сложные расчёты обычно требуются незамедлительно (обычно нечто подобное бывает в античитах. Например, расчёт положение стреляющего игрока относительно других с учётом того, куда попадает этот самый игрок. Если ты переложишь расчёты на бэкэнд, у тебя мало того, что из-за пинга игрока будут погрешности, так ещё и пинг бэкэнд сервера прибавится).
Сообщение от
Black Fox
В моей голове все выстроено очень четко - есть игровой мод, который управляет игрой, есть данные, которые используются модом, но не обязаны обрабатываться им (модом). Ничто не мешает моду получать данные извне - это нормальное архитектурное решение, используемое повсеместно.
Какой в этом смысл? Мало того, что тебе в любом случае придётся обработать ответ от твоего бэкэнд сервера, так ещё и придётся ждать этот самый ответ (сначала отправить, а потом ждать пока всё обработается и придёт ответ). То бишь, тебе в любом случае придётся как-то застопорить обработку кода на сервере, если результаты вычислений как-то влияют на обработку того или иного кода после. А если не ждать, то можешь быть уверенным в том, что ответ будет приходить с задержкой, ибо от того, что ты часть вычислений вынесешь на отдельный сервер, игровой сервер не перестанет работать в одном потоке и не перестанет этот поток забивать другими вычислениями.
Хороший тому пример - динамические зоны стримера: в реальной ситуации (с онлайном) ответ о том, что игрок вошёл в зону или вышел из неё приходит на сервер с запозданием, ибо стример обрабатывает все данные в своём потоке и лишь отсылает серверу ответ, который не обрабатывается сразу, а встаёт в общую очередь (и чем сложнее в твоём моде системы или хуже реализация систем, тем больше будет задержка).
Сообщение от
Black Fox
Допускаю, тогда проясни пожалуйста, в чем причина? (это не сарказм)
Единственная причина которую я вижу - люди хотят потом отлаживать скрипты более комфортно (профайлером или чем-то еще). Т.е. они пишут public чтобы пробросить имя функции в amx. Но тогда у меня другой вопрос - почему авторы туториалов молчат об этом, о причинах использования пабликов? Это, разумеется, вопрос риторический - они меня не слышат.
По поводу stock - мод не библиотека. Ему не нужен stock. Возможно за исключением редких архитектурных решений, но уверяю - их нету у людей, ищущих код в 1 файл.
Потому что это крайне несущественная информация, которая никак особо не влияет на работу мода в целом. Ты хоть все функции определяй через атрибут public - принципов обработки кода это не изменит и сервер не сломает. А stock в SA-MP используют чаще всего лишь из синтаксических соображений (дабы визуально отделить функции, что вызываются сервером/таймером/CallLocalFunction и т.п., от тех, что просто вызываются в коде). И от того, что ты начнёшь использовать public/stock/static и т.п. только по их предназначению, ты не сделаешь ровным счётом ничего, что могли бы ощутить твои игроки. Это больше на понтокод походит, хоть отчасти это и правильно.
Пока всё, что ты говоришь, является пессимизацией: ты пытаешься ускорить работу того, что и так работает достаточно быстро. Если хочешь избавиться от лагов и проблем, то следует не мазохизмом подобным заниматься, а писать свой клиент или хотя бы клиентский патч в виде лаунчера. А бэкэнд сервер - это бессмысленная трата времени и бессмысленное усложнение алгоритмов. Для того, чтоб твой сервер не лагал из-за мода, достаточно просто написать нормальный код и продумать алгоритмы. Всё.
И да, ты писал, мол использование бэкэнд серверов - нормальная практика во многих приложениях. Так может она потому в них и нормальная, что и архитектура проекта позволяет, и действительно есть проблемы, которые иначе не решить? Машина вон тоже без колёс ездить не может. Но это ведь не значит, что колёса нужно к табурету приделывать из-за этого.