Obrigado por visitar a The Game Makers Brasil 😁 Use o fórum de Dúvidas para fazer perguntas. Se está em busca de aprender dê uma olhada nos tutoriais.

Custo de Memoria de Instâncias

Perguntas? A comunidade te ajuda a resolver.
Avatar do usuário
Eduardo Macedo
Programador
Programador
Reações: 0
Mensagens: 31

Custo de Memoria de Instâncias

Mensagem por Eduardo Macedo » Seg Set 05, 2016 6:50 pm

Gostaria de saber qual dos tipos exige mais do processador
usar uma instância com muitos scripts ou
usar varias instâncias com poucos scripts em casa

levando em consideração a proporção de scripts usados
quando programo eu tento usar o mínimo de objetos possíveis, as vezes tem coisas que da pra ser programado somente com um objeto,
 fica bem mais trabalhoso mas funciona.

Eu prefiro dar aquela otimizada e ver a possibilidade de usar somente 1 objeto, por exemplo criar uma loja
uso ds_map, ds_grid ou ds_list, somente usando imagens "ilustrativas" porém interativas como funçoes point_in_rectangle e outras mais.

Então queria saber da galera experiente se isso é bom ou ruim , o caso da memória, qualquer opinião é bem vinda.

Avatar do usuário
Golden Bunny
Membro
Membro
Reações: 0
Mensagens: 44

Re: Custo de Memoria de Instâncias

Mensagem por Golden Bunny » Seg Set 05, 2016 7:30 pm

Quanto mais instâncias, mais processamento utilizado, pode não parecer mas o GameMaker faz muita coisa por "debaixo dos panos" para cada instância, como atualizar suas variáveis, chamar os eventos, etc. 
Além de que consome mais memória.
"Nunca morra virgem, os unicórnios morreram virgens, por isso não existem mais" < Gonzo, o eterno filósofo.

Avatar do usuário
Superbomber
Programador
Programador
Reações: 0
Mensagens: 283
Localização: Natal-RN

Re: Custo de Memoria de Instâncias

Mensagem por Superbomber » Seg Set 05, 2016 8:50 pm

Hyreos tem toda a razão. :detetive:

O script vai ocupar a mesma quantidade de memória independentemente se ele foi dividido ou não.
Mas quanto mais instâncias, maior consumo de processamento e memória.
Mas a diferença extra de memória é irrelevante quando estamos falando de uma unidade que tem apenas o intuito de executar um código.

Eu costumo criar um objeto para formar a interface, e outro para códigos gerais.
Recomendo que organize dividindo desta forma, ou como seja de melhor organização.

Mas não faça isso achando que irá melhorar o desempenho, e nem tenha medo de organizar achando que irá atrapalhar o desempenho do jogo.

Bye. :flw:
Entrem neste link com o JavaScript desabilitado e vejam a mágica: https://tgmbrasil.com.br/?PageSpeed=n0script

Avatar do usuário
gabrielsch
Colaborador
Colaborador
Reações: 0
Mensagens: 234

Re: Custo de Memoria de Instâncias

Mensagem por gabrielsch » Seg Set 05, 2016 9:41 pm

Eu já fiz esse tipo de teste e posso te garantir que uma instancia com 10 variaveis consome menos memória que um DS Map com 10 itens, parece estranho mas basta fazer o teste e você vai ver o o consumo de memória ir para os ares ao criar 100 Maps com 10 itens cada em comparação com 100 instancias com 10 variáveis cada.
Imagem

Avatar do usuário
Denis Lemos
Membro
Membro
Reações: 0
Mensagens: 49

Re: Custo de Memoria de Instâncias

Mensagem por Denis Lemos » Ter Set 06, 2016 12:46 am

Também ajuda bastante programar de forma eficiente. Um erro que acontece muito, é colocar os scripts ou funções nos objetos errados.
Por exemplo:

Temos 50 instâncias de um objeto quadrado na cena e uma instância de um objeto circular. Queremos que quando os dois se colidam, a instância do objeto quadrado seja destruída e aumente um ponto no jogo. Muitas vezes por desatenção colocamos o script com a verificação de colisão no objeto quadrado, em vez de colocar no objeto circular. Desse modo vamos ter 50 instâncias verificando colisão individualmente em cada frame, mas poderia ser apenas uma instância fazendo o calculo se tivéssemos colocado o script no objeto circular.

Avatar do usuário
Golden Bunny
Membro
Membro
Reações: 0
Mensagens: 44

Re: Custo de Memoria de Instâncias

Mensagem por Golden Bunny » Ter Set 06, 2016 9:31 am

Denis Lemos escreveu:Também ajuda bastante programar de forma eficiente. Um erro que acontece muito, é colocar os scripts ou funções nos objetos errados.
Por exemplo:

Temos 50 instâncias de um objeto quadrado na cena e uma instância de um objeto circular. Queremos que quando os dois se colidam, a instância do objeto quadrado seja destruída e aumente um ponto no jogo. Muitas vezes por desatenção colocamos o script com a verificação de colisão no objeto quadrado, em vez de colocar no objeto circular. Desse modo vamos ter 50 instâncias verificando colisão individualmente em cada frame, mas poderia ser apenas uma instância fazendo o calculo se tivéssemos colocado o script no objeto circular.
Na verdade, daria no mesmo já que o objeto "circular" iria testar a colisão com todas as 50 instâncias do objeto "quadrado".
Nesse seu caso o que poderia aumentar um pouco pouco o processamento seria o fato de que o programa tem que se deslocar na memória até achar a função que você chamou, mas isso não acontece no GaymeMaker, já que os métodos declarados no mesmo são nada mais que funções inline.
Leia mais sobre funções inline em:
ENTRE AQUI E SALVE O VACAJAIRO
"Nunca morra virgem, os unicórnios morreram virgens, por isso não existem mais" < Gonzo, o eterno filósofo.

Avatar do usuário
Superbomber
Programador
Programador
Reações: 0
Mensagens: 283
Localização: Natal-RN

Re: Custo de Memoria de Instâncias

Mensagem por Superbomber » Ter Set 06, 2016 11:49 am

Na verdade, na verdade mesmo...
Nenhum dos objetos checariam colisão se não estivessem próximos o suficiente.

Pelo menos foi assim que fiz, não há porque verificar colisão se sequer estão próximos o suficiente para colidir. :detetive:
Tenho certeza que no GM fizeram algo semelhante.

Mas seria como o Hyreos disse, ou o circulo checaria cada um dos quadrados... ou cada um dos quadrados checariam o círculo.
Mas com certeza, só checa a distância.(a menos que realmente haja a possibilidade de colisão, mas no caso só checaria colisão com aquela instância específica)

Acredite, em uma linguagem de alto nível não há muita coisa a ser feita para melhorar desempenho etc. No máximo podem ter uma boa prática na programação, tipo isso:

Código: Selecionar todos

if(legal){
   legal = false;
} else {
   legal = true;
}
// OU
legal = !legal;
Eu cometia este erro. Bye. :flw:

EDIT: Então basicamente uma função inline seria tipo um macro em ASM...Não sabia disso, mas se a função for grande vai aumentar um pouco(muito) o tamanho do .exe.
Mas a diferença de desempenho não é muita coisa. A menos que seja executado várias vezes em sequência...Tipo no GM. >.<
Entrem neste link com o JavaScript desabilitado e vejam a mágica: https://tgmbrasil.com.br/?PageSpeed=n0script

Avatar do usuário
Denis Lemos
Membro
Membro
Reações: 0
Mensagens: 49

Re: Custo de Memoria de Instâncias

Mensagem por Denis Lemos » Ter Set 06, 2016 12:27 pm

Hyreos escreveu:
Denis Lemos escreveu:Também ajuda bastante programar de forma eficiente. Um erro que acontece muito, é colocar os scripts ou funções nos objetos errados.
Por exemplo:

