Narutimmy Posted December 20, 2015 Share Posted December 20, 2015 hola, bueno estoy haciendo un resource una lista de jugadores el problema es que mi internal pesa unos 400mb, entonces al generar la lista o mas bien al objetener a los jugadores registrados da un lag por unos 10segundos aprox.... en cambio si lo ago en una internal de 2 o 3 cuentas es al instante, como podria optimizarlo? Link to comment
Tomas Posted December 20, 2015 Share Posted December 20, 2015 Pues, quizás sólo obteniendo las cuentas activas? Cuando el servidor inicia, todas las cuentas que se han conectado el último mes se guardan en una tabla, luego en vez de getAccounts puedes usar esa tabla, el lagaso sólo será al principio. Link to comment
Narutimmy Posted December 20, 2015 Author Share Posted December 20, 2015 Pues, quizás sólo obteniendo las cuentas activas? Cuando el servidor inicia, todas las cuentas que se han conectado el último mes se guardan en una tabla, luego en vez de getAccounts puedes usar esa tabla, el lagaso sólo será al principio. El problema es que intento hacer un top score all time.... entonces ahi muchos que ya no juegan pero son lugar 1 o 2... y la idea es que otros intenten superarlos. Lo otro que pensaba parecido a lo que me dijistes que al iniciar el server me genere la tabla y todo hastas ahi bien, y luego solicitar esa tabla desde el cliente. Link to comment
MTA Team 0xCiBeR Posted December 20, 2015 MTA Team Share Posted December 20, 2015 O puedes utilizar una librería async. https://forum.multitheftauto.com/viewtopic.php?f=108&t=82493 Link to comment
Narutimmy Posted December 21, 2015 Author Share Posted December 21, 2015 O puedes utilizar una librería async.https://forum.multitheftauto.com/viewtopic.php?f=108&t=82493 de echo si lo pense, ya le usado, pero no me funciona en server solo client.. Link to comment
Narutimmy Posted December 24, 2015 Author Share Posted December 24, 2015 Nadie? alguna forma? Link to comment
UserToDelete Posted December 24, 2015 Share Posted December 24, 2015 Depende de lo que pidas, pero deberia ser algo estilo tabla y no tabla, es decir, es mas ligero que cargue en cliente que cada vez en servidor --[[ PARTE DE SERVIDOR ]] --Usar esto la iniciar el script local t = {} --Formato de tabla: {["cuenta"] = valor, ["cuenta2"] = valor, ... } function inicia () for k,v in ipairs(getAccounts()) do t[getAccountName(v)] = --[[Valor de estadistica]] end triggerClientEvent(root, "estadisticas", root, t) end --Usar esto posteriormente con un timer, que se yo.. 2-5 minutos? function actualizar () for k,v in ipairs(getElementsByType("player")) do local acc = getAccountName(getPlayerAccount(v)) if acc:lower() ~= "guest" then t[acc] = --[[Valor de estadistica]] end end triggerClientEvent(root, "estadisticas", root, t) end --[[ PARTE DE CLIENTE ]] local tabla = {} --Formato de tabla: {["cuenta"] = valor, ["cuenta2"] = valor, ... } addEvent("estadistica", true) addEventHandler("estadistica", root, function (t) tabla = t end ) Adicionalmente, te recomiendo que elimines cuentas con mas de 60 dias sin uso, asi la competicion es activa https://community.multitheftauto.com/index.php?p=resources&s=details&id=12193 o sino el codigo source directamente dias_borrado = 60 addEventHandler("onResourceStart", resourceRoot, function () for k,v in ipairs(getAccounts()) do if not getAccountData(v, "ia:u") then setAccountData(v, "ia:u", "0") end end end ) addEventHandler("onPlayerLogin", root, function (old, new) if not getAccountData(new, "ia:u") then setAccountData(new, "ia:u", "0") end end ) setTimer( function () for k,v in ipairs(getAccounts()) do if getAccountData(v, "ia:u") then setAccountData(v, "ia:u", tostring(tonumber(getAccountData(v, "ia:u") or 0) + 1)) if dias_borrado <= getAccountData(v, "ia:u") then removeAccount(v) end else setAccountData(v, "ia:u", "0") end end end , 86400000, 0) Link to comment
UserToDelete Posted December 24, 2015 Share Posted December 24, 2015 Yo más bien recomendaría que lo hicieras con un botón refresh, si claro está es un highscore. Así te evitas que te dé esos problemas de lag. La actualización sería para el jugador que solicite el refresh. Yo lo hago de esa forma y no me da lag. Y eso esa forma por que intenté de otras formas y me daba tu mismo problema y eso que había pocos jugadores registrados (300) Y si hay algun genio que lo pulsa 8000 veces?, creo que mi metodo es mas efectivo Link to comment
Narutimmy Posted December 24, 2015 Author Share Posted December 24, 2015 Yo más bien recomendaría que lo hicieras con un botón refresh, si claro está es un highscore. Así te evitas que te dé esos problemas de lag. La actualización sería para el jugador que solicite el refresh. Yo lo hago de esa forma y no me da lag. Y eso esa forma por que intenté de otras formas y me daba tu mismo problema y eso que había pocos jugadores registrados (300) Y si hay algun genio que lo pulsa 8000 veces?, creo que mi metodo es mas efectivo so algo asi pense ya que 1 no pasa mucho pero si varios se agarran a refresh.... explota el vps EDIT: De echo lo habia echo de esta forma: players = { } --SERVER function top(source) for i, account in ipairs ( getAccounts( ) ) do table.insert (players,{element = getAccountName(account),kills = getAccountData ( account, "TK" ) or 0,deaths = getAccountData ( account, "TD" ) or 0, gang = getAccountData ( account, "gang" ) or "None"} ) end table.sort (players,function ( a, b ) return ( tonumber ( a.kills ) or 0 ) > ( tonumber ( b.kills ) or 0 ) end) local time = getRealTime() local hours = time.hour local minutes = time.minute local dia = time.monthday local mes = time.month local ano = time.year-100 FechaUpdate = "["..dia.."/"..mes.."/"..ano.."] - "..hours..":"..minutes ----outputChatBox(players[1].element, source, 255, 0, 0) end Link to comment
Narutimmy Posted January 4, 2016 Author Share Posted January 4, 2016 Me podrian ayudar con el script que publique? Link to comment
Recommended Posts