27 посетителей на сайте. Из них:
Пользователи2
Роботы25
Список пользователей
Мистер Позитивчик Сейчас на сайте
Darkwood Сейчас на сайте
Vaxxx Vaxxx Сейчас на сайте
Maloy Был(a) в сети 3 минуты назад
squad busters Был(a) в сети 3 минуты назад
Block Games Был(a) в сети 8 минут назад
Ab Antonian Был(a) в сети 12 минут назад
drift Был(a) в сети 14 минут назад
Анна Бондаренко Был(a) в сети 14 минут назад
Nikita Kotov Был(a) в сети 16 минут назад
Tymur Koval Был(a) в сети 16 минут назад
CATALLA STREAM Был(a) в сети 17 минут назад
Htrad Был(a) в сети 17 минут назад
Awesome Был(a) в сети 19 минут назад
Сергей Малышев Был(a) в сети 21 минуту назад
Том Паттисон Был(a) в сети 23 минуты назад
Дима Воронин Был(a) в сети 26 минут назад
Demon Был(a) в сети 27 минут назад
K. Был(a) в сети 29 минут назад
Bgbg Был(a) в сети 38 минут назад
kinolog2019 Был(a) в сети 38 минут назад
Vaflly Mmmna Был(a) в сети 39 минут назад
Maks Suicid Был(a) в сети 43 минуты назад
Убитый Или живой Был(a) в сети 58 минут назад
Enotik Был(a) в сети 1 час назад
prosto Pro Был(a) в сети 1 час назад
No ob Был(a) в сети 1 час назад
Azazel Был(a) в сети 1 час назад
Denis_Hatred Был(a) в сети 1 час назад
Сергей Попов Был(a) в сети 1 час назад
Ярослав Был(a) в сети 1 час назад
Радмир Сотрудка Был(a) в сети 2 часа назад
дидибок Был(a) в сети 2 часа назад
Георгий Скобелев Был(a) в сети 2 часа назад
WiseBear Был(a) в сети 2 часа назад
butu111 Был(a) в сети 2 часа назад
Add Dd Был(a) в сети 2 часа назад
Shaorigta Licence Был(a) в сети 2 часа назад
Иван Демидов Был(a) в сети 2 часа назад
meow youtube Был(a) в сети 2 часа назад
Никита Любар Был(a) в сети 2 часа назад
Игровой Аккаунт Был(a) в сети 2 часа назад
Сіряк Сергій Был(a) в сети 2 часа назад
Коля Рожков Был(a) в сети 2 часа назад
Юрий Русакоа Был(a) в сети 2 часа назад
toryko pepe2 Был(a) в сети 3 часа назад
998 Был(a) в сети 3 часа назад
szafh Был(a) в сети 3 часа назад
Михаил Был(a) в сети 3 часа назад
Габрик Пони Был(a) в сети 3 часа назад
Дмитрий Был(a) в сети 3 часа назад
Марія Смаглова Был(a) в сети 3 часа назад
Костян Ветров Был(a) в сети 3 часа назад
Илья Был(a) в сети 3 часа назад
fuckinbando beats Был(a) в сети 3 часа назад
Давид Был(a) в сети 3 часа назад
Skobo4ka Был(a) в сети 3 часа назад
SLUK apk Был(a) в сети 4 часа назад
Был(a) в сети 4 часа назад
Арсений Был(a) в сети 4 часа назад
Валерий Шлыков Был(a) в сети 4 часа назад
TONI OWNPONI Был(a) в сети 4 часа назад
MixFix Был(a) в сети 4 часа назад
Франческо Фоулдсман Был(a) в сети 4 часа назад
MTA SCRIPTS by YAREGSKIY Был(a) в сети 4 часа назад
L A V I R Был(a) в сети 4 часа назад
Егор Мих Был(a) в сети 4 часа назад
Вагнер Вагнер Был(a) в сети 4 часа назад
ГРИГОРИЙ ШАРОВ Был(a) в сети 4 часа назад
No Name Был(a) в сети 4 часа назад
Никита жосан Был(a) в сети 4 часа назад
over tripsize Был(a) в сети 4 часа назад
Егор Петров Был(a) в сети 4 часа назад
никита бочкарев Был(a) в сети 4 часа назад
ZLONIMAN Был(a) в сети 4 часа назад
ЛВС 97 Был(a) в сети 5 часов назад
kazinoradi kalov Был(a) в сети 5 часов назад
Organizator Volhrbnik Был(a) в сети 5 часов назад
Zorro Был(a) в сети 5 часов назад
HepBHblu Был(a) в сети 5 часов назад
Denis Nikolaevich Был(a) в сети 5 часов назад
Инна Шава Был(a) в сети 5 часов назад
егрп Был(a) в сети 5 часов назад
мультипоп Был(a) в сети 5 часов назад
Kelenko Был(a) в сети 5 часов назад
issqvm Был(a) в сети 5 часов назад
Arsenei Был(a) в сети 5 часов назад
Артем Власов Был(a) в сети 5 часов назад
Kuba Damirov Был(a) в сети 6 часов назад
Егор Петров Был(a) в сети 6 часов назад
sergy Был(a) в сети 6 часов назад
Сергій Красюк Был(a) в сети 6 часов назад
Діма Малий Был(a) в сети 6 часов назад
Костя костивич Был(a) в сети 6 часов назад
UniON Был(a) в сети 6 часов назад
LiMi Был(a) в сети 6 часов назад
Cur Был(a) в сети 6 часов назад
NOVABOY - PRODUCTION Был(a) в сети 6 часов назад
Елена Иванова Был(a) в сети 6 часов назад
macar bronskij Был(a) в сети 6 часов назад
Александр Был(a) в сети 6 часов назад
Трофим Был(a) в сети 6 часов назад
Grom_ Edit Был(a) в сети 6 часов назад
Ivan Baev Был(a) в сети 6 часов назад
Kirya.07 Был(a) в сети 6 часов назад
Vladimir Golcov Был(a) в сети 6 часов назад
# БОЕВЫЕ КОРЧИ Был(a) в сети 7 часов назад
Роман Был(a) в сети 7 часов назад
Adim129 Был(a) в сети 7 часов назад
Ксения Лисвоа Был(a) в сети 7 часов назад
Ислам Болатов Был(a) в сети 7 часов назад
Laska Был(a) в сети 7 часов назад
Ivan Timoshenko Был(a) в сети 7 часов назад
Brawl_ _hybois Был(a) в сети 7 часов назад
Luca Pawn Был(a) в сети 8 часов назад
Егор Сорокин Был(a) в сети 8 часов назад
Зубков Иван Был(a) в сети 8 часов назад
Ярик Сигма Был(a) в сети 8 часов назад
Ибрагим Госерин Был(a) в сети 8 часов назад
Bafer Sum Был(a) в сети 8 часов назад
Стас Был(a) в сети 8 часов назад
Ваня Андрев Был(a) в сети 8 часов назад
Владимир Был(a) в сети 8 часов назад
Николай Клочков Был(a) в сети 8 часов назад
Nikita Bot Был(a) в сети 8 часов назад
trava Был(a) в сети 8 часов назад
James Lonkol Был(a) в сети 8 часов назад
TaLanT 123 Был(a) в сети 9 часов назад
Никита Щебетин Был(a) в сети 9 часов назад
Владислав Зерской Был(a) в сети 9 часов назад
Viktore34 Yuyrfft Был(a) в сети 9 часов назад
TOKSYCHNIE Был(a) в сети 9 часов назад
Иван Смирнов Был(a) в сети 9 часов назад
Ваня Старков иван Был(a) в сети 9 часов назад
Саша Исаков Был(a) в сети 9 часов назад
Франко Дьявольский Был(a) в сети 10 часов назад
Thomas Clemente Был(a) в сети 10 часов назад
CyJlTuKZ Был(a) в сети 10 часов назад
Никита Зюкин Был(a) в сети 10 часов назад
Савелий Пономарёв Был(a) в сети 10 часов назад
Edgar1998 Был(a) в сети 10 часов назад
Такси Максим Был(a) в сети 10 часов назад
Kevin Sotka Был(a) в сети 11 часов назад
Ximic8881 Был(a) в сети 11 часов назад
Oleg Ebonenko Был(a) в сети 11 часов назад
Сергей Киркин Был(a) в сети 11 часов назад
netGio Был(a) в сети 12 часов назад
Dato Guliazali195 Был(a) в сети 12 часов назад
Василь Куш Был(a) в сети 13 часов назад
Fade C-OPS Был(a) в сети 13 часов назад
Матвей Терещенко Был(a) в сети 14 часов назад
Savaya Grill Был(a) в сети 14 часов назад
DmitryNimal Был(a) в сети 14 часов назад
Макс Уваров Был(a) в сети 14 часов назад
Даниил Девелоп Был(a) в сети 14 часов назад
Stas Koval Был(a) в сети 15 часов назад
14GO Был(a) в сети 15 часов назад
AMIR. TN Был(a) в сети 16 часов назад
Vadim Был(a) в сети 16 часов назад
Jonathan Luís Был(a) в сети 16 часов назад
Feleks34 Был(a) в сети 17 часов назад
Степан Салихов Был(a) в сети 17 часов назад
Stelser Bro Был(a) в сети 17 часов назад
PussyCat Был(a) в сети 17 часов назад
Алексей Сахаров Был(a) в сети 17 часов назад
Был(a) в сети 17 часов назад
Нет Имени Был(a) в сети 17 часов назад
Телега Был(a) в сети 17 часов назад
Айсултан Калибеков Был(a) в сети 18 часов назад
Razvan Augustin Был(a) в сети 18 часов назад
Clopo Alex Был(a) в сети 18 часов назад
Никита Герворский Был(a) в сети 18 часов назад
Павел Был(a) в сети 18 часов назад
Список ботов
rambler (23)
aport (2)

Следите за нами!

Руководство по отладке - как найти ошибки в ваших скриптах

Описание

Во время скриптинга вы часто будете встречать проблемы, незаметные с первого взгляда. Эта страница покажет вам некоторые базовые стратегии локализирования ошибок.

Консоль отладки

MTA предоставляет встроенную консоль отладки, которая показывает отладочные сообщения от функций и скриптов MTA. Ее можно открыть, введя в консоли debugscript x, где x - уровень отладки:

  • 1: только ошибки
  • 2: ошибки и предупреждения
  • 3: ошибки, предупреждения и информационные сообщения

Таким образом, при вводе debugscript 3 видны все сообщения, так что либо этот, либо уровень 2 рекомендованы в большинстве случаев. debugscript следует иметь включенным на протяжении практически всего времени, когда тестируете свои скрипты, это поможет в обнаружении опечаток и других мелких ошибок, позволяя с легкостью их поправить.

Пример

В этом отрывке две ошибки:

if (getPlayerName(player) == "Fedor")
    outputChatbox("Hello Fedor")
end

Когда скрипт, в котором присутствует данный отрывок кода попробует загрузиться, debugscript выведет что-то типа этого:

INFO: Loading script failed: C:\<server path>\mods\deathmatch\resources\myResource\script.lua:15: 'then' expected near ´outputChatbox'

Это значит, что скрипт не может быть обработан в силу синтаксической ошибки. Показывается путь ко скрипту, чтобы можно было также увидеть, частью какого ресурса он является ('myResource' в данном случае), и, конечно, имя самого скрипта. После имени файла показан номер строки и что в ней, собственно, не так. Теперь все с легкостью можно исправить, мы просто забыли оператор 'then':

if (getPlayerName(player) == "Fedor") then
    outputChatbox("Hello Fedor")
end

Сейчас скрипт нормально загрузится и не выведет никаких ошибок, но только пока не выполнится для игрока с ником 'Fedor'. В этом случае, debugscript выведет:

ERROR: C:\<server path>\mods\deathmatch\resources\d\script.lua:15: attempt to call global 'outputChatbox' (a nil value)

То есть, что вызванной функции не существует, что и не удивительно, так как ее правильное название - outputChatBox (с заглавной B):

if (getPlayerName(player) == "Fedor") then
    outputChatBox("Hello Fedor")
end

Это, конечно, лишь пример, есть еще море других сообщений и сценариев, но вам теперь должна быть понятна сама суть.

Ведение отладочного лога на сервере и клиенте

Сервер

Перейдите в: (корневая папка MTA)>server>mods>deathmatch

Там есть два практически одинаковых файла:

  • local.conf - содержит настройки сервера, доступного по нажатию на пункт "host game" главного меню MTA. Это быстрый и простой путь ненадолго запустить сервер извнутри клиента. При выключении клиента выключится и сервер.
  • mtaserver.conf - используется при выполнении запуска "MTA Server.exe" из (корневая папка MTA)>server. Это способ запустить сервер независимо от клиента на продолжительное время.

В зависимости от выбранного вами способа, вам захочется отредактировать один из этих файлов. Настройки, интересные нам:

<!-- Задает имя и путь лог-файла debugscript. Если оставить пустым, такой файл создан не будет. -->
    <scriptdebuglogfile>logs/scripts.log</scriptdebuglogfile> 
    
    <!-- Задает уровень лог-файла debugscript. Допустимые значения: 0, 1, 2, 3. Если не установить, по умолчанию будет 0. -->
    <scriptdebugloglevel>0</scriptdebugloglevel>

Убедитесь, что указали имя лога. Также укажите уровень ошибок, которые будут записываться. При указании 0 ничего не будет записываться. Другие уровни были объяснены в начале данной статьи. При смене уровня записи на 3, все ошибки серверных скриптов будут записаны в (корневая папка MTA)>server>mods>deathmatch>logs>scripts.log

Клиент

Перейдите в: (корневая папка MTA)>server>clientscript.log

В этот файл ведется запись ошибок всех клиентских скриптов. Запись включена по умолчанию, вмешательств не требуется.

Стратегии отладки

Есть несколько стратегий, помогающих в поиске ошибок, мы говорим об отличных от непосредственного просмотра кода, конечно же. Большинство из них включает в себя вывод отладочных сообщений с варьирующейся от ситуации к ситуации информацией.

Полезные функции

Для начала, некоторые функции, которые могут оказаться удобными при отладке.

  • outputDebugString или outputChatBox для вывода информации любого вида
  • tostring() обращает переменную в строковую, например, когда она является бинарной (двоичной)
  • getElementType для выполнения проверки элемента MTA на получение его типа

Добавляйте отладочные сообщения, чтобы проверять когдакак часто и вообще, выполняется ли участок кода

Типичный пример проверки на выполнение участка с if. Чтобы его сделать, просто добавьте любое сообщение, которое вы потом будете в состоянии понять, внутрь участка с if.

if (variable1 == variable2) then
    outputDebugString("вошел в if")
    -- что-нибудь делаем
end

Другое применение - проверка переменной на предмет ее изменения. Для начала найдите все случаи, где переменная редактируется, и добавьте сообщения прямо рядом с ней.

Добавляйте отладочные сообщения для проверки значения переменной

Скажем, вы создали маркер, но он не появляется на той позиции, на которой вы этого хотели бы. Первое, что вы захотите сделать - проверить, была ли выполнена функция createMarker. Но одновременно с этим вы также можете проверить и значения, используемые при выполнении функции createMarker, всего за один запуск.

outputChatBox("posX - "..x.." posY - "..y.." posZ - "..z)
createMarker(x,y,z)

Это выведет в консоль отладки все три переменные, используемые в качестве коодинат для маркера. Подразумевая, что у вас они считываются из map-файла, теперь вы сможете сравнить выведенное в консоль с желаемыми значениями. tostring() гарантирует, что значения переменных смогут быть выведены вместе строкой, даже если они, например, двоичные.

Пример

Представьте, что где-то вы создали колшейп (collision shape) и хотите производить какое-либо действие над игроком, простоявшим в нем 10 секунд.

