Técnicas de depuração em tempo real


18

Não há nada como a rotina de ajustar uma variável, compilar o código que leva alguns minutos, executar o código, perceber que o seu ajuste estava na direção errada e repetir o processo novamente.

Gostaria de começar a interagir com a minha lógica do jogo enquanto uma sessão está em andamento. Quais são algumas das maneiras pelas quais você lidou com isso?

Eu estaria aberto para ouvir soluções para iOS, C / C ++ e C # / XNA.

Respostas:



4

A integração de uma linguagem totalmente interpretada pode permitir que você reescreva elementos do jogo muito, muito facilmente em tempo real.

Python, Lua etc. podem ser utilizados expressamente para isso. O Angel Engine provavelmente pode servir como exemplo.

O carregamento a quente é outro elemento a ser retirado (basicamente, um evento é acionado informando que um ativo foi alterado - um arquivo de configuração, um elemento artístico etc. - e você o executa através de uma série de condicionadores que o modificam para o formato final antes de substituir o existente pelo novo.

Eu trabalhei com um mecanismo de prototipagem rápida que usava carga quente e foi um prazer.


2

No que diz respeito a C ++, C # e C # com XNA, o Visual Studio possui excelentes ferramentas de depuração - pause o aplicativo em tempo real a qualquer momento do código, veja os valores atribuídos às variáveis ​​a qualquer momento, percorra as chamadas de função , analisar a pilha de chamadas e muito mais. Além disso, ferramentas como Pix e CLR Profiler tornam ótimo o desenvolvimento com DirectX (Pix) e linguagens baseadas em CLR (CLR Profiler).

Além disso, uma parte especialmente útil do trabalho com jogos é que temos essa área gigante para escrever textos de depuração, gráficos etc. Gráficos em tempo real de uso de memória, número de objetos / vértices desenhados, taxa de quadros, etc. são coisas comuns a serem desenhadas na tela.


1
Enquanto o VS é uma excelente ferramenta de desenvolvimento, a depuração normal leva tempo - procurando pontos de interrupção, percorrendo o código, alterando variáveis ​​e reiniciando o fluxo. Esta questão está à procura de uma forma imediata de fazer coisas como mover um componente de interface, ou ajustar taxa de ataque de um patrão, etc.
David McGraw

2

No C / C ++, um truque simples é colocar o seu tweakable em uma variável estática, acionar um ponto de interrupção, alterar a estática no depurador e permanecer persistente até a saída.


Torne-a uma variável estática dentro de uma função. Se for um estático global do Visual Studio, talvez não seja possível mostrar seu valor.
Kaj

2

O log de HTTP é uma grande ajuda e não é difícil de instalar. Você pode até usar o Google App Engine como uma maneira rápida de fazer isso funcionar. Os dados são sempre úteis.

Scripts e XML, estes podem ser recarregados rapidamente e não precisam de redefinição. Permita que eles falhem sem interromper o jogo. Isso dá muito poder a artistas, testadores e designers.

Menu de depuração no jogo Um menu simples de depuração no jogo, que você pode gerar quando criança e congelar o jogo com controles deslizantes de mecanismo e controles deslizantes de jogo. Permitindo que você ajuste os números de chave em tempo de execução e talvez execute uma ou duas funções de depuração ou despejos de informações.

Eu também amo soquetes ASYNC, como mencionado na resposta de David

Fácil de usar Sua equipe de jogos deve poder adicionar essas ferramentas e usá-las com muita facilidade, ou elas simplesmente não serão usadas.


2

Eu sei que Sean James já disse isso . Mas, falando sério, o Visual Studio (especificamente as ferramentas de depuração) é ótimo para isso.

Atualmente, não uso muito C ++, por isso não tenho certeza de quão bem eles se aplicam lá. Mas para C # (inclusive no C # Express) você tem:

E isso pode explodir sua mente (ele explodiu a minha quando eu descobri sobre ele):

A Janela Imediata é realmente difícil de encontrar (está no menu Debug / Windows).

A única grande desvantagem de usar o depurador do Visual C # é que ele não gosta de alterar constvalores. Então, eu geralmente apenas fazer meus valores relacionados com o jogo static, enquanto eu estou aprimorando-los.

(Além disso: ter dois monitores ajuda muito.)


Agora devo admitir que o método acima envolve pausar seu aplicativo - o que pode ser insatisfatoriamente lento para algumas coisas particularmente complicadas.

Nessas raras ocasiões, o que faço (no XNA) é simplesmente invadir um pouco de código (provavelmente usando Editar e Continuar, como acima) para pegar Keyboard.GetState().IsKeyDown()(na verdade, tenho um wrapper mais fácil de digitar para isso) e ajustar o valor por pressionamentos de tecla. Qualquer coisa mais complicada não vale o esforço.


Na prática, o que geralmente acho muito mais importante é poder visualizar (em vez de modificar) valores em tempo real. Por isso eu tenho um pouco de classe agradável que pode buffer linhas e texto a ser elaborado no final do quadro. Também é útil para prototipagem rápida.

(E, mais uma vez, é bom poder "Editar e continuar" essas visualizações em tempo de execução.)


(fonte: andrewrussell.net )
( daqui )

Receio não ter uma fonte "legal" para publicar no momento (talvez mais tarde). Mas é basicamente apenas uma lista de linhas (para esta biblioteca de linhas redondas ) e seqüências de caracteres (para o SpriteBatch interno do XNA). Apenas faça isso em public staticalgum lugar e desenhe tudo com uma transformação apropriada para que tudo apareça no "espaço do mundo" (e limpe as listas para o próximo quadro).


1

Escrevendo um sistema simples reflexão para C / C ++ é bastante trivial. Dessa forma, você pode navegar por todas as suas variáveis ​​no jogo (seja com uma ferramenta de rede, teclado ou joypad) e alterá-las para o conteúdo do seu coração. Ele trabalha para mim, mas todas as respostas acima são igualmente válidas.

Editado para adicionar: este tópico agora é sobre ajustes, não depuração de acordo com o título do tópico.


0

Uma solução que eu já vi em vários estúdios é um aplicativo de depuração externa que se conecta ao seu programa usando a rede. Isso mostra aplicativo específico exposto variáveis, e permite que você edite-los em tempo real. Adicionando novas variáveis ​​é uma questão de adicionar alguns macros para o código do jogo.

O set-up inicial do macros do lado do jogo, o protocolo cliente / servidor (as soluções que eu vi apenas serialise xml e para trás), e escrevendo o cliente, é grande. No entanto, é extremamente útil, especialmente quando utilizando a rede de meios de comunicação que você pode trabalhar em qualquer plataforma.


0

Bind o carregamento e leitura da variável em um arquivo de texto e aquecê-la usando uma combinação de teclas específica ou comando do console.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.