Erro em surface de vídeo...

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

Erro em surface de vídeo...

Mensagem por Convidad em Dom 10 Out 2010, 22:32

É o seguinte... eu criei uma surface de vídeo, 800 x 600, acho que é um tamanho modesto, não é exagerado e não "pesa" na memória em nada. Tomei o cuidado de fazê-lo na primeira room, onde também defino todos as outras configurações do jogo. Isso significa que essa surface é criada apenas uma vez durante a execução do jogo.

O que acontece é o seguinte, toda vez que o jogo termina, eu libero a memória usada pela surface com surface_free() normalmente. Mas certas ocasiões onde tento executar o jogo novamente, o Game Maker gera um erro com uma mensagem dizendo que a surface não pôde ser criada! Quando eu altero a resolução do monitor ou reinicio a máquina, o jogo funciona normalmente!

Eu tô martelando o Game Maker há um tempão e nunca vi isso acontecer. Não é falta de memória, definitivamente. Eu já testei em outras máquinas e o problema persiste. O que mata o Game Maker é isso, os bugs que ele tem são sérios, pegam pra desanimar mesmo.

Convidad
Convidado


Voltar ao Topo Ir em baixo

Re: Erro em surface de vídeo...

Mensagem por Fuzenrad em Dom 10 Out 2010, 23:03

Interessante, eu já tive problemas relacionados a isso, mas era com um surface maior (1024x768), executava somente 1 vez, sem maiores problemas, e quando rodava novamente, mostrava a mensagem de erro, outro erro que encontrei é quando altera a resolução seguidas vezes, em algum momento ele retorna "parâmetro inválido.", mas acho que isso é da versão atual, pois nas versões anteriores eu nunca tive problemas assim.

Fuzenrad

Ranking : Nota A
Número de Mensagens : 1026
Idade : 26
Data de inscrição : 04/07/2010
Notas recebidas : A-A-A-A-B
Reputação : 41
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 1

Voltar ao Topo Ir em baixo

Re: Erro em surface de vídeo...

Mensagem por Convidad em Dom 10 Out 2010, 23:25

Na realidade, eu venho programando o uso desta surface no Game Maker 6.1. Eu não testei no Game Maker 8. Mas é um problema que eu acredito ser dos piores. Digo isso porque se o problema reside em como o Game Maker gerencia a memória, então não deve haver o que se fazer agora, a não ser trabalhar somente em uma resolução menor.

Isso está tornando meu trabalho ainda mais complicado. Em todas as vezes em quem me deparei com bugs do Game Maker, nesta eu estou preso. Não sei o que fazer. A única vez em que vi algo parecido foi no Delphi, usando canvas. Mas lá, não havia necessidade de "limpar" a memória, pois toda vez que o programa era finalizado a memória era desalocada, isso é normal!

Não tenho nem ideia de como resolver isso agora.
cheers

Convidad
Convidado


Voltar ao Topo Ir em baixo

Re: Erro em surface de vídeo...

Mensagem por Fuzenrad em Dom 10 Out 2010, 23:29

Realmente, a solução (que eu encontrei no caso), foi usar a tela com a resolução 640x480, com esse tamanho inclusive, o jogo ficou com um visual mais clássico, mas de forma alguma perdeu qualidade, aliás, creio eu, ficou melhor, já que gasta pouca memória do computador e deixou o jogo em um estilo mais retrô. Devia tentar.

Fuzenrad

Ranking : Nota A
Número de Mensagens : 1026
Idade : 26
Data de inscrição : 04/07/2010
Notas recebidas : A-A-A-A-B
Reputação : 41
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 1

Voltar ao Topo Ir em baixo

Re: Erro em surface de vídeo...

Mensagem por Convidad em Dom 10 Out 2010, 23:37

È. Se não tiver jeito vou ter que fazer isso. Trabalhar em uma resolução menor pra poupar memória (se é que é este o real problema). Dessa forma eu tenho certeza quase absoluta de que irá funcionar porque quando eu alterava a resolução do vídeo, funcionava normalmente.

Convidad
Convidado


Voltar ao Topo Ir em baixo

Re: Erro em surface de vídeo...

Mensagem por Denis Lemos em Seg 11 Out 2010, 17:59

Bugs de surface no GM é tradicional, acho que até no help diz que se alterar a resolução do jogo a surface é perdida e aparece a menssagem de erro, comigo acontece vários erros quando uso surfaces:

1º Quando tem uma surface e se aperto "Control+Alt+Del" no vista aparece uma tela com algumas opições, de reiniciar, desligar ou ir para o gerenciador de tarefas, e se volto para a aba do GM, já dá o erro e a surface é perdida !

2º Se No create de algum objeto eu crio uma surface, e coloco ele na room, alí pela terceira vez que a room aparece no jogo vem a menssagem de que a surface não existe, o que deixou quase impossível de fazer meu jogo rodar sem lag, pois tive que fazer sem surfaces, o que é estranho, pois toda vez que a room aparecesse teria que criar a surface, mesmo se ele não existisse !

Alguns erros são causados, por a surface ser muito grande, acho que 1024X1024 é muito grande até, mas ainda funciona assim !

Talvez a causa do seu erro seja por as imagens terem alpha, que eles disseram ter corrigido esse problema no GM8, mas ele ainda causa erros !

Você disse que usa o GM6, tente fazer no GM8, talvez o erro não aconteça mais, mas mesmo assim no GM se o assunto é surface, ele tem muito que melhorar !

Denis Lemos

Número de Mensagens : 938
Idade : 28
Data de inscrição : 17/05/2009
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Erro em surface de vídeo...

Mensagem por Convidad em Ter 12 Out 2010, 00:04

Valeu pelas dicas, Denis e Fuzenrad! Vou fazer todo o possível aqui.

Convidad
Convidado


Voltar ao Topo Ir em baixo

Re: Erro em surface de vídeo...

Mensagem por Janx em Ter 12 Out 2010, 00:39

Usei surfaces ontem mesmo e não tive nenhum problema com erros!
Usei até em um loop, em que a surface era criada e destruida umas 30x por segundo. Não houve problema algum. (No fim não usei mais desse método, mas como não deu erro achei interessante comentar.)

Mostre um pouco do código que você está usando. Como desenhou a surface? Códigos usando a surface.
Qual é o erro exatamente? A mensagem.

Mesmo você testando em outra máquina e dando o mesmo problema, qual a configuração do seu computador e do outro?

Você tem certeza absoluta que liberou a memoria ocupada pela surface? Se um erro ocorrer durante a execução e o jogo for fexado em uma daquelas mensagens "abort", a surface não será removida!

Janx

Número de Mensagens : 2417
Idade : 23
Data de inscrição : 24/05/2008
Reputação : 14
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 0

Voltar ao Topo Ir em baixo

Re: Erro em surface de vídeo...

Mensagem por Convidad em Ter 12 Out 2010, 00:56

Durante o jogo ela é criada normalmente. Uma vez eu notei que não depende muito do tamanho dela e sim do tamanho de todas as surfaces conjuntas. Acho que exceder um certo limite (não sei precisar, mas no meu pc é por volta de 6000 x 8000) o Game Maker não consegue criar mais nenhuma!

O código não tem muita coisa a mais. O erro dá é só de vez em quando na hora que eu executo o exe. Daí se eu mudar a resolução e voltar à resolução original ou então se eu mudar a taxa de atualização do vídeo o jogo volta a funcionar normalmente. Essa mudança de resolução e da taxa é pelas configurações de vídeo do Windows.

A mensagem que dá, é de que a surface não existe, e eu tenho certeza de que eu limpei a memória certinho. Tá osso.
cheers

Convidad
Convidado


Voltar ao Topo Ir em baixo

Re: Erro em surface de vídeo...

Mensagem por vinians em Ter 12 Out 2010, 01:01

E ae amigão blz? Estava acompanhando seu problema e analisando a causa.
O Game Maker por padrão parece que aloca uma páginas da própria memória de vídeo para armazenar os surfaces, provavelmente porque ele usar page-flipping para copiar o surface rapidamente para a página de vídeo "visivel". Isso é muito rápido mais faz com que o sistema se torne instável se qualquer coisa externa tocar na memória. Para resolver esse problema acho que você pode fazer o seguinte:
-Primeiro, tente não liberar a memória do seu surface, pois como você já está saindo do programa, o proprio garbage collector do sistema operacional se encarrega disso, ou seja é menos 1 funcao do GM para usar.
-Outra idéia é detectar quando o jogo perder o foco para outra aplicação, destruir o surface antes e recria-lo depois.
-Veja se o erro ocorre em full screen, caso em FULL configure para o game settar a própria resolução, isso provavelmente vai tirar um pouco do poder do S.O. em tentar ferrar a memoria de video.
Faça esses teste e me diga se deu certo.
Flws!

vinians

Ranking : Nota B
Número de Mensagens : 2490
Idade : 27
Data de inscrição : 18/09/2008
Notas recebidas : B-C-A-C
Reputação : 52
Insignia 1 x 0 Insignia 2 x 1 Insignia 3 x 0
Prêmios
   : 0
   : 2
   : 1

http://xcreatorgames.weebly.com/

Voltar ao Topo Ir em baixo

Re: Erro em surface de vídeo...

Mensagem por Convidad em Ter 12 Out 2010, 01:30

page-flipping... muito interessante, eu não conhecia nada sobre isso! Mas eu ainda não entendi uma coisa. Será em dois jogos rodando ao mesmo tempo (e usando surfaces) iria interferir um no outro quando ele fizesse essa "cópia"? Isso é uma coisa interessante a se testar. Imagina se isso funcionar, eu poderia criar exe que usa uma suface para tentar copiar o conteúdo da suface de outro jogo!