Temos 50 instâncias de um objeto quadrado na cena e uma instância de um objeto circular. Queremos que quando os dois se colidam, a instância do objeto quadrado seja destruída e aumente um ponto no jogo. Muitas vezes por desatenção colocamos o script com a verificação de colisão no objeto quadrado, em vez de colocar no objeto circular. Desse modo vamos ter 50 instâncias verificando colisão individualmente em cada frame, mas poderia ser apenas uma instância fazendo o calculo se tivéssemos colocado o script no objeto circular.
Na verdade, daria no mesmo já que o objeto "circular" iria testar a colisão com todas as 50 instâncias do objeto "quadrado".
Nesse seu caso o que poderia aumentar um pouco pouco o processamento seria o fato de que o programa tem que se deslocar na memória até achar a função que você chamou, mas isso não acontece no GaymeMaker, já que os métodos declarados no mesmo são nada mais que funções inline.
Leia mais sobre funções inline em:
ENTRE AQUI E SALVE O VACAJAIRO
Na verdade eu não sabia como o GM faz a checagem de colisão. Então quer dizer que se eu colocar o código "place_meeting(x,y, obj_quadrado)" no Step do  obj_circulo, o GM vai executar uma espécie de loop "for" com 50 repetições(número de instâncias do outro objeto na cena) e retornar verdadeiro, caso a sua mascara de colisão intercepte alguma mascara de colisão de alguma das outras instâncias? Nesse caso, então o número de instâncias na cena interfere bastante no desempenho, principalmente em dispositivos móveis.


A lógica do @Superbomber faz sentido, pois já que vai ter que percorrer cada instância individualmente toda vez que nós verificarmos uma colisão, seria mais prudente primeiro verificar se estão próximos o suficiente para não desperdiçar processamento calculando a colisão.


Mas ainda assim, o erro que comentei no tópico acima pode acontecer e com frequência, o exemplo da colisão foi só um exemplo equivocado da minha parte por não saber como as colisões são feitas.

Avatar do usuário
Golden Bunny
Membro
Membro
Reações: 0
Mensagens: 44

Re: Custo de Memoria de Instâncias

Mensagem por Golden Bunny » Ter Set 06, 2016 7:57 pm

Superbomber escreveu:Na verdade, na verdade mesmo...
Nenhum dos objetos checariam colisão se não estivessem próximos o suficiente.

Pelo menos foi assim que fiz, não há porque verificar colisão se sequer estão próximos o suficiente para colidir. :detetive:
Tenho certeza que no GM fizeram algo semelhante.

Mas seria como o Hyreos disse, ou o circulo checaria cada um dos quadrados... ou cada um dos quadrados checariam o círculo.
Mas com certeza, só checa a distância.(a menos que realmente haja a possibilidade de colisão, mas no caso só checaria colisão com aquela instância específica)

Acredite, em uma linguagem de alto nível não há muita coisa a ser feita para melhorar desempenho etc. No máximo podem ter uma boa prática na programação, tipo isso:

Código: Selecionar todos

if(legal){
   legal = false;
} else {
   legal = true;
}
// OU
legal = !legal;
Eu cometia este erro. Bye. :flw:

EDIT: Então basicamente uma função inline seria tipo um macro em ASM...Não sabia disso, mas se a função for grande vai aumentar um pouco(muito) o tamanho do .exe.
Mas a diferença de desempenho não é muita coisa. A menos que seja executado várias vezes em sequência...Tipo no GM. >.<
Na verdade.. Não, o GameMaker não checa se os objetos estão próximos para verificar a colisão, tanto que quando o Gonçalves fez o Evertown o mesmo teve esse problema, e teve que codificar esse esse sistema citado por você.
"Nunca morra virgem, os unicórnios morreram virgens, por isso não existem mais" < Gonzo, o eterno filósofo.

Avatar do usuário
gabrielsch
Colaborador
Colaborador
Reações: 0
Mensagens: 234

Re: Custo de Memoria de Instâncias

Mensagem por gabrielsch » Ter Set 06, 2016 9:57 pm

Hyreos escreveu:[...]já que os métodos declarados no mesmo são nada mais que funções inline.
Usando a "compilação padrão" eu não posso afirmar nada, mas tenho certeza que os scripts são referenciados utilizando o YYC por causa da necessidade de chamar o método gml_pragma("forceinline") para obter esse resultado.

Como já disse no meu último post aconselho utilizar instancias caso queira o menor uso de memória possivel, ou utilize Data Structure se o desempenho ao longo do tempo for mais importante. Talvez criar uma List com ID de instancias e desativa-las e ativa-las quando necessário possa ser um experimento divertido de se fazer pra procurar um equilíbrio.
Imagem

Trancado

Quem está online

Usuários navegando neste fórum: Google [Bot] e 4 visitantes