Entrar
Últimos assuntos
» Procuro Programador de game makerpor Wou Sex 15 Mar 2024, 10:27
» Retorno da GMBR!!!
por vinians Qui 14 Mar 2024, 19:07
» Mod APK
por gamerainha Qua 13 Mar 2024, 06:30
» Mudar cor de apenas uma palavra
por lunalol Sex 01 Mar 2024, 13:42
» Aceito pedidos de sprites (Com exemplos meus)
por Sevilha Qua 28 Fev 2024, 12:17
» Inventário simples
por Isquilo_Roedor Qui 22 Fev 2024, 15:18
» Problemas na programaçnao de inimigo [jogo DOOM LIKE]
por Black Mirror Dom 11 Fev 2024, 13:34
» ANDROID MULTI TOUCH
por DiegoBr Dom 04 Fev 2024, 12:13
» Servidor de Discord do fórum?
por Lighter Sáb 27 Jan 2024, 17:18
» Save e Load Json
por Klinton Rodrigues Qui 25 Jan 2024, 11:12
» Colisão com mais de um objeto
por aminaro Seg 22 Jan 2024, 15:02
» Oi sou novo aqui
por Thiago Silveira Alexandre Sáb 20 Jan 2024, 20:55
» Como acessar conteudo comprado no marketplace
por macmilam Sex 19 Jan 2024, 07:42
» Devlogs em vídeos do Block Room
por Joton Seg 15 Jan 2024, 16:56
» Alguém aqui já ganha dinheiro com seus games?
por Joton Seg 15 Jan 2024, 16:49
» ACERVO GMBR MAGAZINE
por Joton Qui 11 Jan 2024, 19:21
» como aumentar o obj sem aumentar a colisão??
por GabrielXavier Qua 10 Jan 2024, 07:21
» Asteroid Core - Early Acesse Update [0.2.0.0]
por JOZ. Seg 08 Jan 2024, 14:39
» Versionamento de código com GitHub
por GabrielXavier Seg 08 Jan 2024, 07:32
» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por kolesovsup Sex 29 Dez 2023, 07:16
» a funçao approach ainda existe?
por PEDRINDEV Ter 26 Dez 2023, 20:05
» Inimigo ataca até por trás! >:(
por saim Sex 22 Dez 2023, 08:55
» [RESOLVIDO]Spawn após morte
por Deception_1999 Dom 17 Dez 2023, 16:39
» Remunerado $$$ - Procuro programador para ajudar a "montar" um jogo
por theguitarmester Sáb 02 Dez 2023, 16:28
» Game maker nao abre
por Cerf Dom 26 Nov 2023, 12:01
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
» [Info] Game Maker studio Versus Game Maker 8.0
» Game Maker Collection - Diversas versões do Game Maker
» [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
» [Info] Game Maker studio Versus Game Maker 8.0
» Game Maker Collection - Diversas versões do Game Maker
» [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
|
|