Por que os desenvolvedores de jogos C ++ não usam a biblioteca de impulso? [fechadas]


81

Portanto, se você gastar algum tempo visualizando / respondendo perguntas no Stack Overflow sob a tag C ++, notará rapidamente que quase todo mundo usa a biblioteca de impulso ; alguns até diriam que, se você não o está usando, não está escrevendo C ++ "real" (discordo, mas esse não é o ponto).

Mas há a indústria de jogos, que é bem conhecida por usar C ++ e não por impulso. Não posso deixar de me perguntar por que isso acontece. Não me preocupo em usar o boost porque escrevo jogos (agora) como um hobby, e parte desse hobby é implementar o que preciso quando posso e usar bibliotecas disponíveis quando não posso. Mas isso sou só eu.

Por que os desenvolvedores de jogos, em geral, não usam a biblioteca de impulso? Trata-se de problemas de desempenho ou memória? Estilo? Algo mais?

Eu estava prestes a perguntar isso no estouro de pilha, mas achei que a pergunta seria melhor aqui.

EDIT:

Sei que não posso falar por todos os programadores de jogos e não vi todos os projetos, por isso não posso dizer que os desenvolvedores de jogos nunca usem boost; esta é simplesmente a minha experiência.

Permita-me editar minha pergunta para perguntar também, se você usa o boost, por que você optou por usá-lo?



2
Seria justo dizer que "Boost" é uma coleção de bibliotecas muito grande para fazer "use boost" ou "não usar boost" uma escolha justa? Até o Google se restringe a um pequeno subconjunto de "impulso" em seus padrões, acredito.
Dan Olson

Os binários de jogos já são grandes o suficiente.
Legion

3
O @Tetrad STL não é impulsionado, e o STL é muito usado no gamedev.
método do lugar das raízes

7
Realmente não vejo onde a pergunta "não é construtiva", isso precisaria ser explicado.
v.oddou

Respostas:


42

Alguns desenvolvedores, outros não (em jogos e em outros lugares). Depende de quais são as necessidades / requisitos desses desenvolvedores e de qual tecnologia existente eles precisam alavancar.

Biblioteca padrão do C ++ muitas vezes é dado o mesmo tratamento, e as pessoas muitas vezes me pergunto a mesma coisa que você está se perguntando sobre isso , também. A maioria dos motivos é semelhante, por exemplo:

  • Um desenvolvedor já pode ter uma biblioteca interna de funcionalidades que fornece os mesmos serviços que a biblioteca padrão ou o Boost fornece. Essas bibliotecas internas costumavam ser escritas há muito tempo, quando o suporte à implementação da biblioteca padrão era fraco e o Boost era basicamente inexistente; portanto, mais ou menos tinham que ser escritos. Nesse cenário, geralmente não vale a pena fazer a transição da funcionalidade interna - seria um grande esforço de portabilidade que desestabilizaria muito código e não proporcionaria quase nenhum benefício.

  • Um desenvolvedor pode estar trabalhando em plataformas nas quais o suporte ao compilador para as técnicas avançadas de C ++ alavancadas pelo Boost não é bem suportado, de modo que o código do Boost não seja compilado ou tenha um desempenho ruim. Isso também se aplica à biblioteca padrão, embora muito menos atualmente.

  • O Boost e a biblioteca padrão da linguagem são de uso geral e, embora isso seja bom e bom para a maioria dos aplicativos, às vezes um desenvolvedor tem necessidades específicas que podem ser melhor atendidas por contêineres mais especializados.

Penso que o que precede são duas razões razoáveis, embora certamente existam outras. Você precisa ter cuidado, porque muitas razões para evitar o Boost, as bibliotecas padrão ou qualquer outra coisa se resumem à síndrome do "não inventado aqui", o que pode ser uma indicação de que o motivo não está muito bem fundamentado nas realidades práticas.

Lembre-se também de que as necessidades de um estúdio grande geralmente são muito diferentes das necessidades de um desenvolvedor individual. Por exemplo, um desenvolvedor individual provavelmente tem menos código legado flutuando para manter e, portanto, talvez a transferência de uma versão doméstica do Boost ou da funcionalidade de biblioteca padrão não seja tão demorada e poupa esse desenvolvedor de ter que manter esse código extensivamente no futuro - invalidando assim meu primeiro ponto.

No final, trata-se de avaliar suas necessidades e tempo investido contra o objetivo desejado e determinar qual opção atende melhor às suas necessidades. Os desenvolvedores que não estão usando o Boost ou a biblioteca padrão geralmente o fazem e chegaram a essa conclusão - talvez você também, e talvez não.


