iron015 Posted November 3, 2015 Share Posted November 3, 2015 Добрый вечер, у меня на сервере постепенно пополняется число открытых xml файлов. По такому принципу выполняется открытие файлов во всём моде: function banks ( res ) if res == getThisResource() then xml = xmlLoadFile("data/coordinates.xml") if xml then children = xmlFindChild ( xml, "TERMINALPoints", 0 ) if children then for i,v in ipairs(xmlNodeGetChildren(children)) do x = xmlNodeGetAttribute(v,"x") y = xmlNodeGetAttribute(v,"y") z = xmlNodeGetAttribute(v,"z") r = xmlNodeGetAttribute(v,"r") bank[i] = createMarker ( x, y, z, "cylinder", 2, 255, 153, 0, 170 ) terminal[i] = createObject (1863, x, y, z, 0, 0, r) end xmlUnloadFile(xml) end end end end addEventHandler ( "onResourceStart", getRootElement(), banks ) Link to comment
Kernell Posted November 3, 2015 Share Posted November 3, 2015 Может хотя бы переменные локальными объявите? Link to comment
Kenix Posted November 3, 2015 Share Posted November 3, 2015 Скинь полный код, возможно у тебя что-то ещё влияет. Link to comment
iron015 Posted November 3, 2015 Author Share Posted November 3, 2015 Ну у меня там мод большой, разбит на несколько файлов. Но во всех файлах, где есть открытие xml, примерно все так же написано. Вот еще кусок из другого файла. addEventHandler ( "onClientResourceStart", getResourceRootElement(), function (res) if res == getThisResource() then local xml = xmlLoadFile("data/coordinates.xml") if xml then local children = xmlFindChild ( xml, "RADPoints", 0 ) if children then for i,v in ipairs(xmlNodeGetChildren(children)) do x = xmlNodeGetAttribute(v,"x") y = xmlNodeGetAttribute(v,"y") Gblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/cam.png" ) end end children = nil local children = xmlFindChild ( xml, "FUELPoints", 0 ) if children then for i,v in ipairs(xmlNodeGetChildren(children)) do x = xmlNodeGetAttribute(v,"x") y = xmlNodeGetAttribute(v,"y") Fblip[i] = exports.res2:createCustomBlip ( x, y, 15, 15, "files/fuell.png" ) end end children = nil local children = xmlFindChild ( xml, "RNPoints", 0 ) if children then for i,v in ipairs(xmlNodeGetChildren(children)) do x = xmlNodeGetAttribute(v,"x") y = xmlNodeGetAttribute(v,"y") Rblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/car1.png" ) end end children = nil local children = xmlFindChild ( xml, "SNPoints", 0 ) if children then for i,v in ipairs(xmlNodeGetChildren(children)) do x = xmlNodeGetAttribute(v,"x") y = xmlNodeGetAttribute(v,"y") Sblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/car2.png" ) end end children = nil local children = xmlFindChild ( xml, "GAIPoints", 0 ) if children then for i,v in ipairs(xmlNodeGetChildren(children)) do x = xmlNodeGetAttribute(v,"x") y = xmlNodeGetAttribute(v,"y") GMblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/car3.png" ) end end children = nil local children = xmlFindChild ( xml, "DBPoints", 0 ) if children then for i,v in ipairs(xmlNodeGetChildren(children)) do x = xmlNodeGetAttribute(v,"x") y = xmlNodeGetAttribute(v,"y") Dblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/car4.png" ) end end children = nil local children = xmlFindChild ( xml, "BSPoints", 0 ) if children then for i,v in ipairs(xmlNodeGetChildren(children)) do x = xmlNodeGetAttribute(v,"x") y = xmlNodeGetAttribute(v,"y") BSblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/car5.png" ) end end children = nil local children = xmlFindChild ( xml, "SHPoints", 0 ) if children then for i,v in ipairs(xmlNodeGetChildren(children)) do x = xmlNodeGetAttribute(v,"x") y = xmlNodeGetAttribute(v,"y") SHblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/uch.png" ) end end children = nil local children = xmlFindChild ( xml, "TAXIPoints", 0 ) if children then for i,v in ipairs(xmlNodeGetChildren(children)) do x = xmlNodeGetAttribute(v,"x") y = xmlNodeGetAttribute(v,"y") Tblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/taxi.png" ) end end children = nil local children = xmlFindChild ( xml, "GARAGEPoints", 0 ) if children then for i,v in ipairs(xmlNodeGetChildren(children)) do x = xmlNodeGetAttribute(v,"x") y = xmlNodeGetAttribute(v,"y") GRblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/garage.png" ) end end children = nil local children = xmlFindChild ( xml, "GRPoints", 0 ) if children then for i,v in ipairs(xmlNodeGetChildren(children)) do x = xmlNodeGetAttribute(v,"x") y = xmlNodeGetAttribute(v,"y") GZblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/gruz.png" ) end end children = nil local children = xmlFindChild ( xml, "TERMINALPoints", 0 ) if children then for i,v in ipairs(xmlNodeGetChildren(children)) do x = xmlNodeGetAttribute(v,"x") y = xmlNodeGetAttribute(v,"y") TMblip[i] = exports.res2:createCustomBlip ( x, y, 20, 20, "files/term.png" ) end end children = nil end xmlUnloadFile(xml) xml = nil end end) Link to comment
AMARANT Posted November 3, 2015 Share Posted November 3, 2015 Насколько я понимаю, вы используете ХМL в качестве базы данных для координат. Кроме того, что координаты можно хранить и в самом скрипте, так вы еще их берете из клиентских файлов ХМL, которые легко можно изменить любому игроку и тогда ваши блипы или что у вас там еще будут создаваться в любой точке, которую захочет игрок, или вообще не будут если написать там что угодно. Уже не говоря о том, что использование XML для хранения больших объемов данных вообще недопустимо. Поправьте если неправ. Link to comment
iron015 Posted November 3, 2015 Author Share Posted November 3, 2015 Насколько я понимаю, вы используете ХМL в качестве базы данных для координат. Кроме того, что координаты можно хранить и в самом скрипте, так вы еще их берете из клиентских файлов ХМL, которые легко можно изменить любому игроку и тогда ваши блипы или что у вас там еще будут создаваться в любой точке, которую захочет игрок, или вообще не будут если написать там что угодно. Уже не говоря о том, что использование XML для хранения больших объемов данных вообще недопустимо. Поправьте если неправ. ну проблем с работой я не наблюдал, просто в performancebrowser'е со временем работы сервера кол-во открытых xml постоянно пополняется. Link to comment
STAWR Posted January 3, 2016 Share Posted January 3, 2016 потому что ты их и не закрываешь xmlSaveFile Link to comment
Fabervox Posted January 4, 2016 Share Posted January 4, 2016 Нет, у него есть unload, а ты говоришь о сохранении, т.е. сохранит, но не выгрузит. Не особо обратил внимания когда увидел первый раз. а) Локальными лучше, но проблема не в них, он в одной функции выгружает. б) Этого кода достаточно что-бы понять проблему. в) Что-бы утверждать что изменить xml легко, нужно видеть мету. Кроме того дать возможность игроку, так выделиться, не будет лишним, вдруг получит бан, крик его успокоить, не баня в группе/сайте, только хешем фиксировать изменение и все. Почему не выгружалось, да потому-что если необходимо безусловно выгружать, то нужно так и делать. Т.е. вначале конструкции загрузка, в конце выгрузка. А если выгрузка, внутри вложенных, то она же может и не выполниться, не обязан же потомок существовать. Просто нужно было unload, на уровень выше поставить и все. Кроме того пару советов к такого рода коду. Не зачем писать длинный одинаковый код, раз уж храните координаты, храните и то чего это координаты, и сделайте для множества один код. Меньше кода - легче ориентироваться. Статистика хороша, но можно собрать статистику вызовов конкретных xml и потомков(child). Потому-что может быть так, что нет никакой выгоды от выгрузки файла, т.к. там какие-то периоды нагрузки есть. Далее выгрузка может понадобиться не сразу, а регулярно, можно собирать их все в одну таблицу, и далее регулярно очищать. Но стоит отметить что нагрузка на клиента вас может особо и не волновать. Код привязанный к клиентскому ивенту, можно выполнять и с сервера. triggerServerEvent() --или через call() Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now