Jump to content

Optimizar mapas y lag


Recommended Posts

Posted

Buenas. Últimamente estoy teniendo un pequeño problema con los mapas. Resulta que hoy los acabo de dividir en partes (como scripts, básicamente) para que no den mucho lag estando todos en un meta.xml y en un mismo script. El problema es que causa bastante lag en mi servidor y no entiendo por qué. Quisiera saber algunas funciones o métodos para que no cause tanto lag y optimizar los mapas.

Gracias.

Posted
Buenas. Últimamente estoy teniendo un pequeño problema con los mapas. Resulta que hoy los acabo de dividir en partes (como scripts, básicamente) para que no den mucho lag estando todos en un meta.xml y en un mismo script. El problema es que causa bastante lag en mi servidor y no entiendo por qué. Quisiera saber algunas funciones o métodos para que no cause tanto lag y optimizar los mapas.

Gracias.

Si los convertiste a script y estás usando createObject, crealos en el cliente (client-side).

Posted
Son .map

En mi servidor se descargan mas o menos 13 mb de mapas y no da lag, Pueda que necesites una maquina mas potente xD

Posted

Transforma los .map ya que son archivos con una estructura XML lo que significa falta de optimización a createObjects en la parte servidor para evitar cargas inecesarias en el cliente. Esto aumenta la optimización considerablemente.

Posted

Bueno, haré un pequeño sistema como el que trae Paradise para sacar los datos .XML del mapa y convertirlos a lua, gracias.

¿Alguna otra recomendación? :)

Posted

Ya hice el sistema rápidamente y tal, funciona, pero quiero hacer que lea los mapas que están en una tabla y me he quedado atascado ahí...

local mapas = { 
    ["mapabase.map"] = true, 
} 
  
addEventHandler ( "onResourceStart", resourceRoot, 
    function ( ) 
        local map = xmlLoadFile ( "mapas/"..mapas[] ) 
        if map then 
            local children = xmlNodeGetChildren ( map ) 
            for key, value in ipairs ( children ) do 
                if xmlNodeGetName ( value ) == "object" then 
                    table.insert ( objetos, { 
                        x = tonumber( xmlNodeGetAttribute( value, "posX" ) ), 
                        y = tonumber( xmlNodeGetAttribute( value, "posY" ) ), 
                        z = tonumber( xmlNodeGetAttribute( value, "posZ" ) ), 
                        rx = tonumber( xmlNodeGetAttribute( value, "rotX" ) ) or 0, 
                        ry = tonumber( xmlNodeGetAttribute( value, "rotY" ) ) or 0, 
                        rz = tonumber( xmlNodeGetAttribute( value, "rotZ" ) ) or 0, 
                        model = tonumber( xmlNodeGetAttribute( value, "model" ) ), 
                        interior = tonumber( xmlNodeGetAttribute( value, "interior" ) ) or 0, 
                        alpha = tonumber( xmlNodeGetAttribute( value, "alpha" ) ) or 255, 
                        scale = tonumber( xmlNodeGetAttribute( value, "scale" ) ) or 1, 
                        doublesided = xmlNodeGetAttribute( value, "doublesided" ) == "false" and 1 or 0, 
                        colision = xmlNodeGetAttribute( value, "collisions" ) == "false" and 0 or 1, 
                        dimension = tonumber( xmlNodeGetAttribute( value, "dimension" ) ) or 0, 
                    } 
                    ) 
                else 
                    outputDebugString ( "Unsopported element: "..xmlNodeGetName ( value ), 2 ) 
                end 
            end 
        end 
    end 
) 

Posted
Ya hice el sistema rápidamente y tal, funciona, pero quiero hacer que lea los mapas que están en una tabla y me he quedado atascado ahí...

Usan un for loop y luego usa otro para recorrer los valores de la tabla.

  
function () 
        for i, p in ipairs ( getElementsByType ( "player" ) ) do 
  

y

  
 for x = 1, #mapas do 
                if ( string.find (mapas [ i ], 1, true ) == mapa ) then 
                argumentos 
                end 
  

Posted

Vale, creo que ya lo tengo arreglado:

local mapas = { "mapabase.map" } 
  
addEventHandler ( "onResourceStart", resourceRoot, 
    function ( ) 
        for k, v in ipairs ( mapas ) do 
            outputDebugString ( tostring ( v ) ) 
            local map = xmlLoadFile ( "mapas/"..mapas[1] ) 
            if map then 
                local children = xmlNodeGetChildren ( map ) 
                for key, value in ipairs ( children ) do 
                    if xmlNodeGetName ( value ) == "object" then 
                        table.insert ( objetos, { 
                            x = tonumber( xmlNodeGetAttribute( value, "posX" ) ), 
                            y = tonumber( xmlNodeGetAttribute( value, "posY" ) ), 
                            z = tonumber( xmlNodeGetAttribute( value, "posZ" ) ), 
                            rx = tonumber( xmlNodeGetAttribute( value, "rotX" ) ) or 0, 
                            ry = tonumber( xmlNodeGetAttribute( value, "rotY" ) ) or 0, 
                            rz = tonumber( xmlNodeGetAttribute( value, "rotZ" ) ) or 0, 
                            model = tonumber( xmlNodeGetAttribute( value, "model" ) ), 
                            interior = tonumber( xmlNodeGetAttribute( value, "interior" ) ) or 0, 
                            alpha = tonumber( xmlNodeGetAttribute( value, "alpha" ) ) or 255, 
                            scale = tonumber( xmlNodeGetAttribute( value, "scale" ) ) or 1, 
                            doublesided = xmlNodeGetAttribute( value, "doublesided" ) == "false" and 0 or 1, 
                            colision = xmlNodeGetAttribute( value, "collisions" ) == "false" and 0 or 1, 
                            dimension = tonumber( xmlNodeGetAttribute( value, "dimension" ) ) or 0, 
                        } 
                        ) 
                    else 
                        outputDebugString ( "Unsopported element: "..xmlNodeGetName ( value ), 2 ) 
                    end 
                end 
            end 
        end 
        iniciarCreacion ( ) 
    end 
) 