function colShapeHit(player)
    -- устанавливаем таймер на вывод сообщения (можно также вызвать другую функцию)
    -- сохраняем id таймера в таблице, используя игрока как индекс
    colshapeTimer[player] = setTimer(outputChatBox,10000,1,"Игрок задержался в колшейпе на 10 секунд!")
end
addEventHandler("onColShapeHit",getRootElement(),colShapeHit)

function colShapeLeave(player)
    -- убираем таймер при покидании игроком колшейпа
    killTimer(colshapeTimer[player])
end
addEventHandler("onColShapeLeave",getRootElement(),colShapeLeave)

При попадании игрока в колшейп, в консоль отладки выводится следующее сообщение:

ERROR: ..[path]: attempt to index global 'colshapeTimer' (a nil value)

Что значит, что вы пытались проиндексировать несуществующую таблицу. В образце выше это сделано, так как id таймера сохраняется в таблице. Нам нужно добавить проверку на то, существует ли таблица, а если нет - создать ее.

function colShapeHit(player)
    if (colshapeTimer == nil) then
        colshapeTimer = {}
    end
    -- устанавливаем таймер на вывод сообщения (можно также вызвать другую функцию)
    -- сохраняем id таймера в таблице, используя игрока как индекс
    colshapeTimer[player] = setTimer(outputChatBox,10000,1,"Игрок задержался в колшейпе на 10 секунд!")
end
addEventHandler("onColShapeHit",getRootElement(),colShapeHit)

function colShapeLeave(player)
    -- убираем таймер при покидании игроком колшейпа
    killTimer(colshapeTimer[player])
end
addEventHandler("onColShapeLeave",getRootElement(),colShapeLeave)

Но мы все же получаем предупреждение, когда игрок попадает в колшейп, ждет сообщения и снова его покидает:

WARNING: [..]: Bad argument @ 'killTimer' Line: ..

За исключением этого сообщения (о нем поговорим позже) все, похоже, работает правильно. Игрок попадает в колшейп, таймер стартует, если он остается, появляется сообщение, если он уходит, таймер убирается.

Более незаметная ошибка

Но, в силу некоторых обстоятельств, сообщение выводится дважды, если вы остаетесь в колшейпе на транспортном средстве. Если так получается, значит какой-то код выполняется дважды, мы добавим отладочные сообщения для проверки.

function colShapeHit(player)
    if (colshapeTimer == nil) then
        colshapeTimer = {}
    end
    -- добавляем отладочное сообщение
    outputDebugString("colShapeHit")
    -- устанавливаем таймер на вывод сообщения (можно также вызвать другую функцию)
    -- сохраняем id таймера в таблице, используя игрока как индекс
    colshapeTimer[player] = setTimer(outputChatBox,10000,1,"Игрок задержался в колшейпе на 10 секунд!")
end
addEventHandler("onColShapeHit",getRootElement(),colShapeHit)

function colShapeLeave(player)
    -- добавляем отладочное сообщение
    outputDebugString("colShapeLeave")
    -- убираем таймер при покидании игроком колшейпа
    killTimer(colshapeTimer[player])
end
addEventHandler("onColShapeLeave",getRootElement(),colShapeLeave)

Теперь мы точно видим, что обе функции, прикрепленные к обработчикам, выполняются дважды, если мы в ТС, или один раз, если мы вне ТС. Такое может получаться, если транспортное средство тоже вызывает срабатывание колшейпа. Чтобы подтвердить или опровергнуть эту теорию, проверим переменную player, которая должна содержать элемент типа player.

function colShapeHit(player)
    if (colshapeTimer == nil) then
        colshapeTimer = {}
    end
    -- добавляем отладочное сообщение, с типом элемента
    outputDebugString("colShapeHit "..getElementType(player))
    -- устанавливаем таймер на вывод сообщения (можно также вызвать другую функцию)
    -- сохраняем id таймера в таблице, используя игрока как индекс
    colshapeTimer[player] = setTimer(outputChatBox,10000,1,"Игрок задержался в колшейпе на 10 секунд!")
end
addEventHandler("onColShapeHit",getRootElement(),colShapeHit)

function colShapeLeave(player)
    -- добавляем отладочное сообщение, с типом элемента
    outputDebugString("colShapeLeave "..getElementType(player))
    -- убираем таймер при покидании игроком колшейпа
    killTimer(colshapeTimer[player])
end
addEventHandler("onColShapeLeave",getRootElement(),colShapeLeave)

Отладочные сообщения говорят, что одна из переменных player - действительно игрок, а другая - элемент типа vehicle, т.е. ТС. Так как мы хотим, чтобы срабатывание происходило при попадании в колшейп именно игрока, добавляем if, который предотвратит выполнение функции, если в него попал не игрок (не элемент типа player).

function colShapeHit(player)
    if (colshapeTimer == nil) then
        colshapeTimer = {}
    end
    -- добавляем проверку на тип элемента
    if (getElementType(player) ~= "player") then return end
    -- добавляем отладочное сообщение, с типом элемента
    outputDebugString("colShapeHit "..getElementType(player))
    -- устанавливаем таймер на вывод сообщения (можно также вызвать другую функцию)
    -- сохраняем id таймера в таблице, используя игрока как индекс
    colshapeTimer[player] = setTimer(outputChatBox,10000,1,"Игрок задержался в колшейпе на 10 секунд!")
end
addEventHandler("onColShapeHit",getRootElement(),colShapeHit)

function colShapeLeave(player)
    -- добавляем проверку на тип элемента
    if (getElementType(player) ~= "player") then return end
    -- добавляем отладочное сообщение, с типом элемента
    outputDebugString("colShapeLeave "..getElementType(player))
    -- убираем таймер при покидании игроком колшейпа
    killTimer(colshapeTimer[player])
end
addEventHandler("onColShapeLeave",getRootElement(),colShapeLeave)

Теперь скрипт должен работать как задумано, но все еще будет выводить предупреждение, о котором было сказано ранее. Это происходит, так как таймер, который мы пытаемся убрать при покидании игроком колшейпа, не будет более существовать по прошествии 10 секунд (уже истек). Есть множество способов избавиться от этого предупреждения (вы же знаете, что таймер может более не существовать, и вы хотите его убрать, только если он еще существует). Одним из способов является проверка на то, существует ли упоминаемый в таблице таймер на самом деле. Чтобы ее сделать, нам понадобится isTimer, которой мы и воспользуемся при убирании таймера:

if (isTimer(colshapeTimer[player])) then
    killTimer(colshapeTimer[player])
end

Итак, полностью рабочий код таков:

function colShapeHit(player)
    if (colshapeTimer == nil) then
        colshapeTimer = {}
    end
    -- добавляем проверку на тип элемента
    if (getElementType(player) ~= "player") then return end
    -- добавляем отладочное сообщение, с типом элемента
    outputDebugString("colShapeHit "..getElementType(player))
    -- устанавливаем таймер на вывод сообщения (можно также вызвать другую функцию)
    -- сохраняем id таймера в таблице, используя игрока как индекс
    colshapeTimer[player] = setTimer(outputChatBox,10000,1,"Игрок задержался в колшейпе на 10 секунд!")
end
addEventHandler("onColShapeHit",getRootElement(),colShapeHit)

function colShapeLeave(player)
    -- добавляем проверку на тип элемента
    if (getElementType(player) ~= "player") then return end
    -- добавляем отладочное сообщение, с типом элемента
    outputDebugString("colShapeLeave "..getElementType(player))
    -- убираем таймер при покидании игроком колшейпа
    if (isTimer(colshapeTimer[player])) then
        killTimer(colshapeTimer[player])
    end
end
addEventHandler("onColShapeLeave",getRootElement(),colShapeLeave)


Отладка проблем с производительностью

