Почему в самп максимум 1000 слотов
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.
Покупка дает возможность:
Маппинг для сервера
Если вы хотите обновить Ваш сервер новыми доработками - то зайдите в наш раздел. Большой выбор готовых решений от наших пользователей
Моды для сервера
Огромный выбор различных модификаций для Вашего сервера. Пролистайте эти темы! Возможно именно там Вы найдете то, что искали уже давно.
Модификации SA
Хотите разнообразить свою игру в San Andreas? Смелее в наш раздел. Отличный сборник готовых решений. Играйте с удовольствием
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.Вам необходимо обновить браузер или попробовать использовать другой.
Mr.Pawn
Заблокирован
Здравствуйте, дорогие пользователи P-I, я прочитал много форумов,тем про оптимизацию модов и об нагрузок на серверов самп,и решил написать тему об том что я узнал, думаю, данная статья пойдёт вам в пользу.
Правда лучше прочитать 1 тему,чем 5-10 и не на одном форуме?!Я не говорю что я придумал всю эту перечисленную оптимизацию,я вам даю советы которые узнал за своё пользование в Pawn и советы других программистов.
Старайтесь использовать в моде как можно меньше таймеров, т.к. каждый таймер увеличивает нагрузку на процессор, и сервер требует больше памяти, в случае этого часто у игроков (вылеты), тормозит и падает сервер.
По оптимизацию таймеров я видел не плохой урок, спасибо за это XemyL
Ещё урок от XemyL,по поводу глобальных таймеров - ТЫК
Ссылка на урок – Клабительно (Не реклама)
не злоупотре***йте этим пабликом, т.к. он обновляется 25 раз в секунду,(как игрок ловит пакеты)да и зависит от пинга игрока, лучше создайте таймер и поместите функцию туда, лучше будет таймер стоять на 1 сек, то есть проверяться 1 раз в секунду, чем будет обновляться этот паблик 25 раз в секунду, а то и больше.
Я часто замечаю многие скриптеры используют функции так:
Но зачем их использовать так?Когда есть более быстрее способ вызвать функцию,через stock,выглядеть это будет вот так:
Только вот функции вызываемые через таймер нельзя поместить в stock,можно рассмотреть вот такой вариант:
Данный макрос от OKStyle позволит вам не форвардить функции таймеров,выглядеть это будет так:
Согласитесь, этот вариант более проще чем этот:
Проверка будет выглядеть вот таким видом:
Есть один минус,вот у нас 100 слотов,а игроков всего 30-40 т.к. мы определили значение - (MAX_PLAYERS) на 100,то у нас будет идти проверка на 100 игроков,ну вот тут есть вот такая функция: GetMaxPlayers(),она определяет онлайн игроков на сервере и сканирует только это количество,на данный момент это 30-40,виглядеть это будет вот так:
Есть один минус,когда у нас будет например 5 игроков с идами: (0,10,15,20,60) то он будет сканировать 61 ид,так вот есть решение это проблемы псевдодинамический массив, для хранения идов подключенных игроков:
- Переменная содержащая количество игроков на сервере
Очистим весь массив PLIDs,в OnGameModInit:
Операции с глобальными переменными,в OnPlayerConnect:
Игрок подключается, и его ид помещается в последнюю свободную ячейку массива PLIDs, ну а переменная MaxPlayers становится на единицу больше.
С пабликом OnPlayerDisconnect все немного сложнее. Игрок выходит, то есть слот в PLIDs который занимала его ид надо очистить.
Но мне не нужен пустой слот, поэтому я присваиваю ему значение самого последнего слота PLIDs, и вот последний уже очищаю:
Всё,теперь осталось оптимизировать массивы,массив был таким:
Также существует инклюд foreach,он считается более лучшим по оптимизации цыкла игроков.
Использование форича на динамических системах - (клабительно)думаю пригодаться вам,Автор - Пельмень
Также есть Vectoral,он намного быстрее чем форич.
Урок взят с темы: Единая тема оптимизации v1 | v2
Автор урока: Tracker1
Векторы для хранения игроков:
плюсы:
+ БЕШЕННАЯ СКОРОСТЬ ПЕРЕБОРА ВСЕХ ИГРОКОВ.
минусы:
- Твою мать, ни*** не понятно же
в OnGameModeInit
PLAYERS = cvector();
в соответствующие паблики
public OnPlayerConnect(playerid) < // When player connect
vector_push_back(PLAYERS,playerid); // Insert the player
>
public OnPlayerDisconnect(playerid,reason) new idx = vector_find(PLAYERS,playerid); // Find player
if(idx !=-1) < // If idx == -1, Vector didn't contains this player
vector_remove(PLAYERS,idx);
>
>
Использование
stock SendMessage() for(new idx=0, playerid=0; idx<vector_size(PLAYERS); idx++) < // Цикл
playerid = vector_get(PLAYERS, idx); // Берем плеерид
if(playerid != -1 && GetPlayerTeam(playerid)==NO_TEAM) SendClientMessage(playerid,0xFFFFAE00,"Чувак, без тимы не круто. Хочешь присоединиться к нам?");
>
>
>
Теперь давайте поговорим о MAX_VEHICLES,в сампе на данный момент максимум 2000 транспорта,но если у вас 1000 транспорта на сервере то зачем проверять или ещё что либо 2000 транспорта?!
Решение данной проблемы ниже:
Старайтесь не использовать цыкл в цыкле,пример:
Этот цикл выполнится 500 раз по 500,почему 500?!Потому что глобальная переменная - (MAX_PLAYERS) по умолчанию равна 500,старайтесь не использовать цыкл в цыкле,даже при оптимизации массивов,цыклов,приведёнными выше.
Если вы часто используете один и тот же код,лучше создайте для него функцию,часто это я вижу с GetPlayerName (для узнавания никнейма игрока)пример:
Но опять же мы сталкиваемся с тем что данная функция возвращает строку,а это ведёт к переполнению стека.
Подробней о переполнении стека (клабительно)(Не реклама)
И как же нам быть?!Мы поступим так,как поступил OKStyle:
В enum pInfo добавляем переменную:
В public OnPlayerConnect :
Теперь мы избавимся от переполнении стека из этой функции,но как её использовать?!
Если,вы хотите использовать более удобней то мы добавим макрос:
Вот таким он будет табуляционным(лесонкой):
Но мы можем этот код оптимизировать,он будет работать намного быстрее,получиться вот так:
Заметьте этот код и следующий я его немного изменил,так будет ещё лучше:
Вы наверно хотите узнать подробней о switch,да без проблем,спасибо за это pozitiv4eg (клабительно)(Не реклама)
Многие думают что,если мод оптимизирован то он будет занимать меньше строк,да это так,но смотря при написании чего-либо пример ниже:
Вот на выше примере,этот код оптимизированный,он занимает 15 строчек.
Этот код не оптимизированный,но занимает 12 строчек,и работает на много медленнее чем первый,думаю вы поняли что,не главное сколько будет строк в коде,главная суть оптимизации это быстрота и эффективность кода.
Старайтесь использовать стандартные функции, в большинстве случаев они быстрее чем их аналоги написанные сторонними скриптерами.
Часто в модах return в таких формах: return true; и return false; лучше их перевести в данную форму:
Я когда ещё не знал об оптимизации мода,мне посоветовали его оптимизировать и всё будет пучком,ну я стал искать мануалы,и вот наткнулся на public OnPlayerCommandText,загляните в свой public OnPlayerCommandText
Посмотрите код на подобие этого new cmd[256]; new tmp[256];
Вот смотрите:
Вот посмотрите внимательно,перед командой /minigun стоит cmd,массив данной переменной равен 256,но зачем нам 256 ячеек. Когда можно поставить 128,т.к в команде максимально 128 ячеек,для данной команды хватает 8 ячеек,то есть new cmd[8];
В среднем в нормальном моде около 100 команд,представьте сколько нагрузки идёт,давайте посмотрим команду по умолчанию:
Заметьте там стоит cmdtext а не cmd,переменная cmdtext используется по умолчанию в паблике,если заменить все cmd на cmdtext и убрать переменную с массивом,то будет на много меньше нагрузки.
На счёт команд,я вам точно сказать не могу,на чём они лучше,т.к не проверял.
Как узнаю,обязательно внесу сюда.
Также я замечал многие используют "быдло код" пример ниже:
Ведь можно сделать вот так:
Ещё одна немаловажная часть, это рейты,при правильной настройке снизится пинг, лаги, нагрузка и пр.
Итак, заходим в server.cfg и там:
Если на вашем сервере играет до 100 человек, то:
Если же на вашем сервере играет от 200 до 500 игроков, то:
На счёт античитов,вообще от них идёт тоже нагрузка,мой совет,убрать их с сервера,пусть админы работают. Так будет всем интересней,и есть чем заняться админу,у игроков проявиться интерес обмануть и т.д. в последнее время куда не зайди везде античиты,вспомните раньше года 3 назад,особо не были развиты античиты,да и интерес игры больше был.
Я помню когда я был навичёк в этому деле,мне один умный скриптер сказал,пусть у тебя будут 20 простых работ,чем 1 сложная.
Я вот по сей день стараюсь придерживаться этого,и вам советую поможет в оптимизации.
На сегодня закончим наш урок,со временем буду дорабатывать,обновлять,испровлять тему,ещё раз повторяю я не всё придумал,я сюда внёс основные виды оптимизации,прошу читателей не писать коментарии на подобие этого:
"я проста пздц как умею аптимизировать моды","бред!" "у миня круче метады!" ""
За новые методы (которых здесь нет),я буду только рад,буду давать плюсы и добавлять в первый пост.
Лимиты
SA:MP имеет ограничения на множество вещей. Вот краткий обзор почти всех общих ограничений в SA:MP.
Скриптинг | 0.3.7 |
---|---|
Игроки | 1000 |
Машины ✝✝ | 2000 |
Модели машин | Неограниченно ** |
Объекты ✝✝ | 1000 |
Виртуальные миры | 2,147,483,647 |
Интерьеры | 255 |
Классы | 320 |
Иконки на карте ✝✝ | 100 |
Гоночные чекпоинты ✝✝ | 1 |
Чекпоинты ✝✝ | 1 |
Пикапы ✝✝ | 4096 |
Общие 3D метки ✝✝ | 1024 |
3D метки игроков ✝✝ | 1024 |
Строка Chat Bubble | 144 символа |
Длина текста в SetObjectMaterialText,SetPlayerObjectMaterialText | 2048 символов |
Зоны банд | 1024 |
Меню | 128 |
Прикрепленные к игроку объекты | 10 |
Переменные игрока | 800 |
Актёры (начиная с 0.3.7) ✝✝ | 1000 |
Сервер | 0.3.7 |
Гейммоды | 16 |
Фильтрскрипты | 16 |
Вводимый текст (чат и команды) | 128 ячеек (512 байт) |
Выводимый текст | 144 ячеек (576 байт) |
Длина ника (SetPlayerName) | 24 символа |
Textdraws | 0.3.7 |
Длина строки | 1024 символов *** |
Отображаемые на экране игрока | 2048 + 256 ✝ |
Отображаемые на экране игрока (спрайты) | 100 |
Созданные на сервере (Глобальные) | 2048 |
Созданные на сервере (Для игроков) | 256 |
Диалоги | 0.3.7 |
ID диалогов | 32767 |
Информация (Основной текст) | 4096 |
Заголовок | 64 |
Вводимый текст (DIALOG_STYLE_INPUT/PASSWORD) | 128 |
Столбцов (DIALOG_STYLE_TABLIST(_HEADERS) | 4 |
Символов в столбце (DIALOG_STYLE_TABLIST(_HEADERS) | 128 |
Символов в строке (DIALOG_STYLE_TABLIST(_HEADERS) | 256 |
- (**) Несмотря на то, что лимит моделей транспорта в версии 0.3 неограничен, если у вас большое количество транспорта, вы можете заметить, как транспорт динамически выгружается/загружается. Рекомендуется использовать не более, чем 150 видов моделей транспорта.
- (***) Несмотря на то, что максимальное количество символов в TextDraw - это 1024, использование цветовых кодов (например
Почему на SAMP серверах максимальное кол-во мест - 1000. Почему нету 2000, 3000 и т. д.
Например проект-гигант САМП РП или Даймонд. У них онлайны 1000 постоянно. Разве не выгодно сделать 2000 людей.
Starving Trancer Просветленный (46847) просто самп по себе такой ненадёжный костыль что 2000 запросто устроят "революцию в матрице" (попросту через 5 мин завалят сервак) куда стабильней кажется MTA
Нагрузки больше будет. Тем более, если онлайн, допустим, всегда примерно 452, то даже 700 слотов хватит.
Читайте также: