Programação jogo e manipuladores de eventos

votos
11

Eu não programada jogos para cerca de 10 anos (minha última experiência foi DJGPP + Allegro), mas eu pensei que eu iria verificar XNA no fim de semana para ver como ele estava se moldando.

Estou bastante impressionado, no entanto como eu continuar a juntar um motor de jogo, eu tenho um (provavelmente) pergunta básica.

Quanto você deve contar com delegados e eventos de C # para dirigir o jogo? Como um programador de aplicação, eu uso delegados e eventos fortemente, mas eu não sei se há uma sobrecarga significativa para fazê-lo.

Na minha motor de jogo, eu projetei um cam perseguição das sortes, que pode ser anexado a um objeto e, em seguida, recalcula a sua posição em relação ao objeto. Quando o objeto se move, há duas maneiras de atualizar o cam perseguição.

  • Ter um UpdateCameras () método no circuito principal do jogo.
  • Use um manipulador de eventos, e têm a perseguição cam subscrever object.OnMoved.

Estou usando o último, porque ela me permite eventos da cadeia juntos e bem automatizar grande parte do motor. De repente, o que seria enorme e complexo get caiu para um punhado de manipuladores de eventos 3-5 linha ... É uma beleza.

No entanto, se os manipuladores de eventos disparando a cada nanosegundo vir a ser uma grande desaceleração, vou removê-lo e ir com a abordagem loop.

Idéias?

Publicado 15/09/2008 em 16:30
fonte usuário
Em outras línguas...                            


7 respostas

votos
10

Se você estava a pensar em um evento como uma lista de assinantes, em seu código tudo que você está fazendo é registrar um assinante. O número de instruções necessárias para atingir esse é provável que seja mínima a nível CLR.

Se você quiser que seu código seja genérico ou dinâmico, então você precisa verificar se algo está inscrito antes de chamar um evento. O mecanismo de evento / delegado do C # e .NET fornece isso para você em muito pouco custo (em termos de CPU).

Se você está realmente preocupado com cada ciclo de relógio, você nunca escreveria lógica do jogo genérico / dinâmico. É um trade-off entre o código de fácil manutenção / configurável e velocidade total.

bem escrito, eu favorecer eventos / delegados até que eu poderia provar isso é um problema.

A única maneira que você vai realmente saber se é um problema para você é por perfil de seu código - o que você deve fazer de qualquer maneira para qualquer desenvolvimento de jogos!

Respondeu 15/09/2008 em 16:41
fonte usuário

votos
4

É importante perceber que os eventos em C # não são enfileiradas eventos assíncronos (como, por exemplo, a fila de mensagens Windows). Eles são essencialmente uma lista de ponteiros de função. Então, levantando um evento não tem implicações no desempenho pior do que a iteração através de uma lista de ponteiros de função e chamando cada um.

Ao mesmo tempo, perceber que por causa disso, os eventos são síncronos. Se o evento ouvinte é lento, você vai abrandar a classe levantando os eventos.

Respondeu 15/09/2008 em 20:19
fonte usuário

votos
2

A questão principal aqui parece ser: "O que é a sobrecarga associada usando C # Delegados e Eventos"

Os eventos têm pouca sobrecarga significativa em comparação com uma chamada de função regular.

O uso de delegados pode criar lixo implícita e, portanto, escondido. Lixo pode ser um dos principais problemas causar um desempenho especialmente na XBox360.

O seguinte código gera cerca de 2000 bytes de lixo por segundo (fps) a 60 sob a forma de objectos EntityVisitor:

    private delegate void SpacialItemVisitor(ISpacialItem item);

    protected override void Update(GameTime gameTime)
    {
        m_quadTree.Visit(ref explosionCircle, ApplyExplosionEffects);
    }

    private void ApplyExplosionEffects(ISpacialItem item)
    {
    }

Contanto que você evitar a geração de lixo, os delegados são rápidos o suficiente para a maioria dos propósitos. Por causa dos perigos ocultos, prefiro evitá-los e usar interfaces vez.

Respondeu 17/09/2008 em 05:09
fonte usuário

votos
1

Antes de ir para o que é o impacto de um evento em termos de desempenho você deve primeiro avaliar se é ou não necessário.

Assumindo que você está realmente tentando manter um cam perseguição atualizado e não é apenas um exemplo, o que você está procurando não é um evento (embora eventos pode fazer o truque tão bem), se você está seguindo uma probabilidade avatar é que vai ser movendo-se a maior parte do tempo.

Uma abordagem que eu achei extremamente eficaz é usar transformações hierárquicas, se você implementar isso de forma eficiente a câmera não será o único objeto a beneficiar de um sistema tal, o objectivo seria o de manter a câmera dentro do espaço de coordenadas do objeto é rastreamento.

Essa abordagem não é a melhor opção se você deseja aplicar alguma elasticidade para a velocidade e as formas em que a câmera acompanha o objeto, por isso, é melhor usar uma chamada de atualização, uma referência, e alguma aceleração e resistência física básica.

Eventos são mais útil para coisas que só acontecem de vez em quando ou que afetam muitos aspectos diferentes da aplicação, como um personagem morrer, provavelmente, muitos sistemas diferentes gostaria de estar ciente de tal evento, matar as estatísticas, a AI controlador, e assim por diante, em tal caso, manter o controle de todos os objetos que seriam tem que verificar constantemente se isso aconteceu é muito menos eficaz do que jogar um evento e ter todos os objetos interessados ​​ser notificado apenas quando isso acontece.

Respondeu 29/05/2012 em 00:17
fonte usuário

votos
1

Como um aparte, você pode estar interessado em saber que Shawn Hargreaves , desenvolvedor original do Allegro , é um dos principais desenvolvedores da equipe XNA :-)

Respondeu 15/09/2008 em 21:56
fonte usuário

votos
1

Na minha tempo extra longe do trabalho real, eu fui aprendendo XNA também.

IMHO (ou não tão humilde, se você perguntar a meus colegas de trabalho) é que a sobrecarga das alças evento será oprimido por outros elementos no jogo, tais como renderização. Dado o uso pesado de eventos na programação normal, .Net eu seria o código subjacente é bem otimizado.

Para ser honesto, eu acho que vai um método UpdateCameras pode ser uma otimização prematura. O sistema de eventos, provavelmente, tem mais outros do que a câmera usos.

Respondeu 15/09/2008 em 16:42
fonte usuário

votos
1

XNA incentiva o uso de interfaces, eventos e delegados para dirigir algo escrito com ele. Dê uma olhada as classes relacionadas GameComponent que configurá-lo para você.

A resposta é: "Por mais que você se sinta confortável".

Para elaborar um pouco, Se por exemplo você tomar e herdar da classe gamecomponent em uma classe cameracontroller e adicioná-lo à coleção Game.Component. Em seguida, você pode criar suas classes câmera e adicioná-los à sua cameracontroller.

Fazendo isso vai fazer com que o cameracontroller a ser chamado regularmente e ser capaz de selecionar e ativar a câmera adequada ou múltiplas câmeras, se é isso que você está indo para.

Aqui está um exemplo disso (Todos os seus tutoriais são excelentes): ReoCode

Respondeu 15/09/2008 em 16:41
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more