Me printea correctamente el nombre de los mapas en la tabla. Ahora el problema viene en la creación. No crea los objetos:

    for k, v in ipairs ( objetos ) do 
        local x, y, z = v.x, v.y, v.z 
        local rotx, roty, rotz = v.rx, v.ry, v.rz 
        local model = v.model 
        local interior = v.interior 
        local alpha = v.alpha 
        local scale = v.scale 
        local doublesided = v.doublesided 
        local collisions = v.colision 
        local dimension = v.dimension 
        object = createObject ( model, x, y, z ) 
        setElementRotation ( object, rotx, roty, rotz ) 
        if doublesided == 1 then setElementDoubleSided ( object, true ) else setElementDoubleSided ( object, false ) end 
        if collisions == 1 then setElementCollisionsEnabled ( object, true ) else setElementCollisionsEnabled ( object, false ) end 
        setObjectScale ( object, scale ) 
        setElementAlpha ( object, alpha ) 
    end 
end 

Posted (edited)

Up. He intentado pasarlo a client-side y tampoco me crea los objetos. Probé poniendo un outputDebugString para ver si ejecuta la función, y efectivamente me printea la misma cantidad de mensajes que objetos que hay en .maelero sigue sin crear el objeto.

¿Alguna solución?

Edited by Guest
Posted

No, según la comprobación que hice, los crea :S

Edito: Le hice un debugString a la función iniciarCreación, que es el loop que he posteado y según la consola y los printeos que envía, los objetos se crean pero en el mapa ni rastro de ellos

Posted

Gracias @Tomas, pero me gustaría terminar mi sistema. No entiendo exactamente el error, supuestamente se crean los objetos, según el outputDebugString pero no aparece absolutamente nada en el mapa. He intentado poner la dimension e interior a 0 por si se creaba en otras pero nada, sigue igual

¿Alguna solucion? :c

Posted

Para llegar a hacer eso te has fijado en el sistema de carga de mapas de paradise, ¿por qué no lo usas si viene en tu GM? De la forma que lo estás haciendo, cada vez que quieras meter un mapa vas a tener que reiniciar el recurso, así que se borrarán todos los objetos creados y buguearás a todos los jugadores.

Posted

Lo he pasado todo al sistema de carga de mapas de Paradise, gracias @Dannys, quería crear un sistema mío pero ya fixeado el de maps pues los metí ahí. Ahora mi duda es... la distancia de dibujado de los objetos, es decir el LOD, ¿Cuál es el más recomendable? Para que cargue rápido y tal.

Gracias :)

Posted
Gracias @Tomas, pero me gustaría terminar mi sistema. No entiendo exactamente el error, supuestamente se crean los objetos, según el outputDebugString pero no aparece absolutamente nada en el mapa. He intentado poner la dimension e interior a 0 por si se creaba en otras pero nada, sigue igual

¿Alguna solucion? :c

¿Has comprobado el return del createObject?

Posted
Lo he pasado todo al sistema de carga de mapas de Paradise, gracias @Dannys, quería crear un sistema mío pero ya fixeado el de maps pues los metí ahí. Ahora mi duda es... la distancia de dibujado de los objetos, es decir el LOD, ¿Cuál es el más recomendable? Para que cargue rápido y tal.

Gracias :)

Depende de que objeto es, lo recomendable para edificios son 300 como máximo. Para los cuerpos de los edificios con texturas no muy detalladas 1000 - 3000. Objetos de decoración (Farolas, Plantas) 50 - 150.

Posted
Lo he pasado todo al sistema de carga de mapas de Paradise, gracias @Dannys, quería crear un sistema mío pero ya fixeado el de maps pues los metí ahí. Ahora mi duda es... la distancia de dibujado de los objetos, es decir el LOD, ¿Cuál es el más recomendable? Para que cargue rápido y tal.

Gracias :)

Depende de que objeto es, lo recomendable para edificios son 300 como máximo. Para los cuerpos de los edificios con texturas no muy detalladas 1000 - 3000. Objetos de decoración (Farolas, Plantas) 50 - 150.

Sigo teniendo ciertos problemas de lag, no lo entiendo. Y todo se debe a la carga de mapas, no tengo ni idea de lo que está pasando.

Posted

Uso pues lo que dijo @Dannys, el sistema de mapas que trae el Paradise. Lo usaba hasta ahora para los interiores, por el /setmapdimension que añade el sistema.

Posted

Ese sistema está muy mal. Como mencione anteriormente la mejor manera de hacerlo es con una tabla de los objetos, un loop y un createObject. Todo ello en la parte servidor.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...