2
Outro ponto - algumas empresas não usam o Boost por causa de seu impacto negativo na velocidade de compilação em um ambiente de desenvolvimento altamente interativo.
29414 Steven

27

Editar Voltando a esta pergunta após alguns anos
Tendo continuado a usar cada vez mais bibliotecas de reforço, pensei em atualizar essa pergunta para apresentar um argumento sólido sobre por que você deve usar o impulso quando a descrição do produto corresponde à funcionalidade desejada. Isso convencerá até negativistas. Baixe o openSSL, tente criar um aplicativo cliente e servidor com ele. Agora tente fazer isso funcionar em todas as plataformas. Em seguida, faça o download e use o boost :: asio :: ssl para criar o mesmo aplicativo. Se você não está convencido de que o impulso é o lugar certo para procurar código de plataforma cruzada limpo, bem otimizado e com revisão por pares, este exercício simples o converterá.

Tl; dr versão:

Na minha opinião, você não vê uma tonelada de empresas de desenvolvimento indie ou de pequeno e médio porte usando o boost porque é uma fera maciça e poderosa que não é fácil de domar e você está basicamente sozinho quando tenta aprender como para usá-lo. A documentação está faltando de algumas maneiras (veja a versão longa) e a "comunidade" em torno do projeto parece estar ausente, dispersa ou inativa (em comparação com outros projetos).

Versão muito longa:

sei que já existe uma resposta aceita, mas como alguém que realmente usa o impulso em quase todos os projetos que eu faço, pensei em publicar uma resposta.

Lembro-me de quando comecei a bisbilhotar e, honestamente, não fazia ideia do que estava acontecendo. O impulso não está muito bem documentado. As pessoas podem discordar de mim porque tenho certeza de que há muitos trechos de código de exemplo, comentários e afins, mas tudo é muito frio, vago e difícil de navegar.

Também parece difícil encontrar qualquer lugar em que você sinta que encontrou "a comunidade" ao redor do projeto. De fato, a comunidade parece inexistente ou nômade. Infelizmente, até a lista de e-mails deles foi vasculhada por tantos sites de sanguessugas que você pode descer por essa toca de coelho sempre voltando para onde você começou.

Esses dois fatores tornam o aprendizado do uso de bibliotecas de impulso uma tarefa bastante assustadora. Mesmo que os detalhes técnicos do uso do impulso não sejam excessivamente complexos, é um conjunto enorme de bibliotecas e o encaramos quando tudo o que você está armado são alguns trechos de código e partes dispersas da lista de discussão dos cantos mais sombrios da Internet ... bem, você entendeu a idéia.

Eu comecei a mexer com o boost na versão 1.45 e é só agora na versão 1.52 / 1.53 que me sinto confortável o suficiente para usá-lo na produção. Há tantas coisas para se acostumar e lembrar, até coisas simples, como você configurou o boost e a lembrança dessa configuração, porque a forma como as bibliotecas são construídas e as funções podem variar bastante com base nas suas preferências no momento da compilação, devido à personalização das coisas estão.

No entanto , não se engane , uma vez que você pode usar o impulso, você ganhou uma arma poderosa para criar rapidamente programas sólidos e multiplataforma. Pegue boost::asiopor exemplo. Você pode escrever um servidor Web assíncrono de plataforma cruzada imensamente poderoso, escalonável e sólido em apenas algumas centenas de linhas. Escrevi vários clientes, servidores, proxies etc. ao longo dos anos, com apenas algumas centenas de linhas de código cada uma que ainda não me falharam, e posso portá-las de plataforma para plataforma em minutos.

Como outros já apontaram, as empresas maiores geralmente ficam presas a coisas antigas ou gostam de criar suas próprias, o que eu entendo completamente. Também há uma coisa realmente boba que eu ouvi e descobri onde os líderes de desenvolvimento e / ou os gerentes de projeto proíbem o uso do boost porque é "muito grande". Meu palpite é que eles acreditam que o impulso é uma única biblioteca ou nunca ouviram falar do BCP .

Quanto a POR QUE eu escolho usar o impulso

Eu diria que o uso porque, como você sugere na sua pergunta, é "a" biblioteca C ++. O Boost é visto no mundo C ++ como o canivete suíço de coisas que eventualmente você precisará usar. Portanto, a idéia é que, se houver uma necessidade, deve haver uma versão com alto desempenho e portátil dela em impulso. As grandes empresas contribuem para impulsionar , pessoas muito instruídas com currículos impressionantes contribuem e mantêm-no , e quando um novo padrão de C ++ está sendo desenvolvido, as pessoas geralmente procuram aumentar para ver quais partes dele devem se tornar C ++ padronizadas pela ISO.

