Entrar
Últimos assuntos
» player não consegue andarpor lovn7 Qui 21 Nov 2024, 13:33
» É possível fazer istó no game maker
por William Lima Qui 21 Nov 2024, 10:56
» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por Lua Sáb 16 Nov 2024, 20:22
» (Resolvido) Cenario longo x Texture Pages
por josuedemoraes Sáb 16 Nov 2024, 15:31
» Kids' band
por Adilson Lucindo Santos Sex 15 Nov 2024, 12:23
» (RESOLVIDO) Engasgos-Troca de Sprites/animações
por josuedemoraes Ter 12 Nov 2024, 01:49
» Block Room - DEMO
por Joton Qua 06 Nov 2024, 22:58
» Game Infinito vertical (subindo)
por macmilam Sáb 26 Out 2024, 12:36
» Retorno da GMBR!!!
por Dancity Ter 22 Out 2024, 16:36
» Máquina de estados
por aminaro Qui 10 Out 2024, 13:33
» como faço pra um objeto colidir com o outro e diminuir a vida do player ?
por josuedemoraes Qui 03 Out 2024, 16:51
» RESOLVIDO: Colisão com objetos moveis
por josuedemoraes Qua 02 Out 2024, 20:28
» Crypt of the Blood Moon
por divin sphere Qua 11 Set 2024, 18:18
» como fazer um objeto seguir?
por divin sphere Dom 18 Ago 2024, 18:08
» Procuro de alguém para Modelar/Texturizar/Animar objetos 3D
por un00brn Dom 11 Ago 2024, 11:10
» Destruição de cenário (estilo DD Tank)
por CoronelZeg Sex 09 Ago 2024, 17:16
» RESOLVIDO-Como destruir uma instancia especifica de um objeto
por josuedemoraes Ter 23 Jul 2024, 00:40
» Automatizar a coleta de id
por GabrielXavier Seg 22 Jul 2024, 18:01
» Preciso de ajuda para concluir um pequeno projeto
por lmoura Qui 27 Jun 2024, 15:45
» ANGULO ACOMPANHAR O OBJETO
por Klinton Rodrigues Qui 27 Jun 2024, 08:34
» Musica reinicia quando sala reinicia
por GabrielXavier Ter 18 Jun 2024, 07:28
» como fazer uma copia de gd
por generico_cube Sex 14 Jun 2024, 15:48
» Square Adventure
por guilherme551 Ter 11 Jun 2024, 09:54
» como posso definir limite de uma variavel
por GabrielXavier Sex 07 Jun 2024, 14:14
» [Resolvido] Dúvida, colisão única de objeto
por vdm842 Sex 24 maio 2024, 09:50
Screen Refresh, Frameskip e Doublebuffer no Game Maker
4 participantes
Página 1 de 1
Screen Refresh, Frameskip e Doublebuffer no Game Maker
Título: Screen Refresh, Frameskip e Doublebuffer no Game Maker
Versão do GM: 6.3, 7, 8 e 8.1.
Dificuldade: Intermediário
Link para download da Engine: ENGINE
Requer Extensões: Não
Requer DLLs: Não
Tags: Screen Refresh, Frameskip,Doublebuffer
Não é incomum, ocorrer umas "travadinhas" no jogo. Em alguns casos, isso pode ocorrer devido à sobrecara de programas e processos em execução, que comprometem a performance do PC. Mas há casos, em que, mesmo quando o sistema está "levinho", o jogo não tem seu desempenho total.
Essa "travadinha" dá a impressão de que os objetos "pularam" de um lugar pra outro. Por mais estranho que possa parecer, isso decorre de um problema que se origina no cérebro do observador: ele antecipa o movimento o objeto. O cérebro "calcula" onde o objeto deverá estar no próximo instante. Como o salto é muito grande, fica-se com a impressão de que o objeto "sumiu" e "reapareceu" em outro lugar.
Alguns jogos resolvem isso carregando a visão do jogador com tantos elementos se movendo, que mesmo um observador muito atento não consegue antecipar tudo. O fato é que esse problema tem uma origem, que é o refresh de vídeo, que também tem solução.
Nesse tutorial, vamos falar um pouco sobre o refresh de vídeo e como podemos trabalhar com ele para amenizar esses problemas. Também vamos aprender a fazer um frameskip no jogo, mas isso requer algumas mudanças no seu projeto, então...
Boa leitura!
Toda estrutura de vídeo é baseada em uma memória à parte da memória principal do computador, que chamamos de "memória de vídeo" ou simplesmente "VRAM". Quanto mais memória de vídeo o nosso PC dispõe, mais fácil fica o trabalho do processador
ao lidar com elementos gráficos, uma vez que ele pode operar diretamente nesta memória.
Embora seja muito simples, nem sempre isso significa "mais velocidade". Por mais rápido que nosso processador seja, ou por mais processadores que se tenha, dois deles não podem acessar o mesmo endereço de memória ao mesmo tempo, e, toda imagem que nos é mostrada no monitor, parte da memória principal para a memória de vídeo.
Mesmo que a placa de vídeo tenha um processador próprio, utilize portas ultra rápidas ou outro recursos técnicos (que o vendedor provavelmente usou pra te convercer a comprá-la), no momento em que a informação gráfica está sendo transferida,
o processador não pode usar aqueles endereços e "fica esperando" até que o serviço de transferência termine.
Esse "serviço" é justamente o refresh. Quando esse "serviço" termina, a tela é atualizada e mostrada pra gente.
É verdade que todos os dias novas tecnologias aparecem para solucionar todo tipo de problema. Os fabricantes de hardware estão cada dia mais engajados em criar novas placas de vídeo com super desempenho. Mas ao mesmo tempo em que "ganhamos"
(até doeu o bolso, agora) mais velocidade de processamento, as informações que são mostradas no monitor também aumentaram.
Diga-se de passagem, os jogos com gráficos de "cair o queixo". E não tem perdão: essa Skin alienígena que você está usando no seu novíssimo Windows Vista, também faz parte da brincadeira. [Z¬)]
Voltando ao assunto, vamos então, experimentar uma das funções do Game Maker que trabalha justamente com o serviço refresh de vídeo: a função screen_refresh(). Também vamos aprender a fazer um Frameskip pra tentar contornar os problemas
de velocidade do jogo... o que eu vou explicar mais adiante. Por enquanto, vamos nos manter no refresh de vídeo e como ele funciona na nossa ferramenta de programação, o Game Maker é claro.
Toda vez que o o nosso jogo "executa", há uma atualização constante da tela, através de um sistema chamado Doublebuffer. Basicamente, essa atualização da tela do jogo funciona como se fosse um relógio num "tique-taque". Tique: pega as informações com os objetos (aquilo que será desenhado). Taque: desenha tudo na tela. Tique: pega, taque: desenha. E a medida que essas condições de vão sendo satisfeitas (enquanto nosso joguinho "tá rodando"), o Doublebuffer vai trabalhando com tique e taque, faça chuva ou faça sol.
Pra você entender o que é realmente o Doublebuffer, ele funciona assim: o DirectX prepara uma área idêntica à área correspondente do vídeo, porém, essa área é acessada única e exclusivamente pelo processador. Daí, o processador pode
trabalhar nela de forma "tranquila", sem padecer de problemas com o refresh. Ele só vai fazê-lo quando chegar a hora, ou seja, quando processar toda a informação daquela área.
Em resumo, quando desenhamos algo no evento Draw, há uma "espera" para que o desenho seja "jogado na tela", uma vez que isso só vai se realizar no final do passo do relógio, e não "naquela hora".
O que acontece quando usamos a função screen_fresh(), é na realidade, uma atualização "antes da hora". Sempre que instruímos o Game Maker para que ele desenhe algo no Canvas (Canvas é como se chama a área da memória onde estão os pixels que compõem toda a imagem da tela do jogo), a imagem é atualizada no final da execução do "tique" do relógio, e não imediatamente como gostaríamos. Com screen_refresh(), ela é atualizada imediatamente, antes do "taque".
Usar a função não tem segredo. É só "botar" um screen_refresh() e pronto! A atualização é feita. É por isso que é importante saber como o refresh de vídeo funciona. [Z¬)]
É legal saber, que essa função é bastante usada também, dentro de loops ou situações que "esperam" que algo aconteça.
Frameskip significa "salto de quadros". Pra que a gente entenda o que significa isso, vamos assimilar a palavra "quadro" ao termo animação. Embora na prática seja diferente, o raciocínio é praticamente o mesmo. Em uma animação, cada elemento do
conjunto de imagens que a compõe é um "quadro", ou "frame". Esses "quadros de animação", são exibidos de forma exclusiva e sequencial.
A mesma coisa acontence com o Doublebuffer. A cada momento a tela é atualizada para um novo quadro, como se fosse uma animação (o que de fato é [Z¬)]). Mas, quando há muitos quadros a serem exibidos, ou no caso do Doublebuffer, quando há
muita informação a ser processada, o desempenho do jogo cai, tornando a experiência de "jogar" bem frustrante, certo?
Aí é que entra o "salto de quadros". Quem é fanático por emuladores, já conhece bem.
Esse salto, pode e vai "aliviar" o trabalho do Doublebuffer que não precisará processar todos os quadros, tornando o jogo mais rápido, porém, com menos "perfeição de movimentos". A sensação é exatamente igual à quando a gente "apaga" alguns quadros de um sprite, deixando-o com a animação mais rápida. Isso vai tornar a taxa de fps, ou seja, Frames per second (quandros por segundo), maior, e consequentemente um jogo mais rápido.
Pra gente fazer o Frameskip, vamos precisar de duas funções dentro do Game Maker. São elas:
Muita atenção:
Há um fator importante que tem que ser abordado antes implementarmos o Frameskip, o que o tornará viável ou inviável, dependendo exclusivamente de como você programou seu jogo. Isso que eu vou escrever agora é importante, então fique atento!
Toda informação presente nos eventos Draw dos objetos atenderão à velocidade em que os quadros são processados pelo Doublebuffer! Em outras palavras, se você usar uma rotina para checar o status do mouse ou do teclado dentro do evento Draw, ela só "acontecerá" quando a tela for atualizada por nós!
Isso também acontencerá com valores atribuídos à variáveis e transições de room! Por isso, não custa lembrar que eu estou ensinando à você o método. Você deve adaptá-lo para o seu jogo e trabalhar nele, pois ninguém melhor do que você para conhecer seu projeto. [Z¬D]
Montando:
Se você estiver com muita preguiça, baixe o exemplo clicando aqui.
Crie um objeto chamado FrameSkipMonitor, defina-o como persistente, com depth bem baixo (para que fique à frente das outras instâncias) e coloque-o na primeira room do jogo. No evento Create deste objeto, coloque o código abaixo:
Espero que tenham gostado da matéria. Boa sorte pra vocês!
Capitão Commando.
Versão do GM: 6.3, 7, 8 e 8.1.
Dificuldade: Intermediário
Link para download da Engine: ENGINE
Requer Extensões: Não
Requer DLLs: Não
Tags: Screen Refresh, Frameskip,Doublebuffer
Não é incomum, ocorrer umas "travadinhas" no jogo. Em alguns casos, isso pode ocorrer devido à sobrecara de programas e processos em execução, que comprometem a performance do PC. Mas há casos, em que, mesmo quando o sistema está "levinho", o jogo não tem seu desempenho total.
Essa "travadinha" dá a impressão de que os objetos "pularam" de um lugar pra outro. Por mais estranho que possa parecer, isso decorre de um problema que se origina no cérebro do observador: ele antecipa o movimento o objeto. O cérebro "calcula" onde o objeto deverá estar no próximo instante. Como o salto é muito grande, fica-se com a impressão de que o objeto "sumiu" e "reapareceu" em outro lugar.
Alguns jogos resolvem isso carregando a visão do jogador com tantos elementos se movendo, que mesmo um observador muito atento não consegue antecipar tudo. O fato é que esse problema tem uma origem, que é o refresh de vídeo, que também tem solução.
Nesse tutorial, vamos falar um pouco sobre o refresh de vídeo e como podemos trabalhar com ele para amenizar esses problemas. Também vamos aprender a fazer um frameskip no jogo, mas isso requer algumas mudanças no seu projeto, então...
Boa leitura!
O Buffer de Vídeo
Toda estrutura de vídeo é baseada em uma memória à parte da memória principal do computador, que chamamos de "memória de vídeo" ou simplesmente "VRAM". Quanto mais memória de vídeo o nosso PC dispõe, mais fácil fica o trabalho do processador
ao lidar com elementos gráficos, uma vez que ele pode operar diretamente nesta memória.
Embora seja muito simples, nem sempre isso significa "mais velocidade". Por mais rápido que nosso processador seja, ou por mais processadores que se tenha, dois deles não podem acessar o mesmo endereço de memória ao mesmo tempo, e, toda imagem que nos é mostrada no monitor, parte da memória principal para a memória de vídeo.
Mesmo que a placa de vídeo tenha um processador próprio, utilize portas ultra rápidas ou outro recursos técnicos (que o vendedor provavelmente usou pra te convercer a comprá-la), no momento em que a informação gráfica está sendo transferida,
o processador não pode usar aqueles endereços e "fica esperando" até que o serviço de transferência termine.
Esse "serviço" é justamente o refresh. Quando esse "serviço" termina, a tela é atualizada e mostrada pra gente.
É verdade que todos os dias novas tecnologias aparecem para solucionar todo tipo de problema. Os fabricantes de hardware estão cada dia mais engajados em criar novas placas de vídeo com super desempenho. Mas ao mesmo tempo em que "ganhamos"
(até doeu o bolso, agora) mais velocidade de processamento, as informações que são mostradas no monitor também aumentaram.
Diga-se de passagem, os jogos com gráficos de "cair o queixo". E não tem perdão: essa Skin alienígena que você está usando no seu novíssimo Windows Vista, também faz parte da brincadeira. [Z¬)]
Voltando ao assunto, vamos então, experimentar uma das funções do Game Maker que trabalha justamente com o serviço refresh de vídeo: a função screen_refresh(). Também vamos aprender a fazer um Frameskip pra tentar contornar os problemas
de velocidade do jogo... o que eu vou explicar mais adiante. Por enquanto, vamos nos manter no refresh de vídeo e como ele funciona na nossa ferramenta de programação, o Game Maker é claro.
Toda vez que o o nosso jogo "executa", há uma atualização constante da tela, através de um sistema chamado Doublebuffer. Basicamente, essa atualização da tela do jogo funciona como se fosse um relógio num "tique-taque". Tique: pega as informações com os objetos (aquilo que será desenhado). Taque: desenha tudo na tela. Tique: pega, taque: desenha. E a medida que essas condições de vão sendo satisfeitas (enquanto nosso joguinho "tá rodando"), o Doublebuffer vai trabalhando com tique e taque, faça chuva ou faça sol.
Pra você entender o que é realmente o Doublebuffer, ele funciona assim: o DirectX prepara uma área idêntica à área correspondente do vídeo, porém, essa área é acessada única e exclusivamente pelo processador. Daí, o processador pode
trabalhar nela de forma "tranquila", sem padecer de problemas com o refresh. Ele só vai fazê-lo quando chegar a hora, ou seja, quando processar toda a informação daquela área.
Em resumo, quando desenhamos algo no evento Draw, há uma "espera" para que o desenho seja "jogado na tela", uma vez que isso só vai se realizar no final do passo do relógio, e não "naquela hora".
O que acontece quando usamos a função screen_fresh(), é na realidade, uma atualização "antes da hora". Sempre que instruímos o Game Maker para que ele desenhe algo no Canvas (Canvas é como se chama a área da memória onde estão os pixels que compõem toda a imagem da tela do jogo), a imagem é atualizada no final da execução do "tique" do relógio, e não imediatamente como gostaríamos. Com screen_refresh(), ela é atualizada imediatamente, antes do "taque".
Usar a função não tem segredo. É só "botar" um screen_refresh() e pronto! A atualização é feita. É por isso que é importante saber como o refresh de vídeo funciona. [Z¬)]
É legal saber, que essa função é bastante usada também, dentro de loops ou situações que "esperam" que algo aconteça.
- Código:
screen_refresh();
Simulando o Frameskip
Frameskip significa "salto de quadros". Pra que a gente entenda o que significa isso, vamos assimilar a palavra "quadro" ao termo animação. Embora na prática seja diferente, o raciocínio é praticamente o mesmo. Em uma animação, cada elemento do
conjunto de imagens que a compõe é um "quadro", ou "frame". Esses "quadros de animação", são exibidos de forma exclusiva e sequencial.
A mesma coisa acontence com o Doublebuffer. A cada momento a tela é atualizada para um novo quadro, como se fosse uma animação (o que de fato é [Z¬)]). Mas, quando há muitos quadros a serem exibidos, ou no caso do Doublebuffer, quando há
muita informação a ser processada, o desempenho do jogo cai, tornando a experiência de "jogar" bem frustrante, certo?
Aí é que entra o "salto de quadros". Quem é fanático por emuladores, já conhece bem.
Esse salto, pode e vai "aliviar" o trabalho do Doublebuffer que não precisará processar todos os quadros, tornando o jogo mais rápido, porém, com menos "perfeição de movimentos". A sensação é exatamente igual à quando a gente "apaga" alguns quadros de um sprite, deixando-o com a animação mais rápida. Isso vai tornar a taxa de fps, ou seja, Frames per second (quandros por segundo), maior, e consequentemente um jogo mais rápido.
Pra gente fazer o Frameskip, vamos precisar de duas funções dentro do Game Maker. São elas:
- Código:
set_automatic_draw(true/false)
- Código:
screen_redraw()
Muita atenção:
Há um fator importante que tem que ser abordado antes implementarmos o Frameskip, o que o tornará viável ou inviável, dependendo exclusivamente de como você programou seu jogo. Isso que eu vou escrever agora é importante, então fique atento!
Toda informação presente nos eventos Draw dos objetos atenderão à velocidade em que os quadros são processados pelo Doublebuffer! Em outras palavras, se você usar uma rotina para checar o status do mouse ou do teclado dentro do evento Draw, ela só "acontecerá" quando a tela for atualizada por nós!
Isso também acontencerá com valores atribuídos à variáveis e transições de room! Por isso, não custa lembrar que eu estou ensinando à você o método. Você deve adaptá-lo para o seu jogo e trabalhar nele, pois ninguém melhor do que você para conhecer seu projeto. [Z¬D]
Montando:
Se você estiver com muita preguiça, baixe o exemplo clicando aqui.
Crie um objeto chamado FrameSkipMonitor, defina-o como persistente, com depth bem baixo (para que fique à frente das outras instâncias) e coloque-o na primeira room do jogo. No evento Create deste objeto, coloque o código abaixo:
- Código:
set_automatic_draw(false);
global.FrameSkip := 1;
alarm[0] := global.FrameSkip;
Info := ('Fps = ' + string(fps) + '#Frameskip = ' + string(global.FrameSkip));
ShowInfo := 1;
- Código:
if keyboard_check_pressed(vk_f2) then ShowInfo *= (-1);
if keyboard_check_pressed(vk_f3) then global.FrameSkip -= 1;
if keyboard_check_pressed(vk_f4) then global.FrameSkip += 1;
if global.FrameSkip < 0 then global.FrameSkip := 0;
if global.FrameSkip > 10 then global.FrameSkip := 10;
Info := ('Fps = ' + string(fps) + '#Frameskip = ');
if global.FrameSkip = 0 then
begin
set_automatic_draw(true);
Info += 'Auto';
end
else
begin
set_automatic_draw(false);
Info += string(global.FrameSkip);
end;
- Código:
if global.FrameSkip = 0 then { alarm[0] := 1; exit; }
alarm[0] := global.FrameSkip;
screen_redraw();
- Código:
if ShowInfo <> 1 then exit;
draw_set_halign(fa_left);
draw_set_valign(fa_top);
draw_set_alpha(1);
draw_set_color(c_black);
draw_rectangle(0, 0, string_width(Info), string_height(Info), false);
draw_set_color(c_lime);
draw_text(0, 0, Info);
Espero que tenham gostado da matéria. Boa sorte pra vocês!
Capitão Commando.
Última edição por Capitão Commando em Sáb 21 Nov 2009, 07:08, editado 6 vez(es)
Convidad- Convidado
Re: Screen Refresh, Frameskip e Doublebuffer no Game Maker
AAAA, Fantástico!
Cara... Incrível... Não podia esperar menos de meu Fã! =D
-----------------------------
Capitão Commando, Meu mestre! *---*
Estou boquiaberto, de quão fantástico fico isso!
Cara... Incrível... Não podia esperar menos de meu Fã! =D
-----------------------------
Capitão Commando, Meu mestre! *---*
Estou boquiaberto, de quão fantástico fico isso!
RodrigoM.- Data de inscrição : 06/08/2009
Reputação : 5
Número de Mensagens : 569
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: Screen Refresh, Frameskip e Doublebuffer no Game Maker
Nossa cara, seu tutorial é nota 1000, na boa, você sabe fazer jogos muito bons, e também sabe fazer tutoriais super bons! Olha, vou te transformar em um fã também. Você é demais!
fonetico- Data de inscrição : 05/10/2009
Reputação : 7
Número de Mensagens : 1830
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: Screen Refresh, Frameskip e Doublebuffer no Game Maker
CyraxX escreveu:AAAA, Fantástico!
Cara... Incrível... Não podia esperar menos de meu Fã! =D
-----------------------------
Capitão Commando, Meu mestre! *---*
Estou boquiaberto, de quão fantástico fico isso!
Acho q vc quis dizer q você é fã dele, e não q ele é seu fã.
Voce poderia falar "meu ídolo".
Re: Screen Refresh, Frameskip e Doublebuffer no Game Maker
Valeu por comentar moçada! Espero que tenham gostado da matéria. [Z¬D]
Convidad- Convidado
Re: Screen Refresh, Frameskip e Doublebuffer no Game Maker
Bem shatterhand2, Minha intenção foi falar
que ele é meu maior, Fã.
Mais isso não é o assunto do Tópico, Né?! =D
---------------------
è shatterhand2 VocÊ estava certo... ASHSUAHUASHUAS
Capitão Commando meu ídolo! aSHUASHU
que ele é meu maior, Fã.
Mais isso não é o assunto do Tópico, Né?! =D
---------------------
è shatterhand2 VocÊ estava certo... ASHSUAHUASHUAS
Capitão Commando meu ídolo! aSHUASHU
Última edição por CyraxX em Sex 20 Nov 2009, 10:15, editado 1 vez(es)
RodrigoM.- Data de inscrição : 06/08/2009
Reputação : 5
Número de Mensagens : 569
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Re: Screen Refresh, Frameskip e Doublebuffer no Game Maker
Como sempre um ótimo tutorial! É bom saber usar isso pois, as vezes fazendo um jogo com uma necessidade grande atualizações utilizando essa técnica da pra minimizar bastante o peso do freresh no game. Creio que para um jogo de maior porte esse técnica seja fundamental, elém de ser uma oportunidade boa de aprender mais sobre "os misterios" do GM. Muito bom!
Tópicos semelhantes
» Screen "Created with Game Maker"
» Portar código do Game Maker 8.1 para o Game Maker Studio
» Game Maker Collection - Diversas versões do Game Maker
» [Info] Game Maker studio Versus Game Maker 8.0
» [Resolvido]pra que serve a função Run game in debug mode do game maker 8
» Portar código do Game Maker 8.1 para o Game Maker Studio
» Game Maker Collection - Diversas versões do Game Maker
» [Info] Game Maker studio Versus Game Maker 8.0
» [Resolvido]pra que serve a função Run game in debug mode do game maker 8
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos