Aldeia RPG

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Suporte ao desenvolvimento de jogos


    Aula Avançada 2: Otimizando Sistemas

    MickeyRocknn
    MickeyRocknn
    Iniciante
    Iniciante


    Mensagens : 71
    Créditos : 9

    Aula Avançada 2: Otimizando Sistemas Empty Aula Avançada 2: Otimizando Sistemas

    Mensagem por MickeyRocknn Sáb Abr 28, 2012 1:38 pm

    Vi Esta Aula No Aprendiz RPG É Vou Disponibilizar Aqui. Criador: Lucaswf1

    Introdução
    Dando continuidade aos trabalhos do curso avançado, vamos hoje aprender a tornar nossos scripts mais rápidos, diminuindo lags e tornando mais dinâmico o sistema, essas dicas valem para todo o tipo de script, mas aconselho a todos a darem uma atenção especial para as dicas sobre gráficos, elas melhoram o jogo visivelmente!


    Eventos
    Muita gente reclama que os eventos causam muitos lags e não há antilag no mundo que permita usar todos os recursos que queremos, vejamos algumas dicas simples para reduzir esses indezejáveis lags.

    Lags causados por eventos estáticos
    Se você é um grande mapeador e utiliza 4 layers de mapeamento (os 3 mais os eventos com gráficos do tileset), uma dica incrível é usar um anti-lag simples e nomear todos os eventos estáticos como "noupdate" sem as "", esse é um recurso normalmente esquecido por todos os usuários de antilag, mas para mapas com muitos eventos ele é extremamente útil!

    Lags causados por eventos cheios de comandos
    Se você criou um "evento monstro", ou seja, um evento com linhas e linhas de comando, tente substituir alguns desses comandos por linhas de script, os scripts causam menos lag!

    Lags causados por eventos comuns
    Uma mega dica para aqueles que usam eventos comuns em processo paralelo, ou seja, que ficam rodando o tempo todo, é criar blocos de atualização. Compreenda que no rmxp, cada segundo tem 20 frames, cada frame representa uma atualização da tela, imagine um evento comum de 30 linhas sendo executado 20 vezes por segundo oO? Lag na certa né? Pois bem, crie no seu evento, condições por eventos mesmo, dentro da condição coloque script e coloque Graphics.frame_count % == 0, esse comando vai gerar uma condição de atualização, o deve ser um número de 1 a 20 sendo que:
    1 = atualiza a cada frame (20x por segundo)
    5 = atualiza a cada 5 frames (4x por segundo)
    10 = atualiza a cada 10 frames (2x por segundo)
    20 = atualiza a cada 20 frames (1x por segundo)
    Crie blocos de código por evento dentro dessas condições conforme a sua necessidade de atualização, explore o comando que mostrei para ter resultados ainda melhores!

    Lags causados por muitos eventos
    Para quem usa uma montanha de eventos, a dica é mesmo criar mapas pequenos, eles minimizam o impacto do volume de eventos. Também use antilags com o recurso de atualização "in-screen", esse recurso atualiza apenas os eventos que estão na tela.


    HUDs
    Sem dúvida nenhuma, uma das maiores causadoras de lag em jogos são as huds, mas existem dezenas de meios não explorados que reduzem esses lags, não é um bicho de 7 cabeças, até quem não sabe nada de scripts pode fazer alguma coisa.

    Atualização de variáveis
    Se você tem uma hud que só mostra variáveis na tela, faça da seguinte forma, no initialize, crie um atributo para cada variável que você vai usar e inicialize com valores diferentes das variáveis, use negativos ou 0, depois no refresh coloque todos os comandos dentro de um bloco condicional onde só haverá atualização se o valor do atributo é diferente do valor da variável, veja um exemplo simples:


    class HUD_BASIC < Window_Base
    def initialize

    @lv = 0
    refresh
    end
    def refresh
    if @lv != $game_party.actors[0].level
    @lv = $game_party.actors[0].level
    self.contents.clear
    self.contents.draw_text(0,0,45,32,"Level:" + @lv
    end
    end
    end


    Note a simplicidade e a funcionalidade desse truque, sem o "if", essa hud seria recriada 20 vezes por segundo, com o if, ele só vai recriar quando o personagem mudar de lv! oO É muita diferença!

    Atualização de huds complexas
    Caso sua hud seja muito complexa, não vale a pena utilizar a dica a cima pois teriam muitas condições (ou uma só, mas imensa). O mais correto nessas situações é criar uma condição simples usando o frame_count como nos eventos comuns, veja:


    class HUD_GIGANTIC < Window_Base
    def initialize

    refresh
    end
    def refresh
    if Graphics.frame_count % 10 == 0

    end
    end
    end


    Veja que a hud será executada 2 vezes por segundo, esse é um bom valor, caso suas batalhas sejam muito ativas, deixe em um valor entre 5 e 10 conforme a necessidade. Isso causará atualizações desnecessárias, mas vai reduzir o lag pela metade.

    Atualização de huds cheias de imagens
    Se sua HUD possue uma imensa gama de imagens e várias delas são estáticas, ou seja, só ficam la paradas, você tem duas possibilidades, junte tudo pelo photoshop ou outro editor e crie sua hud ou então crie duas huds, uma estática e outra dinâmica, como assim? Basta criar duas janelas(classes) para a hud, na de baixo(a com Z menor), coloque todas as imagens e não utilize o refresh no alias do Scene_Map para atualizá-la, assim ela será criada cada vez que entrar no mapa e não será mais mechida, enquanto isso, crie outra hud com os dados dinâmicos, variáveis e etc, atualize ela normalmente, assim não tem que redesenhar as imagens toda a hora!


    Scripts
    Para os usuários avançados que consideram cada ciclo de processamento e querem deixar seus jogos/scripts mais técnicos e otimizados, vamos a algumas dicas avançadas, elas não reduzem visivelmente o lag, mas se todos os sistemas forem assim otimizados, a diferença fica visível.

    Os loops
    Uma coisa que dá muita dor de cabeça aos scripters são os loops pois normalmente eles forçam bastante o processamento causando lags, se você não tem como evitar usá-los tente substituir o "loop do" por um "while", a diferença se da pois loop é um método, ou seja, ele utiliza vários comandos, ja o while ja é o comando, lembre-se que no loop você usa uma condição de parada no break e no while(quer dizer enquanto) a condição é de funcionamento e não parada e você usa logo depois do comando, por exemplo while a == true.

    Condições: and ou or?
    Quando o processador executa um &&(and) ele gasta menos processamento que quando executa o ||(or), entenda o porquê:
    Para o and ser válido, todas as premissas envolvidas devem ser válidas, por exemplo @hud.visible == true and @cont > 5, se ao verificar que @hud.visible é falso, o processador nem passa pela 2ª verificação, porém se você usar um or, o processador precisa verificar as duas. Agora você vai pensar: "Mas or a and são diferentes, não da pra substituir". Normalmente não tem mesmo, até eu poderia mostrar uma fórmula, mas ela não facilita muito a vida, então se der pra usar and no lugar do or, então use! (acho que essa ficou mais a caráter informativo do que prático Successful)

    Condições: quem vem primeiro?
    Se você esta usando um or, não importa qual verificação colocar 1º, mas se for um and, não pense duas vezes, coloque antes as mais simples, métodos e comandos complexos usam mais do processador.

    Atualizando apenas o necessário
    La vem eu novamente falar de atualização, fazer o que, esse é o motivo central do lag! Successful Se você criou uma Scene ou algum script que causa muito lag no jogo, use a dica das huds para diminuir a taxa de atualização por segundos do seu script, para isso basta colocar o conteúdo do update em um bloco de código condicional usando o Graphics.frame_count do exato mesmo geito das huds!

    Ifs para todos os lados
    Imagine a condição, se a vale 5 retorna true, se não, retorna false, veja como a maioria faria:

    if a == 5
    return true
    else
    return false
    end

    return true if a == 5
    return false

    ...

    Esse tipo de condição pode ser simplificada em uma linha, veja só:
    return a == 5
    Moleza né, esse tipo de otimização deixa o código bem melhor.

    Quantos menos linhas melhor
    sempre tente deixar o seu código o mais enxuto possível, em casos por exemplo de condições simples, para impedir que uma variável fique negativa por exemplo, ao invés de por:

    if a < 0
    a = 0
    end

    Use:
    a = 0 if a < 0
    ou
    if a < 0 then a = 0 end

    Na prática, não muda nada, mas deixa o código mais limpo e isso também é um meio de otimização, afinal procurar um método em um código gigante é fogo né Successful

      Data/hora atual: Dom Nov 24, 2024 9:07 pm