Portanto, se eu precisar adicionar alguma funcionalidade para a qual provavelmente exista uma biblioteca existente, o primeiro lugar que procurarei será o aumento apenas porque tenho certeza de que é bastante otimizado, portátil, que será suportado e mantido por muito tempo e erros serão encontrados e solucionados. No mundo do código aberto, essas qualidades podem ser muito difíceis de encontrar.


Muito certo quanto à documentação. Por exemplo, os documentos do Boost.asio explicam como escrever um servidor http em surpreendentemente poucas linhas, o que é ótimo se o seu jogo usa http (ou qualquer outro protocolo TCP vanilla), mas fica muito mais difícil se você deseja usar um protocolo personalizado ou uma biblioteca de rede proprietária. Demorei 20 minutos para entender como criar um servidor WebSocket usando o boost.asio, mas semanas para entender como usar o ENet ( enet.bespin.org ) por meio de um boost.asio io_service personalizado.
ClosetGeek

21

Usamos um pouco de Boost em nosso antigo local de trabalho. Os principais motivos para evitá-lo e limitar seu uso foram:

  • tempos de compilação - alguns deles são muito lentos para compilar e você acaba relutando em aumentar #includes em qualquer um de seus cabeçalhos
  • complexidade - não é bem conhecido pela maioria dos desenvolvedores de jogos e, portanto, cria códigos ilegíveis
  • desempenho - alguns dos conceitos executam lentamente por padrão, por exemplo. shared_ptr

1
boost :: shared_ptr? como assim?
Tili

6
Se bem me lembro, ele aloca a contagem de referência na pilha em algum lugar. Isso é muito ruim para a coerência do cache durante o uso e também significa dobrar o tempo de alocação e desalocação no início e no final.
Kylotan

10
(Vale a pena acrescentar que o uso de make_shared pode aliviar o problema.)
Kylotan

Penso que esta resposta é bastante clara: existem mais razões pelas quais as pessoas a evitam do que apenas evitar uma ou duas classes ruins.
Kylotan

16

A mesma coisa está sendo dita para o STL "mais padrão". Este artigo fala sobre o EASTL, uma reescrita interna de (partes de) STL pela Electronic Arts para acomodar as necessidades de desenvolvimento de jogos que são bastante diferentes daquelas do desenvolvimento de aplicativos "mais genéricos".

Então, talvez alguém em algum lugar esteja reescrevendo (partes de) impulso para acomodar suas necessidades no desenvolvimento de jogos!


+1 para o artigo. Eu acho que isso responde a pergunta lindamente.
egarcia

9
Minha experiência é que, quanto mais portátil sua base de código se torna, mais você acaba reescrevendo componentes "padrão", como o STL.
Jari Komppa

6

Quem disse que eles não usam impulso? Conheço um ou dois mecanismos C ++ que usaram boost. Eu nunca trabalhei diretamente com eles; mas isso é principalmente porque a minha experiência está no Unreal.

Por motivos que encontrei por não usar o impulso, e estes são subjetivos:

  • Gostamos de lançar nossas próprias estruturas de dados específicas para as plataformas nas quais estamos implantando
  • Gostamos de limitar a quantidade de código desenvolvido não internamente que precisamos usar em nossos projetos, especialmente quando esse código externo depende de outras bibliotecas desenvolvidas externamente.

Basicamente, tudo se resume a: uma solução geral nem sempre é o "ajuste certo".

Tenho certeza de que alguém que realmente trabalhou com a biblioteca poderia comentar melhor.


É verdade que editei minha pergunta para explicar isso.
James

5

Eu saio no StackOverflow e não uso o boost. Acrescentarei minha razão, porque ainda não foi mencionada.

O Boost tem muitas ótimas idéias, realmente. Eu gosto de ver o que eles fizeram e experimentar coisas e idéias novas. Eles são ótimos, porque é um terreno fértil para muitas melhorias em C ++.

Mas o impulso é um animal muito pesado por muitas razões. Um dos motivos é que eles precisam (querem) ser compatíveis com praticamente qualquer compilador com qualquer peculiaridade. Como resultado, eles precisam empregar muitos truques, como o MPL para executá-lo. Por exemplo (há muito tempo) eu queria usar o shared_ptr, fazer com que funcionasse significa que preciso das fontes e bibliotecas do que pareciam 90% de impulso. Acabei escrevendo o meu; 50 linhas de código legíveis. (Meus requisitos eram mais rigorosos, como no fraco_ptr ou na segurança de threads).

