Доброго времени суток! Эта тема является началом рубрики о оптимизации игровых серверов SA:MP!
Пoжaлуй нaчнeм c caмыx глaвныx oшибoк cтaрыx мoдoв (таких как The Godfather): 1) OnPlayerUpdate: данная функция служила, как сохранение в аккаунт серверных переменных. Но с выходом версии 0.2X, появилась функция, с таким же названием, служащая для быстрого обмена информации между игроком и сервером. И новички сразу же пришли в шок, увидев ужаснейшие лаги на сервере. Так что выход из ситуации - переименовать OnPlayerUpdate в другую функцию.
2) MAX_PLAYERS: сколько вы знаете серверов, имеющих онлайн 500 человек? GW? Думаю на этом и закончен наш немногочисленный список. Так зачем же нам эти огромные циклы, содержащие 500 проходов, при максимальном онлайне 20, 50, 100? Пустая трата времени. Если вы не можете вывести максимальное чисто игроков, то установите значение слотов, и допустим назвав #define MAX_REALPLAYERS 100 или меняйте значение "100" на своё. Так же можно вычеслять максимальный ID игрока, подсчетом в OnPlayerConnect и OnPlayerDisconnect.
3) MAX_VEHICLES: тоже самое, что и с MAX_PLAYERS, только MAX_VEHICLES имеет значение 2000. Вычислить колличество машин на сервере можно с помощью присвоения какой либо переменной, например maxcars, последней машине в OnGameModeInit. Не забываем про команду /veh, которая добавляет машины на сервер, поэтому нужно тут менять значение переменной.
Но с массивами простая переменная не пройдет, тут нужна константа, поэтому можно взять колличество ваших машин + 100 и записать в директиву препроцессора #define MAX_CARS 400 и использовать для массивов.
4) Таймер CustomPickups: полностью не оправдывает себя. Для чего нужен OnPlayerPickUpPickup? Совершенно глупо каждую секунду вызывать функцию, которая выводит тебе какое либо действие, при заходе игрока в определенную точку.
5) Двойной вызов таймера при открытии ворот:
К примеру:
Code
...
MoveObject(lcngate,1284.171631, -2056.462891, 53.184753,3);
lcngatetimer = SetTimer("LCNGate", 7000, 0);
SetTimer("LCNGate", 7000, 0);
...
+ уничтожение таймера, после вызова функции LCNGate. Тоже абсолютно не нужно, потому-что таймер "одноразовый" и больше не будет вызываться. Соответственно оставляем просто SetTimer("LCNGate", 7000, 0);
На этом закончена вводная часть оптимизации Godfather.