Если ваш сервер использует намного больше ресурсов, чем ему следовало бы, или вы просто хотите убедиться, что ваши скрипты эффективны, вы можете узнать правду, воспользовавшись отличным инструментом, который поставляется вместе с сервером MTA SA - performancebrowser. Удостоверьтесь, что он запущен, введя "start performancebrowser", а если у вас его нет, возьмите из комплекта стандартных ресурсов, поставляемых с сервером. Данный инструмент предоставляет потрясающее количество информации, полезной для отладки проблем с производительностью. Утечки памяти, утечки элементов и интенсивно использующие процессор скрипты легко найти через performancebrowser. Например, при использовании опции -d в Lua timing, вы можете увидеть, какие функции сильно загружают процессор.

Для доступа к performancebrowser вам понадобится перейти по адресу: http://здесьIPсервера:здесьHTTPпортсервера/performancebrowser/ в своем интернет-браузере. Заметьте, что в конце требуется символ / (слэш). То есть, например: http://127.0.0.1:22005/performancebrowser/ Затем вам понадобится войти со внутриигрового администраторского аккаунта или любого другого аккаунта, имеющего доступ к "general.HTTP". Большинство нужной вам информации находится в разделах Lua timing и Lua memory, там смотрите на те показатели, которые значительно превышают другие.

Примеры скриптов, которые могут вызывать провалы производительности

Добавление данных в таблицу без последующего удаления. Хотя пройдут месяцы/годы, пока это реально вызовет какие-либо проблемы.

local someData = {}

function storeData()
    someData[source] = true
    -- Здесь не учитывается выход игрока, что вызовет утечку памяти
    -- Используя вкладку Lua timing, вы можете обнаружить использование RAM каждым из ресурсов.
end
addEventHandler("onPlayerJoin", root, storeData)

Утечка элементов возможна при использовании по какой-либо причине множества временных колшейпов и последующем их неустранении. Через некоторое время это повлечет за собой проблемы с пропускной способностью, расходом процессора и памяти сервера.

function useTemporaryCol()
    local col = createColCircle(здесь какой-нибудь код)
    if (нормальные для этого условия) then
        destroyElement(col)
    end
    -- Но иногда этого не происходит, так что даже по окончании скрипта зона коллизии остается, что впоследствии
    -- может вылиться в сотни, а то и тысячи бесполезных зон коллизии. 
    -- Вкладка Lua timing позволит вам увидеть количество элементов, созданных каждым скриптом.
end

Большой расход процессора чреват тем, что выливается в просадку FPS сервера до порога, когда тот становится неиграбельным. Менее чем за 24 часа это может превратить даже самый популярный сервер в пустующий. Количество "refs" в Lua timing обнаруживает данный тип скопления, удивительно, но вкладка Lua timing в данном случае не помогла, когда Lua memory - напротив.

addEventHandler("onPlayerJoin", root, function()
    -- Код для заходов
    addEventHandler("onPlayerQuit", root, function()
        -- Код для того, когда выходят
        -- Видите проблему? Он привязан к корню (root), к которому обработчик добавляется снова, снова и снова
    end)
end)

Функция интенсивно использует процессор, потому что то, что она выполняет, занимает много времени. Это просто функция, которой для завершения требуется много времени. Без performancebrowser вы бы и не догадывались, в чем причина, но с performancebrowser вы можете увидеть, что ресурс сильно загружает процессор во вкладке Lua timing. Если вы затем введете: -d в редактируемое поле options, он даже скажет название файла и первую строку функции, которая так сильно загружает процессор.

function someDodgyCode()
    for i=1, 100000 do
        -- какой-нибудь код
    end
end





Автор публикации:

WiseBear WiseBear

Скачать:

Скачать

Дата:
Автор ресурса:

Автор не указан

Введение в скриптинг
Введение в скриптинг
12.02.2021, Статьи
Обучение LUA
Обучение LUA
24.12.2020, Статьи
Введение в скриптинг 2
Введение в скриптинг 2
24.12.2020, Клиенты MTA
Введение в скриптинг GUI
Введение в скриптинг GUI
24.12.2020, Статьи

Нет комментариев.Оставишь комментарий?