-Primeiro, tente não liberar a memória do seu surface, pois como você já está saindo do programa, o proprio garbage collector do sistema operacional se encarrega disso, ou seja é menos 1 funcao do GM para usar.

Eu tentei mas não deu. É como se cada criação de surface fosse "engordando" o que já foi alocado, porém, o estranho é que essa memória alocada foi de uma execução anterior! Ou seja, um processo que já foi fechado. Isso é muito estranho.

-Outra idéia é detectar quando o jogo perder o foco para outra aplicação, destruir o surface antes e recria-lo depois.

Acho que isso vai ser difícil pra caramba. Quando o jogo perde o foco, não tem nada que eu possa fazer pra detectar o handle da janela pelo Game Maker, daí eu teria que usar o Delphi. É fácil fazer mas acho que complicaria muito a programação do jogo no GM.

-Veja se o erro ocorre em full screen, caso em FULL configure para o game settar a própria resolução, isso provavelmente vai tirar um pouco do poder do S.O. em tentar ferrar a memoria de video.

Ocorre. O que eu tentei fazer foi uma opção de escolha pro jogador. Se ele escolher não alterar a resolução do vídeo (que roda sem problemas), ou seja, se ele rodar na janela normal, eu mudo a resolução pra outra menor e depois de dois segundos eu volto ela ao normal. Até agora não deu problema, pelo menos por enquanto, vamos ver se resolve. Parece que isso dá um "refresh", não sei explicar.

Convidad
Convidado


Voltar ao Topo Ir em baixo

Re: Erro em surface de vídeo...

Mensagem por Denis Lemos em Ter 12 Out 2010, 13:53

Código:
Por razões de velocidade, a superfície é mantida em videomemory só. Como resultado, você pode perder a superfície quando, por exemplo as mudanças de resolução de tela ou protetor de tela aparece.
Superfícies não serão salvos quando salvar o jogo.
Essa parte eu traduzi do help, não seria a troca de resolução o motivo do erro ???

Vinians escreveu:-Outra idéia é detectar quando o jogo perder o foco para outra aplicação, destruir o surface antes e recria-lo depois.
Eu precisava muito destruir a surface, mas não achei o código que faz isso, tem apenas esse surface_free(id), que libera a memória, mas ele continua lá existindo !

ccphreaker escreveu:Durante o jogo ela é criada normalmente. Uma vez eu notei que não depende muito do tamanho dela e sim do tamanho de todas as surfaces conjuntas. Acho que exceder um certo limite (não sei precisar, mas no meu pc é por volta de 6000 x 8000) o Game Maker não consegue criar mais nenhuma!
Vai ver que é esse então o erro que ocorria comigo, pois cada vez que iniciava a room era criada a surface, e se desse uns 3 ou 4 restart já dava o erro, mas isso era só quando eu desenhava na surface uma back com alpha, se fosse sem alpha não dava o problema !

Denis Lemos

Número de Mensagens : 938
Idade : 28
Data de inscrição : 17/05/2009
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Erro em surface de vídeo...

Mensagem por Convidad em Ter 12 Out 2010, 22:39

Essa parte eu traduzi do help, não seria a troca de resolução o motivo do erro ???

Foi o contrário, parece que foi a solução. Por algum motivo qualquer me parece que o GM não estava conseguindo "jogar fora" a memória que ele estava usando para as surfaces. Daí quando eu mudo a resolução no início do jogo e volto pra original, o jogo funciona sem erro.

Eu precisava muito destruir a surface, mas não achei o código que faz isso, tem apenas esse surface_free(id), que libera a memória, mas ele continua lá existindo !

É sério?? Isso eu não sabia (que ele continuava existindo). Cara, você acabou de resolver o problema! O que tava acontecendo então era exatamente isso mesmo, parece que o GM aloca a memória, mas como referência ele usa algum ponteiro. Já que a vram é dinâmica, essa função deve apenas eliminar esse ponteiro e não a surface em questão. Não sei se é isso, mas há uma grande possibilidade de ser!

Agora a questão do alpha, comigo pelo menos não deu problema não. Aliás, minto. Na verdade, não se se é exatamente um erro. Toda vez que eu desenho algo usando alpha, se ele for muito baixo, fica uma espécie de "buraco" na surface. Eu achei que ele ia apenas desenhar por cima, mas o alpha acaba fazendo isso.

Se bem que dá pra fazer até um efeito legal de "máscara" usando essa gambiarra. Valeu pelas dicas!

Convidad
Convidado


Voltar ao Topo Ir em baixo

Re: Erro em surface de vídeo...

Mensagem por Conteúdo patrocinado Hoje à(s) 14:01


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