Jump to content

Optimizar mapas y lag


aka Blue

Recommended Posts

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.

Link to post
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).

Link to post

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.

Link to post

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 
) 

Link to post
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 
  

Link to post

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 

Link to post

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
Link to post

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

Link to post

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

Link to post

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.

Link to post

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 :)

Link to post
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?

Link to post
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.

Link to post
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.

Link to post
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...