Eu tenho alguns livros sobre Design Patterns e li alguns artigos, mas não consigo descobrir intuitivamente quais padrões de design de programação seriam úteis no desenvolvimento de jogos.
Por exemplo, eu tenho um livro chamado ActionScript 3 com Design Patterns que detalha vários padrões de design, como Model View Controller, Singleton, Factory, Command, etc.
Como alguém novo nisso, não consigo descobrir qual deles seria útil ou, de fato, se algum desses são os padrões de design que eu deveria aprender e tentar usar. Talvez existam outros padrões de design mais específicos da programação de jogos que eu nem conheço?
Se você tem experiência em usar um determinado padrão de design no desenvolvimento de jogos, eu adoraria ouvi-lo. Raciocinar sobre o motivo pelo qual foi usado, amostras de código ou recursos online também seria muito útil se você os tiver. No momento, estou mais interessado nas implementações do ActionScript 3 e C ++, mas definitivamente posso me beneficiar da experiência e exemplos de qualquer linguagem.
Obrigado!
Respostas:
Agora, para uma resposta menos irreverente, com algumas sugestões. Não as tome como recomendações de implementação, mas como exemplos de uso possível.
Alguns padrões ficaram de fora devido à falta de inspiração.
fonte
Escrevi um livro exatamente sobre esse tópico: Padrões de programação de jogos . Os capítulos que estão lá podem ser úteis para você.
fonte
Uma coisa que Brandon Eich teve o bom senso de mencionar em Coders at Work é que os padrões são hacks e soluções alternativas: [Padrões] mostram algum tipo de defeito no idioma. Esses padrões não são livres. Não há almoço grátis. Portanto, devemos procurar a evolução na linguagem que adiciona os bits certos.
Como programadores de jogos, e não como designers de compiladores, raramente temos a opção de evoluir as linguagens que usamos, mas podemos aprender a evoluir nosso próprio estilo para melhor atender nossa linguagem e requisitos. Os padrões são parte disso, mas não usar padrões é outra parte, especialmente porque, como Brandon diz, os padrões raramente ficam sem um desempenho notável ou um custo notável de agilidade na memória ou no código. O MVC simplesmente não é um ótimo padrão para muitas coisas nos jogos. Singleton é uma solução alternativa para as regras de inicialização estática do C ++, e você provavelmente não deveria fazê-las. O Factory simplifica a criação complicada de objetos - talvez seus objetos sejam mais simples para começar. Os padrões populares são ferramentas para recorrer quando precisamos deles para gerenciar algo complexo, não ferramentas que devemos usar para criar algo complexo no início.
Um bom código (do jogo) pode usar padrões ou não. Se ele usa padrões, tudo bem - eles são uma ótima ferramenta de comunicação para explicar a estrutura de código para outros programadores em um nível alto e independente de linguagem. Se você acha que o código é melhor sem usar um padrão, não se importe com isso - provavelmente é.
fonte
Obviamente, como outros já disseram, todos os padrões são úteis nas circunstâncias certas, e parte de aprender a usá-los é aprender quando usá-los. No entanto, o excelente livro Core Techniques and Algorithms in Game Programming, de Daniel Sanchez-Crespo Dalmau, lista seis padrões de programação e seis padrões de usabilidade, especialmente úteis na programação de jogos.
Programação:
Usabilidade:
O livro, é claro, entra em mais detalhes sobre cada um deles.
fonte
Os sistemas de entidades são um bom tipo de padrão. Não é exatamente um padrão de design, uma vez que não é estritamente OOP. No entanto, você pode misturá-lo com OOP.
Alguns bons links (comece da parte superior para introdução):
fonte
OOP design patterns
Normalmente, existem os que mostram relacionamentos e interações entre classes / objetos. E existem muitos outros padrões de design. OOP é um conjunto de conceitos, não um padrão realmente.Design pattern
é um conceito também.Todos eles. Exceto Singleton. [/irreverência]
fonte
Não é realmente sobre padrões, mas sobre princípios básicos por trás deles. Em "Padrões de Design: Elementos de Software Orientado a Objetos Reutilizáveis" (1995) , a turma de quatro (Gamma, Erich; Richard Helm, Ralph Johnson e John Vlissides) recomenda apenas dois princípios para o design orientado a objetos: (1) programa para uma interface e não para uma implementação e (2) favorecem a composição do objeto sobre a herança de classe.
Esses 2 princípios são muito úteis em muitas tarefas de desenvolvimento de jogos. Por exemplo, muitos programadores de jogos usaram uma hierarquia profunda de classes para representar entidades de jogos. Há outra abordagem baseada na composição - objetos de jogo baseados em componentes. Artigo sobre essa abordagem. Ainda mais links . É um exemplo de padrão do Decorator .
fonte
O padrão de modelo curiosamente recorrente pode ser realmente útil para evitar métodos virtuais e a penalidade de desempenho que pode advir das chamadas de função virtual.
Esse pode ser o padrão apropriado quando você realmente não precisa ter um contêiner do tipo de classe base que tenha a interface que você procura, mas você gostaria de ter comportamentos e interfaces com nomes semelhantes.
Por exemplo, você pode usar isso ao compilar classes para várias plataformas ou mecanismos (dx vs. opengl) em que a variação do tipo é conhecida no momento da compilação.
fonte
Um padrão de design que eu desenvolvi ao longo de muitos anos, e que foi espetacularmente útil para mim, é algo que eu me refiro como "conjuntos de definições intermediadas"; como resumi-lo em termos do GOF parece controverso, mas essa pergunta que escrevi sobre ele no StackOverflow entra em alguns detalhes.
O conceito principal é que algumas propriedades de um modelo, como as espécies de uma criatura, sejam configuradas para que cada valor possível para a propriedade tenha um objeto de definição correspondente - um único objeto compartilhado por valor - que especifique seu comportamento, e eles são acessados através de um intermediário central (que, em termos de GOF, pode ser um registro, uma fábrica ou ambos). No meu uso, eles também são geralmente acessados por meio de chaves escalares, para facilitar a ligação fraca para fins de morfismo em tempo de execução.
fonte