Доступ к архиву

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Оптимизация кода

Статус
В этой теме нельзя размещать новые ответы.

Advokat48

Изучающий
Пользователь
Регистрация
21 Окт 2011
Сообщения
360
Лучшие ответы
0
Репутация
242
Недавно загнался, и решил оптимизировать код, т.к. слишком много жрал он памяти. В итоге просмотрев добрую половину интернета, посетив кучу форумов, оптимизировал свой мод. Давайте я расскажу, что же я вычитал, и что усвоил:
1. Лучше использовать как можно меньше таймеров, так как с каждым созданным таймеров, увеличивается нагрузка на проц, и серв требует больше памяти.
2. Лучше не создавать массивы типа:
PHP:
new string[777];
А просчитать, сколько символов будет записываться в массив. Для справки: максимальное значение, которое можно выводить в SendClientMessage - 144
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, "Ты нуб");
}
4. Функции, которые не вызываются таймером лучше помещать в stock, a не public
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");
}
6. В некторых случаях лучше использовать переключатель(switch), нежели if...else.
Про 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
Сокращают MAX_PLAYERS с 500 до 50.
Кто-то использует для получения количества игроков функцию GetMaxPlayers(), но тут есть минус, если у меня на сервере 3 игрока с идами 0,7,28, то циклу приходилось бы совершать 28 тактов. Уже лучше но все-равно не идеал.
Тут приходит на помощь так сказать Псевдодинамический массив, для хранения ид подключенных игроков.
Итак:
Создаем глобальный массив:
PHP:
new PlayerIDs[MAX_PLAYERS];//MAX_PLAYERS по умолчанию равна 500
Далее создадим переменную, которая будет содержать количество игроков, которые находятся на сервер:
PHP:
new MaxPlayers = 0;//делаем ее равной 0
Далее мы очищаем весь массив PlayerIDs при запуске мода, т.е. вставляем в public OnGameModeInit()
PHP:
for(new i=0;i<sizeof(PlayerIDs);i++){PlayerIDs[i] = -1;}
Теперь в public OnPlayerConnect добавляем операции с глобальными переменными:
PHP:
PlayerIDs[MaxPlayers] = playerid;//в последнюю ячейку массива PlayerID записываем ид игрока, который подключился  
MaxPlayers++;//делаем +1 в этой переменной, т.е. если серв был пустой. я подключился, переменная MaxPlayers поменяла значение с 0 на1, и так далее с приростом игроков
Если игрок отключается, нам надо будет очистить его ячейку(PlayerID), и пустой слот нам тоже не надо хранить. Поэтому присвоим ему значение самого последнего слота PlayerID, и последний уже очищаем. Так что в public OnPlayerDisconnect ставим:
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, "Нуб");  
}
Ну все, урок подготовил: Advokat48, специально для Pawno-Info.
Удачи в скриптинге.
P.S. мод оптимизируйте сразу.
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу