Многие, кто хочет открыть свой сервер, естественно хотят, что бы на их сервере играло много людей. Но сможет ли Ваш мод выдержать большое кол-во игроков?Если Ваш мод не оптимизирован, то нет.
Но это никуда не годится. Во-первых, цикл будет проверять условие для всех игроков, даже для тех, которые не подключены к серверу, во-вторых, после выполнения условия, цикл продолжит свою работу, что нам не нужно. Поэтому правильнее будет так:
Код
for(new idx=3;idx<MAX_PLAYERS;idx++) { if(!IsPlayerConnected(idx)continue;//если игрок не подключен, то пропускаем шаг цикла с этим id if(idx==3){ //действие breal;//после выполнения условия, выходим из цикла, он нам больше не нужен } }
Так же один хороший скриптер OkStyle выяснил, что GetMaxPlayers(); работает быстрее, чем макрос MAX_PLAYERS, поэтому самый оптимизированный вариант будет такой:
Код
for(new idx=3;idx<GetMaxPlayers();idx++) { if(!IsPlayerConnected(idx)continue;//если игрок не подключен, то пропускаем шаг цикла с этим id if(idx==3){ //действие breal;//после выполнения условия, выходим из цикла, он нам больше не нужен } }
Строковые массивы
Часто вижу как скриптеры объявляют строковой массив больших размеров под маленькие тексты, наподобие
Код
new string[128];//а иногда и по 256, и по 1000!
Это неверно, так вы быстро забьёте стек ( память, выделенную под выполнение скрипта ). Поэтому лучше всегда считать, кол-во необходимых символов, например:
Код
format(string,sizeof(string),"Игрок %s зашёл на сервер",Name(playerid));
И лучшим массивом под эту строку будет:
Код
new string[22+MAX_PLAYER_NAME];//пробелы тоже символы!
Возвращение строковых массивов
Многие начинающие скриптеры считают, что функция Name очень удобная
Код
stock Name(i) { new pl[MAX_PLAYER_NAME]; GetPlayerName(i, pl, MAX_PLAYER_NAME); return pl;
Согласен, удобно, но возвращение строковых массивов приводит к быстрому засорению стека! Поэтому лучше будет так: В enum pInfo ( у вас может быть по-другому )
Можно использовать стандартный командный процессор, но он очень медленный и неудобный. Я же советую использовать процессор D_CMD, он самый быстрый на сегодняшний день и весьма удобен ( гораздо удобнее стандартного, и даже удобнее ZCMD ).
Как использовать этот процессор и где его скачать, вы можете найти в интернете.
Таймеры
В таких модах, как РЛС, очень много глобальных таймеров, что не есть хорошо. Потому что во время выполнения скрипта, может работать только одни таймер. Например. У нас есть 2 таймеры, одни на 5 секунд, другой на 10. Так вот сначала мы ждём 5 секунд, затем выполняются действия в первом таймере, потом ждём 10 секунд, выполняются действия во втором таймере. Такое действо создаёт неслабую нагрузку на мод. Поэтому следует избегать большого кол-ва глобальных таймеров.
Теперь о таймерах обновления игрока. Существует стандартный таймер OnPlayerUpdate, но он выполняется 25 раз в секунду! И если там много действий, то это создаст большую нагрузку на мод. Поэтому лучше использовать секундные таймеры. Но опять же не такие как в РЛС подобных модах.
Код
public PlayersUpdate() { for(new i=0;i<MAX_PLAYERS;i++) { //действия } }
Если у нас на сервере 1000 игроков, то действия для 1000-ого игрока не выполнятся, пока не произойдут действия для предыдущих 999 игроков, да и цикл прибавляет времени, что растянет наш секундный таймер на 1,5-3 секунды, а ведь за это время ничего другого в скрипте не выполняется, сервер будет лагать. Поэтому лучше использовать отдельный таймер для каждого игрока. Да, это противоречит написанному выше, но в данном случае 1000 таймеров будут выполнятся быстрее и создавать меньше нагрузки, чем 1, но кривой. Вот как сделано у меня. Ко всем new
Приведу банальный пример, цикл на парсинг игроков Создадим переменную для хранения id вектора.
Код
new VectorID;//id вектора
В OnPlayerConnect добавим запись id игрока в вектор
Код
vector_push_back(VectorID,playerid);
В OnPlayerDisconnect добавим удаление id игрока из вектора vector_remove(VectorID, playerid);
Сделаем макрос для удобства
Код
#define NewCycle(%0,%1) for(new d, x = vector_size(%1); d != x; %0 &= 0, %0 += vector_get(%1, d++))
Теперь мы можем использовать функцию NewCycle(idx,VectorID);, где idx - id игрока, в нашем случае,а VectorID - id вектора.
Теперь сам перебор new playerid; // создадим переменную
Код
NewCycle(playerid) // запускаем цикл { if(playerid == -1) continue; // если id не найден в векторе, продолжаем с другим id ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,"test","test","test",""); // покажем всем игрокам диалог. }
На данный момент плагин Vectoral самый быстрый способ перебора чего-либо в pawn.
Дата: Воскресенье, 03.08.2014, 03:29 | Сообщение # 8
Новичок
Сообщений: 9
Статус: Offline
ПОМОГИТЕ!Мод MYSQL выдаёт ошибку, БД норм, в моде всё правильно, на localhost всё норм.А вот такая фигня https://yadi.sk/d/oo6Q4hYXYw6Xc и псоле прогужает дальше и выводит мод Unknow Advance Role Plya - Orange Server
Сообщение отредактировал Riko_Rosati - Воскресенье, 03.08.2014, 03:30
Дата: Воскресенье, 03.08.2014, 04:51 | Сообщение # 9
Боец
Сообщений: 69
Статус: Offline
ЦитатаRiko_Rosati ()
ПОМОГИТЕ!Мод MYSQL выдаёт ошибку, БД норм, в моде всё правильно, на localhost всё норм.А вот такая фигня https://yadi.sk/d/oo6Q4hYXYw6Xc и псоле прогужает дальше и выводит мод Unknow
ЧУВАК!1111 ТЫ тупишь? плагины подключи разделом ошибся