Muitas vezes, você precisa de um subconjunto muito pequeno de impulso, mas a integração de todo o impulso simplesmente não vale a pena.

Editar :

Só para deixar claro, uma vez que parece não ter vindo claramente (ou seja, voto negativo). Eu uso não usar bibliotecas de terceiros. Mas, na maioria dos casos, tudo igual, integrando uma biblioteca de terceiros ou aprimorada, a outra biblioteca de terceiros é mais rápida e limpa. O restante é feito no exercício com os dedos "2h". Eu dou uma olhada muito na questão de compilar ou comprar.


1
Existem ferramentas como o BCP, você sabe.
Bartek Banachewicz

2
Você está sugerindo que não precisa manter seu próprio código? Além disso, eu gostaria de poder escrever todas as partes do impulso que estou usando em 2 horas (o que envolve também testá-las em todos os alvos de construção que vou usar e escrever testes). Você deve ser um codificador realmente rápido. Ah, e também "a maioria dos bits úteis" é praticamente igual a "Eu não posso C ++" aqui, porque o padrão ainda falta muito .
Bartek Banachewicz

2
Para iniciantes, alguns recursos fornecidos pelo boost, encontrei em outros lugares pequenos pacotes bem definidos, por exemplo, sigc ++. Em muitos casos, mais elegante e / ou mais eficiente. O que eu vim para impulsionar para a maioria dos locais, como threads, ponteiros inteligentes e expressões regulares, coisas que entraram no padrão. Ao longo dos anos, adquiri uma coleção de bibliotecas de terceiros e algum código próprio. "Eu posso C ++" há mais de 15 anos, muito obrigado.
Rioki '

3
@SeanFarrell, você não deve ser condescendente. Você diz que pratica C ++ há 15 anos e, em um comentário sarcástico a Bartek, parece que não entende o que Bartek quer dizer quando ele diz "manter" em conjunto com "pacotes". Manter não significa consertá-los. Simplesmente atualizar para uma nova versão ou armazenar versões para vários destinos geralmente é o que isso significa. Apenas para sua informação.

3
O Suspiro de impulso também funciona imediatamente, mas você ainda mencionou a manutenção. Não consigo ver sua lógica aqui.
Bartek Banachewicz

4

No nosso caso (não nos jogos), temos um ótimo motivo para não usar o boost (nem o std): temos muitos códigos que datam de uma década. De acordo com os idosos, std e boost estavam incompletos, cheios de bugs ou muito lentos para as coisas de alto desempenho que precisamos. Portanto, algumas classes base foram implementadas, usando os mesmos conceitos (como iteradores) e frequentemente otimizadas para nossos algoritmos. Atualmente, todas as três bibliotecas (nossa, std e boost) são muito semelhantes.

Mas queremos portar todo o nosso código? Na verdade não. Presumo que muitas outras empresas enfrentem o mesmo dilema. Reescreva muitos códigos testados e funcionando ou não use std / boost.


5
Isso é verdade, e algo em que não pensei, mas notei que muitas pessoas iniciando no desenvolvimento de jogos em C ++ não se importam em usar o boost / std. Às vezes, sinto que é porque o estímulo ao aprendizado é como aprender um idioma totalmente novo.
James

1
@ James Esta é praticamente uma das maiores razões. Eu postei uma resposta, mesmo que você já tenha aceitado uma apenas para dar a minha perspectiva como alguém que perseverou em aprender a melhorar, mas não depois de ter tentado fugir dela também.

1

Pessoalmente, não uso boost ou qualquer outro código de uso geral ao criar jogos, porque os jogos geralmente não são de uso geral. O tipo de código que você pode precisar para implementar um jogo geralmente é específico para o desenvolvimento do jogo, nem sempre, mas como 98% (figura aleatória) do tempo. Você pode seguir esses últimos bits de código do boost ou de alguma outra biblioteca, mas provavelmente é melhor apenas escrever a pequena parte que você precisa aqui e ali.

Em uma nota lateral, acho que é bastante divertido escrever seu próprio código em c ++, e é por isso que nunca uso boost ou algo parecido.


3
É divertido, mas o impulso é destinado a pessoas que querem fazer sh * t feito, em vez de reinventar a roda.
Bartek Banachewicz

3
Esta é a minha opinião, mas é uma falácia dizer que "os jogos são especiais". Sim, a automação da indústria em tempo real também é especial. Faço as duas coisas e posso atestar que os bits em que o impulso se aplicaria são claramente muito semelhantes. Dizer que eles são diferentes é ignorância, porque à margem eles são muito diferentes, mas o uso da linguagem principal é o mesmo. Uma função de classificação é basicamente a mesma, independentemente da sua classificação. (Então, novamente, só que você pode, não significa que você iria querer, veja a minha resposta.)
rioki

2
Você pode adicionar toda a camada de rede / multiplayer ao seu jogo usando o boost :: asio e inventar seu próprio protocolo de comunicação. Essa é uma razão 100% perfeitamente válida para usar o boost: qualquer jogo que você escreva que exija qualquer tipo de função relacionada à rede. "Criar o seu próprio" pode ser ótimo quando você é novo e precisa aprender. Nada de errado com isso. Mas, no final das contas, não vou perder tempo tentando escrever minha própria camada de comunicação assíncrona de plataforma cruzada, quando já estiver pronta e bem.

2
@HaywireSpark Não há necessidade de começar a insultar as pessoas. Eu li sua postagem e ainda discordo de você. Mesmo se você optar por "geralmente específico", isso é totalmente irrelevante. Quase tudo no impulso é projetado para ser o mais portátil e mutável possível. O boost :: asio é uma implementação muito genérica e não é voltada para nenhuma maneira específica de comunicação em rede. Não consigo imaginar nenhum cenário em que eu teria que dizer "caramba, boost :: asio simplesmente não se encaixa no meu modelo de camada de rede; é melhor reinventar a roda". Apenas dizendo.

2
@HaywireSpark sigh. Tenha um bom dia amigo. Você deve tentar ser mais aberto a críticas. Ser capaz de aceitar críticas faz parte de ser ensinável, e se você não é ensinável, nunca aprenderá nada. Eu não estou mexendo com você. Todas as pessoas que postaram seu comentário discordaram de você. Isso geralmente é uma boa indicação de que você disse algo desagradável.

0

o legado nas bibliotecas domésticas não é um fator ... a principal razão pela qual alguém não deve usar o boost u de outra biblioteca de uso geral é porque eles não têm velocidade e memória otimizadas, por isso devo mencionar que o Cryengine usa o STL, mas compila contra uma versão de código aberto chamada STLPort, portanto, não tenha medo de usar o STL, basta implementar seus alocadores personalizados e você ficará bem. não use impulso tho.


5
-1: por sua crença de que "Boost" não é "velocidade e memória otimizadas", quando existem literalmente dezenas de bibliotecas Boost, todas com graus variados de velocidade e eficiência de memória.
Nicol Bolas

2
... Essa é realmente a razão pela qual vários desenvolvedores de jogos evitam aumentar e até lançam seu próprio STL, juntamente com o fato de que o uso pesado de modelos gera tempos de compilação no telhado. Especialmente, lembre-se de que a depuração se baseia no MSVC, onde você precisa da quantidade mínima absoluta de abstração, wrappers e genéricos com os quais pode se dar bem, todos antitéticos ao Boost. O problema não é algorítmico, mas simplesmente que o Boost nunca foi feito para a velocidade do metal do dízimo. Além dos desenvolvedores de jogos, ninguém iria querer as trocas que isso exige.
25412 Sean Middleditch

2
@seanmiddleditch: Meu argumento é que existem muitas bibliotecas no Boost. Alguns deles são mais rápidos e mais eficientes em termos de memória do que qualquer coisa que você possa codificar para fazer o mesmo trabalho, e outros não. Denegrir todo o conjunto de bibliotecas para isso é simplesmente ignorante.
Nicol Bolas

2
Não há muitos desenvolvedores de jogos que podem escrever um analisador mais rápido que o Boost.Spirit. Embora existam muitas opções melhores (mais fáceis de usar) para analisar idiomas completos, o Spirit é muito rápido em analisar strings bem estruturadas, mesmo convertendo strings em tipos de dados. A biblioteca Boost.Xpressive também é muito rápida para regex. Lembre-se de que muitas das pessoas que trabalham no Boost também trabalham no comitê padrão do C ++ e sabem como obter o melhor desempenho do C ++ nas plataformas.
Gerald

5
Eles costumam usar a metaprogramação de modelos de maneira a permitir que grande parte do trabalho seja realizado em tempo de compilação, em vez de em tempo de execução, o que superará qualquer otimização de tempo de execução de baixo nível da qual os desenvolvedores de jogos se orgulham tanto . Vi alguns aumentos de desempenho acima de 50x ao converter determinadas tarefas de algumas bibliotecas C de alto desempenho comuns para usar os equivalentes do Boost.
Gerald
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.