Assim como jogos gigantes do mundo aberto carregam mapas maciços dinamicamente, não é possível carregar mapas, menus e praticamente qualquer interface ou configuração 3D via esse mesmo método de carregamento dinâmico? Sem alterar o ambiente, parece que interfaces e vários locais dentro do jogo podem ser carregados dinamicamente da mesma forma que mapas de mundo aberto maciços são carregados enquanto você os percorre.
Por que isso não é feito? Eu vejo tantos jogos modernos em que você precisa esperar um minuto ou mais enquanto a partida / mapa / nível está carregando. Eu sei que há uma latência envolvida na conexão de pares, mas isso não leva mais do que alguns momentos na minha experiência. Quais problemas existem com esse conceito para impedir que ele seja usado para eliminar o tempo de carregamento envolvido no carregamento de dados de mapa / nível / interface?
Respostas:
A resposta é sim, isso pode ser feito, na maioria dos casos, pelo menos até certo ponto.
As razões pelas quais isso não é feito são muitas:
fonte
Se seus menus tiverem uma tonelada de ativos, eles levarão um tempo para serem carregados. Você também não tem idéia de qual ordem as pessoas navegam no seu menu. Eles poderiam clicar em opções -> voltar -> créditos ou créditos -> voltar -> iniciar o jogo em rápida sucessão. Portanto, não há uma estratégia de streaming razoável.
Em um jogo de mundo aberto, você sabe que o jogador não se moverá mais rápido do que uma certa velocidade; portanto, não precisará carregar as versões detalhadas de locais distantes até que eles se aproximem deles.
fonte
Um grande fator na viabilidade de uma solução desse tipo é a previsibilidade do que precisa ser carregado. Se o jogador carrega níveis inteiramente novos, sem meios de antecipar o que escolherá, simplesmente não é possível uma solução completamente perfeita. Por exemplo, quando o jogador pode selecionar qualquer nível no jogo para jogar ou se ele tem liberdade para se teletransportar para áreas completamente diferentes em jogos de mundo aberto.
Alguns jogos de Halo começam a carregar o nível selecionado em segundo plano ao configurar jogos multiplayer. Isso reduz o tempo de espera quando os jogadores estão prontos para começar e é provavelmente o mais próximo possível de uma solução quando o jogador pode escolher livremente níveis diferentes com ativos completamente diferentes.
É claro que você disse "sem mudar o ambiente", mas eu só queria trazer o exemplo do Halo , pois é algo que eu gostaria de ver mais.
Em uma campanha contínua, ou sempre que o desenvolvedor tem muito controle sobre a localização do jogador, essa solução é certamente viável, exatamente como você diz. Naughty Dog gosta de acabar com os tempos de carregamento, com Jak e Daxter famosos sem tempo de carregamento no PS2, e os jogos Uncharted com um único tempo de carregamento no início.
No entanto, para muitos, o tempo de carregamento simplesmente não é um problema que precisa ser resolvido . Ou é um problema muito baixo nas prioridades dos desenvolvedores, quando há sempre mais a ser feito entre agora e a data de lançamento .
fonte
Tempo.
Você precisa de tempo para economizar tempo. Ou você precisa de dinheiro para compensar a falta de tempo. De qualquer forma, "Sem tempo de carregamento!" é um recurso que apenas aqueles que têm o luxo de pagar podem oferecer. É preciso um planejamento muito cuidadoso, e você precisa entender muito bem o que está fazendo e nem todos os desenvolvedores de jogos têm os recursos necessários.
fonte
Por fim, são recursos limitados.
Os jogos de mundo aberto e, especialmente, os MMOs são fortemente criados para a previsibilidade - você sempre sabe quais dados precisam carregar com antecedência. Você pode ver isso na arquitetura dos mundos - sempre que há muitos recursos que precisam ser carregados, há uma maneira de impedir que o usuário veja o que ainda não foi carregado. A maneira mais comum são os portões e entradas que bloqueiam sua visualização na próxima área pelos poucos segundos cruciais necessários para o carregamento. A maioria dos MMOs também usa modelos e texturas menos detalhados, o que reduz consideravelmente o tempo de carregamento.
Algumas coisas ainda são imprevisíveis, mesmo com design cuidadoso. Por exemplo, pode haver banners personalizados usados pelos players, que são mostrados apenas quando os dados relevantes foram enviados para o seu computador pela rede. Obviamente, a maioria dos jogos tenta limitar isso para torná-lo mais barato (por exemplo, os banners do Diablo III são composições simples, fáceis de enviar como poucos bytes de dados). Mas, em última análise, às vezes você apenas precisa aguardar a chegada dos dados. E você precisa mostrar alguma coisa enquanto o carregamento está em andamento - em muitos jogos, isso pode causar uma quebra de imersão quando você vê um modelo cinza com poucos detalhes enquanto aguarda o carregamento dos dados.
E com tudo isso, carregar dessa maneira é um problema resolvido (TM), mas isso não facilita. Custa muitos recursos e tempo, tanto na otimização dos recursos quanto na sua utilização para garantir uma experiência de reprodução suave e no próprio código - o código assíncrono é difícil. Também pode significar uma experiência de jogo reduzida, mesmo que tudo dê certo - significa que você precisa garantir que não ultrapasse os recursos de largura de banda do seu menor denominador comum; portanto, é necessário diminuir a qualidade dos modelos e texturas ou torná-los menos variada, e a geometria de seus mundos é severamente limitada. Caso contrário, o jogo será bastante impossível de jogar - enquanto eu lembro de pessoas que jogaram jogos que levaram 10 minutos (ou até mais!) Para carregar um mapa, simplesmente porque o computador deles não estava preparado para a tarefa, o jogo por si só corre bem depois disso. Se tivesse um carregamento contínuo, o jogo congelaria ou mostraria texturas e modelos feios o tempo todo enquanto aguardava o carregamento dos dados. O carregamento diferido não é um ganha-ganha, é um trade-off, como a maioria das coisas em engenharia :)
fonte
Um dos motivos pelos quais o carregamento dinâmico nem sempre é a solução ideal que outras respostas realmente não consideraram, acho que também é pop-in e outros artefatos gráficos.
A previsão do que carregar e do que não carregar geralmente falha, e pode ser uma experiência prejudicial quando ocorre. Um dos piores exemplos disso foi no Rage by id Software. Pelo menos nas versões iniciais, os sistemas de megatextura faziam com que até mesmo algo como girar muito rapidamente produzisse quantidades enormes de textura e até artefatos de geometria aparecessem antes de desaparecer lentamente.
Esses problemas simplesmente não são um problema, está tudo pré-carregado.
Algo a considerar não é necessariamente o que carregar, mas o que descarregar. Quando você tem tanto orçamento para espaço, quando carrega coisas novas, quais são as antigas a serem removidas? Você tem certeza de que esses ativos não serão utilizados nos próximos segundos? Estes são problemas difíceis de resolver.
Se cada estado de jogo é pequeno o suficiente para caber dentro de um orçamento comum do sistema, então todas as vantagens são aparentes, em vez de carregar, você simplesmente entra em um nível e as coisas desaparecem ao jogar. Mas, como as principais respostas sugerem, o tempo de carregamento de um jogo pequeno não seria muito extenso para se preocupar.
Acho que vale a pena pensar no motivo pelo qual os sistemas de carregamento dinâmico foram criados originalmente, sendo que você sabe que vários de seus estados de jogo podem ser muito grandes para um sistema comum e um jogo desse tamanho simplesmente não é possível pré-carregar completamente.
fonte
Um motivo comum é que nem sempre é fácil determinar se um recurso será necessário no futuro próximo.
Como você usou a paginação do terreno como exemplo, continuarei com isso.
É perfeitamente razoável se você estiver em uma determinada grade de mapa carregar todas as grades adjacentes em segundo plano. Você sabe que o usuário pode, na melhor das hipóteses, inserir um deles. Quando o fazem, você pode descarregar os que não estão mais adjacentes e carregar os que estão agora. Isso você anotou.
Agora imagine viagens rápidas. Não há absolutamente nenhuma maneira de prever para onde o usuário pode optar por ir. Eles têm (geralmente) quase todo o mapa para escolher. O pré-carregamento de todos os locais de viagem rápidos possíveis exigiria muita memória (você também pode carregar todo o mapa na memória) e muito tempo (supondo que você não tivesse o mapa inteiro pré-carregado). Quando isso aconteceria? Quando eles abrem a caixa de diálogo de viagem rápida? O problema só se tornaria várias vezes pior!
É por isso que mesmo a maioria dos jogos com paginação de terreno "sem carga" ainda tem telas de carga em viagens rápidas. Também é por isso que, se você se move rápido o suficiente, às vezes pode acionar o carregamento de telas em jogos mesmo com mapas sem carga (lembro de ter feito isso no TES Oblivion).
Agora imagine isso aplicado aos recursos do jogo em geral, onde os relacionamentos geralmente não são óbvios. Você precisará carregar todas as opções possíveis ou começar a adivinhar o que o usuário fará. Adivinhar é caro (tanto no desenvolvimento quanto na CPU) e uma bagunça complexa para programar. Exemplos específicos:
Pode haver maneiras de contornar alguns desses problemas, mas isso custa dinheiro da vida real para descobrir. A maioria dos jogadores aceita telas de carregamento razoáveis e, se alguma coisa, tende a gastar mais em hardware para atenuá-las. É visto como um problema de hardware , não um jogo , a menos que seja excessivamente excessivo ou perturbador (como carregar no meio dos níveis).
E lembre-se, o carregamento em segundo plano não é gratuito. Geralmente, há um impacto mínimo do uso moderno de terrenos com carregamento em segundo plano e de alguns arquivos de modelo, mas se você repentinamente adivinhar muitos recursos diferentes, especialmente se não possui métricas confiáveis e precisa descarregar muitos recursos e carregar outros supérfluos , você pode moer o sistema em pó.
A idéia do carregamento em segundo plano é usar os ciclos mortos para um uso melhor, mas existem apenas tantos ciclos mortos para usar. O mesmo vale para a memória - o pré-carregamento pode aumentar substancialmente o uso de memória de um jogo. Com uma tela de carregamento, você pode despejar os recursos existentes. Não existe esse luxo com o carregamento em segundo plano, o que significa que poderia dobrar os requisitos de memória do jogo apenas com base nisso.
fonte
Esse é um problema comum decorrente do fato de que os jogos são produtos em tempo real suave, em que uma entrega tardia de conteúdo não é tão útil quanto uma entrega pontual (em contraste com a dura em tempo real, como os carros em computadores, onde uma entrega tardia não pode ser melhor do que nenhuma entrega). Você precisa decidir o que carregar e onde.
Às vezes, as entregas tardias são particularmente ruins. Por exemplo, se você tem permissão para correr em um mundo antes de todas as paredes serem carregadas, você pode ficar atrás de uma parede que você nunca poderia ter ficado atrás se o jogo carregasse as paredes antes de permitir que você se movesse. Nem sempre é fácil saber quando você pode se safar com um carregamento "lento" de conteúdo e quando precisa garantir que o conteúdo esteja totalmente carregado.
O carregamento dinâmico também é muito mais complicado. Você sempre deve considerar o que fazer se o recurso ainda não tiver sido carregado. Esta é uma drenagem dos recursos de desenvolvimento. É muito mais fácil desenvolver quando você pode confiar nos recursos existentes.
As latências também nem sempre são aceitáveis. Ouvi falar de casos no Starcraft em que você "aquecia" seu jogo carregando um mapa que tem o efeito colateral de armazenar em cache todos os modelos / imagens carregados dinamicamente. Você sairia e jogaria o jogo normalmente. Para os jogadores de elite, isso minimizou a gagueira da GUI que realmente afetou sua jogabilidade. Tentar provar quais latências serão aceitáveis para os usuários e quais não serão complicadas.
fonte