Melhorando o desempenho dos jogos

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Melhorando o desempenho dos jogos

Mensagem por PedroX em Ter 15 Nov 2011, 12:37

Nesse artigo, você verá como melhorar o desempenho do seu jogo.
O Game Maker é criticado na maioria das vezes por causa de sua velocidade, que na verdade não é muito boa mesmo. Mas você saberá melhorar esse problema.

O artigo é em forma de dicas, alguma são minhas e outras foram coletadas da internet.

Precise collision checking
Se o seu sprite não precisa colidir perfeitamente, podendo colidir com uma mascara quadrada ou circular, desabilite essa opção.

Operações matemáticas
Operações de divisão e subtração são mais lentas que operações de soma e multiplicação (até para o ser humano é assim).  Em vez de usar:
Código:
vida = level/4 + sin(angle)/cos(angle); //mais lento
Use:
Código:
vida = level*0.25 + tan(angle); //mais rápido

Tiles no lugar de objetos
Um objeto é algo muito complexo no Game Maker.
Ele possui várias coisas desnecessárias. Cada instância é uma cópia desse objeto, ou seja, seu jogo vai ficar pesado com várias instâncias.

Use TILES no lugar de objetos (como o chão, paredes, tudo o que der).
Elas são MUITO mais RÁPIDAS que os objetos.
Procure usar tiles maiores ao invés de várias tiles pequenas (claro que somente quando uma for ficar do lado da outra).

Background color
Se você está usando um background, desative a opção de desenhar uma cor para o background.

Step
Esse é um evento que geralmente é executado 30 vezes por segundo, evite usar códigos que não precisam ser executados em todos os steps do jogo. Use outros eventos se possivel.

Views
Em cada view a room é redesenhada.
Então use só uma view quando puder.

Resolução
Use uma resolução baixa.

With
Em vez de usar:
Código:
player.sprite=spr_player;
player.vida=100;
player.level=25;
Use:
Código:
with (player){
sprite=spr_player;
vida=100;
level=25;
}

Switch
Em vez de usar vários if, use um switch.
Se não souber o que é, veja no Manual do Iniciante (na minha assinatura).

Memory Leaks
Sempre termine as ações que iniciou.
Usou a função file_find? Use file_find_close().
Usou surfaces? Use surface_free().

Variáveis
Ao declarar uma variável, pense no seguinte:
- Vou precisar dela só agora (não há utilidade de usá-la depois)?
Use var variavel;
variavel=valor;

- Vou precisar usar somente nesse objeto e mais de uma vez?
Use variavel = valor;
- Vou precisar usar em todos os objetos (ou em mais de um)?
Em último caso use globalvar variavel;
variavel = valor;

Mesmo assim, prefira usar um objeto para guardar as variaveis que seriam globais e depois chame essas variaveis locais dele. Ex: sangue = objeto_vars.variavel;

Sons
Toque os sons com intervalos.
Não deixe o jogo sempre ficar tocando sons.

DLL
Use Dll's no seu jogo.
Elas são mais rápidas que as funções do Game Maker.

Constantes
Se algumas variáveis ironicamente forem constantes, use constantes no lugar dessas variáveis.

Ds_list, Ds_map, etc
Use data structures ao em vez de arrays.
Seu jogo ficará mais leve.

display_set_colordepth(coldepth)
Use essa função com o valor 16, assim ganhará velocidade.

Sprites / Backgrounds
Deixe eles do menor tamanho possivel.
Retire até os espaços invisiveis.

Instâncias
Destrua as instâncias que você não usará mais.
Desative ( instance_deactivate_ ) as que não está usando (fora da view por exemplo).

execute_string, draw_get_pixel, surface_get_pixel, variable_local_set
Nunca use essas funções. Só em caso de vida ou morte.

Créditos:
Pedro Henrique
Cabreak
Derek


Até mais!


Última edição por PedroX em Ter 23 Jul 2013, 16:29, editado 2 vez(es)

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Melhorando o desempenho dos jogos

Mensagem por Luiz A. Oliveira em Ter 15 Nov 2011, 12:52

Very bom.
Muito bom monolo, vai ser muito bom pros jogos pesados aqui do fórum.
Mas tanho uma pergunta.
-As extensões são compiladas junto do source do jogo?
Porque fiz essa pergunta: Porque quando uso apenas um objeto, uma room, e uma função externa meu source ja pesa 2 MB! affraid

Luiz A. Oliveira

Ranking : Nota C
Número de Mensagens : 914
Idade : 19
Data de inscrição : 08/09/2010
Notas recebidas : D-B-C
Reputação : 5
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://luizgm.blogspot.com/

Voltar ao Topo Ir em baixo

Re: Melhorando o desempenho dos jogos

Mensagem por Mr.Brum em Ter 15 Nov 2011, 12:59

Parabéns Pedro, muito bom artigo, axo que deve ser aprovado...

Só ressaltar tb, a importância de se usar o room_speed da maneira adequada... e se vc perceber que seu jogo está ficando muito pesado, faça um delta-time para que o jogo rode de maneira mais uniforme em PC´s diferentes.

Outra coisa, é usar a função exit; em códigos repetitivos e longos com várias checagens de possibilidades, isso faz com que o programa interrompa a leitura do código e prossiga ,ao ter uma condição satisfeita, dá pra se ganhar um bom tempo,agilidade e coesão com o uso dele.

Mr.Brum

Ranking : Nota C
Número de Mensagens : 913
Idade : 25
Data de inscrição : 28/04/2011
Notas recebidas : D + D + C + C + D + B
Reputação : 41
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

http://mrbrumgames.blogspot.com/

Voltar ao Topo Ir em baixo

Re: Melhorando o desempenho dos jogos

Mensagem por peixoto em Ter 15 Nov 2011, 13:09

luiz_100juizo escreveu:Very bom.
Muito bom monolo, vai ser muito bom pros jogos pesados aqui do fórum.
Mas tanho uma pergunta.
-As extensões são compiladas junto do source do jogo?
Porque fiz essa pergunta: Porque quando uso apenas um objeto, uma room, e uma função externa meu source ja pesa 2 MB! affraid

@pergunta: deve ser por que a extenção .exe é bem mais pesada do que a extençao(por exemplo) .gmk

ambas reunem arquivos que podem dar um gameplay, mas a exe só serve para rodar o jogo e a gmk serve mais para compactar todas as informações.E também,quanto mais nova a versão do game maker, mais pesada é cada game feito nele.a ultima versão (8.1) com um objeto, 1 sprite e 1 room chega a 4mb.


@topico: muito bom pedro! e outra dica para melhorar o desempenho(e evitar travamento) é ir em: global game setting -> (aba) other -> game process priority. La marque a ultima opçao(highest).Mas neste caso é apenas recomendavel a quem tem um pc mais novo(senao pode travar muito no começo e deixar o resto dos processos do pc lentos).


Até

peixoto

Ranking : Nota D
Número de Mensagens : 911
Idade : 21
Data de inscrição : 14/02/2010
Notas recebidas : D
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Melhorando o desempenho dos jogos

Mensagem por PedroX em Ter 15 Nov 2011, 13:16

outra dica para melhorar o desempenho(e evitar travamento) é ir em: global game setting -> (aba) other -> game process priority. La marque a ultima opçao(highest).

Isso pode deixar o computador instável.
Os outros processos vão ficar lentos e quando você fechar o jogo, os processos podem não voltar a ser como antes (a menos que você reinicie o pc).

Até mais!

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Melhorando o desempenho dos jogos

Mensagem por peixoto em Ter 15 Nov 2011, 13:17

Pedrø escreveu:
outra dica para melhorar o desempenho(e evitar travamento) é ir em: global game setting -> (aba) other -> game process priority. La marque a ultima opçao(highest).

Isso pode deixar o computador instável.
Os outros processos vão ficar lentos e quando você fechar o jogo, os processos podem não voltar a ser como antes (a menos que você reinicie o pc).

Até mais!

por isto recomendei a computadores mais novos com mais de 1 nucleo.


mas sem off topic: gostei mesmo do tutorial e vou utilisalo nos meus proximos games.

peixoto

Ranking : Nota D
Número de Mensagens : 911
Idade : 21
Data de inscrição : 14/02/2010
Notas recebidas : D
Reputação : 3
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: Melhorando o desempenho dos jogos

Mensagem por PedroX em Ter 15 Nov 2011, 13:59

Outra dica é usar a DLL:
http://gmc.yoyogames.com/index.php?showtopic=438215

Ela limpa muito bem a memória.

Aqui o consumo de memória diminuiu mais de um terço.

Até mais!

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Melhorando o desempenho dos jogos

Mensagem por luiz_eldorado em Qua 16 Nov 2011, 19:50

Ah, uma coisa boa também é que em vez de usar todas as condições no Step, usar os Triggers, pois eles não são verificados a cada Step, eles simplesmente são executados quando a condição for verdadeira. E também é bom pois mesmo no meio, no final ou no começo do Step, eles poder ser True, enquanto nos Step é somente a cada Step. Se a condição é True no Draw, quando usamos Triggers, ela é executada no mesmo instante, mas se for no Step, vai ser somente no próximo Step.

luiz_eldorado

Ranking : Nota C
Número de Mensagens : 928
Idade : 17
Data de inscrição : 30/07/2011
Notas recebidas : C
Reputação : 47
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 1

http://luizpontes.tk/

Voltar ao Topo Ir em baixo

Re: Melhorando o desempenho dos jogos

Mensagem por saim em Qua 16 Nov 2011, 21:27

Pedro, você deveria ganhar uma medalha. Sempre postando os tutoriais que eu adoraria que existissem.
Uma dica um pouco mais avançada é evitar o uso de loops, se possível. Aliás, o exemplo que vou dar - exemplo esse que eu uso muito - fica pra você avaliar se é mesmo mais rápido ou não:
Código:
if !place_meeting(x+speed, y, obj_wall){ //se não colide
x+=speed //simplesmente anda e evita o loop
}
else for(i=0; i<speed; i+=1){ //se colide, anda pixel-a-pixel
if !place_meeting(x+sign(speed), y, obj_wall)
x+=sign(speed)
else break
}

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: Melhorando o desempenho dos jogos

Mensagem por PedroX em Qua 16 Nov 2011, 22:17

Na verdade, se você usar em um jogo que tem paredes comuns, você pode fazer isso:
Código:
if !place_meeting(x+speed, y, obj_wall){ //se não colide
x+=speed //simplesmente anda e evita o loop
}
else
move_contact_solid(-sign(speed)*180, speed)

Obs: manda umas dicas de tutoriais que eu faço.
Não gosto de repetir assuntos já tratados, com exceção de tutoriais superficiais.
Então fico sem ideias. Sobre ID e OBJ, acho que vou fazer, a menos que você for.

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Melhorando o desempenho dos jogos

Mensagem por Conteúdo patrocinado Hoje à(s) 09:42


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum