- Регистрация
- 21 Окт 2011
- Сообщения
- 360
- Лучшие ответы
- 0
- Репутация
- 242
Недавно загнался, и решил оптимизировать код, т.к. слишком много жрал он памяти. В итоге просмотрев добрую половину интернета, посетив кучу форумов, оптимизировал свой мод. Давайте я расскажу, что же я вычитал, и что усвоил:
1. Лучше использовать как можно меньше таймеров, так как с каждым созданным таймеров, увеличивается нагрузка на проц, и серв требует больше памяти.
2. Лучше не создавать массивы типа:
А просчитать, сколько символов будет записываться в массив. Для справки: максимальное значение, которое можно выводить в SendClientMessage - 144
3. Лучше не использовать pragma tabsize, и по-тихому заняться Табировкой кода, т.к. очень сильно грузит мод(Еще Пахан с SoFLY мне говорили, когда давненько увидели мой кривой код)
Пример НЕ табированного кода:
Как будет выглядить этот код, после табуляции:
4. Функции, которые не вызываются таймером лучше помещать в stock, a не public
5. Если у переменной может быть значение либо 0(false), либо 1(true), то лучше использовать тип переменной bool.
Пример:
6. В некторых случаях лучше использовать переключатель(switch), нежели if...else.
Про swithc смотреть тут: Click
7. Как говаривает народ. что лучше никогда не использовать цикл в цикле.
8. Ну и науонец дошел до самого интересного: Оптимизация циклов MAX_PLAYERS
Нашел на каком-то форуме.
Сама MAX_PLAYERS определяется в <a_samp> и по-умолчанию равна 500.
Многие используют такую оптимизацию:
Сокращают MAX_PLAYERS с 500 до 50.
Кто-то использует для получения количества игроков функцию GetMaxPlayers(), но тут есть минус, если у меня на сервере 3 игрока с идами 0,7,28, то циклу приходилось бы совершать 28 тактов. Уже лучше но все-равно не идеал.
Тут приходит на помощь так сказать Псевдодинамический массив, для хранения ид подключенных игроков.
Итак:
Создаем глобальный массив:
Далее создадим переменную, которая будет содержать количество игроков, которые находятся на сервер:
Далее мы очищаем весь массив PlayerIDs при запуске мода, т.е. вставляем в public OnGameModeInit()
Теперь в public OnPlayerConnect добавляем операции с глобальными переменными:
Если игрок отключается, нам надо будет очистить его ячейку(PlayerID), и пустой слот нам тоже не надо хранить. Поэтому присвоим ему значение самого последнего слота PlayerID, и последний уже очищаем. Так что в public OnPlayerDisconnect ставим:
Все теперь можем оптимизировать циклы.
Пример не оптимизированного цикла:
Что будет после оптимизации:
Ну все, урок подготовил: Advokat48, специально для Pawno-Info.
Удачи в скриптинге.
P.S. мод оптимизируйте сразу.
1. Лучше использовать как можно меньше таймеров, так как с каждым созданным таймеров, увеличивается нагрузка на проц, и серв требует больше памяти.
2. Лучше не создавать массивы типа:
PHP:
new string[777];
3. Лучше не использовать pragma tabsize, и по-тихому заняться Табировкой кода, т.к. очень сильно грузит мод(Еще Пахан с SoFLY мне говорили, когда давненько увидели мой кривой код)
Пример НЕ табированного кода:
PHP:
if(PlayerInfo[playerid][pBlabla] == 0)
{
if(PlayerInfo[playerid][pSex] == 1)
{
SetPlayerPos(playerid, X,Y,Z);
}
else
{
SetPlayerPos(playerid, X,Y,Z);
}
}
else
{
SendClientMessage(playerid, 0xFFFFFF, "Ты нуб");
}
PHP:
if(PlayerInfo[playerid][pBlabla] == 0)
{
if(PlayerInfo[playerid][pSex] == 1)
{
SetPlayerPos(playerid, X,Y,Z);
}
else
{
SetPlayerPos(playerid, X,Y,Z);
}
}
else
{
SendClientMessage(playerid, 0xFFFFFF, "Ты нуб");
}
5. Если у переменной может быть значение либо 0(false), либо 1(true), то лучше использовать тип переменной bool.
Пример:
PHP:
...
bool:pDirving,
...
PHP:
if(PlayerInfo[playerid][pDriving] == false)
{
SendClientMessage(playerid, 0xFFFFFF, "У вас нет прав, и pDriving равно 0");
}
else
{
SendClientMessage(playerid, 0xFFFFFF, "У вас есть права, и pDriving равно 1");
}
Про swithc смотреть тут: Click
7. Как говаривает народ. что лучше никогда не использовать цикл в цикле.
8. Ну и науонец дошел до самого интересного: Оптимизация циклов MAX_PLAYERS
Нашел на каком-то форуме.
Сама MAX_PLAYERS определяется в <a_samp> и по-умолчанию равна 500.
Многие используют такую оптимизацию:
PHP:
#if defined MAX_PLAYERS
#undef MAX_PLAYERS
#define MAX_PLAYERS 50
#else
#define MAX_PLAYERS 50
#endif
Кто-то использует для получения количества игроков функцию GetMaxPlayers(), но тут есть минус, если у меня на сервере 3 игрока с идами 0,7,28, то циклу приходилось бы совершать 28 тактов. Уже лучше но все-равно не идеал.
Тут приходит на помощь так сказать Псевдодинамический массив, для хранения ид подключенных игроков.
Итак:
Создаем глобальный массив:
PHP:
new PlayerIDs[MAX_PLAYERS];//MAX_PLAYERS по умолчанию равна 500
PHP:
new MaxPlayers = 0;//делаем ее равной 0
PHP:
for(new i=0;i<sizeof(PlayerIDs);i++){PlayerIDs[i] = -1;}
PHP:
PlayerIDs[MaxPlayers] = playerid;//в последнюю ячейку массива PlayerID записываем ид игрока, который подключился
MaxPlayers++;//делаем +1 в этой переменной, т.е. если серв был пустой. я подключился, переменная MaxPlayers поменяла значение с 0 на1, и так далее с приростом игроков
PHP:
for(new i=0;i<MaxPlayers;i++)
{
if(PlayerIDs[i] == playerid)
{
MaxPlayers--;
PlayerIDs[i] = PlayerIDs[MaxPlayers];
PlayerIDs[MaxPlayers] = -1;
break;
}
}
Пример не оптимизированного цикла:
PHP:
for(new i=0;i<MAX_PLAYERS;i++)
{
if(!IsPlayerConnected(i)){continue;}
SendClientMessage(i, -1, "Нуб");
}
PHP:
for(new i=0;i<MaxPlayers;i++)
{
SendClientMessage(PalyerIDs[i], -1, "Нуб");
}
Удачи в скриптинге.
P.S. мод оптимизируйте сразу.
Последнее редактирование: