No meu último jogo que estou criando, você pode dividir um objeto 2D arbitrariamente, demonstrado neste gif:
Você pode cortá-lo continuamente em centenas ou milhares de pedaços. Isso não cria muito atraso, porque eles estão sempre em um estado físico adormecido, mas há um problema quando você os move.
Não tenho muita certeza de como lidar com isso, para que não haja tanto escombros por separar algo. Eu realmente não quero excluí-los após um certo período de tempo; Não gosto de como, se você voltar para algo que cortou depois de um tempo, ele desapareceu aleatoriamente.
Como posso limpar os entulhos excessivos criados por jogadores?
unity
2d
performance
Ducktor
fonte
fonte
Respostas:
Primeiro de tudo, essa mecânica de jogo parece ser super divertida, então parabéns por pensar nisso! Aqui estão duas soluções simples que podem ser usadas independentemente ou em conjunto para resolver esse problema específico:
Remover pedaços muito pequenos
Não há muito sentido em contornar pequenos pedaços de colisão que realmente não impedem o jogador ou têm qualquer efeito real no meio ambiente. Calcular a lógica extra de colisão simplesmente não vale a pena, então remova essas peças ou remova a colisão nelas.
Limitar cortes de jogadores
Ter cortes ilimitados pode potencialmente tornar muitos dos seus quebra-cabeças realmente simples se você puder cortar todos os objetos que os impedem em uma pilha de pamonha. Dê ao jogador apenas alguns cortes para jogar (ou faça a recarga lentamente ao longo do tempo) e você provavelmente descobrirá que isso torna seus quebra-cabeças mais desafiadores, além de eliminar as dores de lidar com a colisão em mil fragmentos.
fonte
Descobrir seu gargalo
Algumas centenas de objetos em movimento não devem ser um problema. No entanto, algumas centenas de objetos em colisão podem estar. Vai levar alguns testes, mas acredito que o gargalo que você tem é a colisão.
A propósito, sobre quantos objetos estamos falando? Qual é a plataforma? Cem objetos para um jogo para celular não é o mesmo que cem para um jogo na web ou cem objetos para um jogo em desktop.
Teste o mesmo jogo, mas com colisões entre os objetos cortados desativados, e veja se o atraso ocorre em quantidades semelhantes de objetos. Se for esse o caso, significa que a grande quantidade de objetos é a causa do problema; caso contrário, as colisões são o problema.
Isso informará sua decisão sobre o que você fará para melhorar o desempenho. Nem todas as idéias abaixo serão aplicadas e você precisará testar de qualquer maneira.
Não falarei sobre otimizar uma grande quantidade de objetos longe do player, pois o problema parece surgir ao interagir com os objetos.
Se o problema ocorrer ao interagir com os objetos, não está claro como a remoção de objetos não visíveis o resolverá ... ainda, presumo que isso possa ajudar.
Vou apenas dizer que se objetos longe do jogador forem um problema, você pode começar com níveis menores ou dividir o jogo em partes que você pode carregar e descarregar dependendo de para onde o jogador está indo.
Fora dos limites
Acredito que, quando se trata de limpar os escombros, a primeira coisa a ser feita é remover objetos que estão fora dos limites. Por exemplo, a peça que caiu em um poço. Se não há como o jogador chegar lá para vê-lo, não há razão para mantê-lo por perto.
Eu voltarei a isso.
Torne-o mais realista (parte 1)
Quando você corta madeira com uma serra, machado ou ferramenta similar, haverá perda de material (serragem, aparas, etc.). Mesmo se você cortar com um laser, o laser queima um pouco de madeira. Além disso, para coisas que não são de madeira, geralmente haverá deformação ao redor do corte, desintegração etc.
O que estou dizendo é que o corte não é perfeito e que algum material será perdido. Você pode modelar isso no seu jogo. Aquele corte mágico vermelho tem espessura. Remova essa espessura dos objetos (adicione efeitos de partículas se você se sentir muito culpado).
Isso significa que você não poderá cortar nada que seja menor que essa espessura; na verdade, tentar fazer isso irá removê-lo do jogo. Isso é bom! Isso significa que há um limite superior para a quantidade de escombros que haverá, e há uma maneira mecanicamente sólida de limpá-lo no jogo.
Mudar de marcha para objetos pequenos
Isso funcionará melhor se o problema for colisão.
Uma vez que um objeto é muito pequeno, os detalhes dos diferentes ângulos que ele possui são menos relevantes. Você pode mudar para um mecânico de colisão menos preciso. Por exemplo, você pode usar coletores de círculo.
Você pode tratar objetos ainda menores sem colisão entre si; considere apenas a colisão entre eles e os objetos do agente (como o avatar do jogador ou os personagens controlados pela IA).
Finalmente, objetos muito pequenos podem se transformar em poeira (efeitos de partículas).
Torne-o mais realista (parte 2)
Isso funcionará melhor se o problema for colisão.
O material se deforma e quebra sob pressão. Se você acabar com objetos longos com muito pouca espessura, divida-os em objetos menores para que eles possam tirar proveito da solução acima.
Podemos fingir que tinha pouca espessura que se desintegra e quebra quando você o atinge.
Mesclar objetos
Isso funcionará melhor se o número de objetos for o problema.
Um truque comum que muitos jogos usam para lidar com grandes quantidades de quedas que podem prejudicar o desempenho é agrupar quedas.
Você pode tentar algo semelhante para objetos pequenos próximos um do outro. Faça com que eles se tornem um único objeto. No entanto, não pretendo juntar as peças. Eu pretendo criar um único objeto para lidar com a física deles; você ainda pode representar as peças individuais que compuseram o objeto, talvez usando técnicas semelhantes aos efeitos de partículas.
Torne-o mais realista (parte 3)
Você já ouviu falar do vento? Há vento no mundo real.
Use o vento para afastar pequenos objetos.
Eu sei que isso pode parecer contra-intuitivo, porque significa que pequenos objetos não descansam, pelo menos não imediatamente. Leia abaixo antes de fazer seu julgamento.
Você pode usar o vento para empurrar objetos pequenos antes - ou assim que - eles começam a se acumular. O que funcionará melhor se você estiver usando otimizações para objetos pequenos (como combiná-los ou remover colisões entre eles).
Além disso, se você puder usar o vento para empurrar os itens para fora dos limites ou de outro modo fora dos limites, poderá usar como desculpa para remover os itens. Eu te disse que voltaria a isso. Mesmo se não o fizer, pode servir como desculpa para remover pequenos objetos muito distantes do jogador, apenas finja que o vento os livrou enquanto o jogador não estava olhando.
Você pode remover alguns objetos enquanto o jogador não está olhando, você tem a minha bênção.
Além disso, agora você tem uma desculpa para adicionar vento, que pode ser adicionado como parte de outras mecânicas ou obstáculos do jogo. Você pode até adicionar à narrativa o espírito do vento que tenta manter as coisas limpas, se você é tão inclinado.
Nota : Você não precisa necessariamente acionar o vento quando houver entulho para limpar (embora isso funcione), provavelmente o vento pode ocorrer em intervalos aleatórios.
Castores!
Um castor irritante aparece e rouba sua madeira!
Agora você tem um tipo de inimigo!
Além disso, é claro, eles removem madeira enquanto você não estava olhando. Você pode até projetá-lo para voltar a ver um castor fugindo com um pedaço de madeira onde costumava ser uma pilha. Isso tornaria um momento memorável, explicará por que a madeira desapareceu e resolverá alguns dos problemas de desempenho que você enfrenta, de uma só vez.
São todas as compensações
Existem limitações da plataforma ou das ferramentas que você escolheu, mesmo o tempo e o orçamento que você precisa para desenvolver o jogo são uma limitação. Você não pode fazer uma simulação perfeita da realidade, ainda . Ninguém pode .
Todo desenvolvedor trabalha dentro das limitações que sua plataforma de destino e as ferramentas que eles tinham no momento lhes impunham, e os melhores jogos tinham que fazer trocas para tornar o jogo divertido e envolvente ... mesmo que isso signifique menos realismo, na verdade, muitas vezes são divertidos e envolventes porque não são realistas.
Deixe a criatividade vir dessas limitações.
No entanto, você também pode tornar seu jogo mais realista , escolhendo as partes da realidade que são convenientes para o seu desenvolvimento. Considere que, às vezes, remover objetos que estão longe do jogador é parte do custo de criar um jogo divertido.
fonte
O mundo é discreto. Você não pode renderizar um objeto menor que um pixel; portanto, não permita que esses objetos existam. (Isso é semelhante a alguns dos pontos de realismo apresentados por Theraot .)
Na verdade, você pode obter isso de graça: o jogador especifica sua linha de corte como essencialmente uma linha discreta na tela. O efeito do corte é dividir cada objeto nos subobjetos que consistem, respectivamente, nos pixels nessa linha ou abaixo dela e nos pixels estritamente acima dela. Um objeto de um pixel não pode estar acima e abaixo da linha, portanto não pode ser cortado por esse algoritmo.
Se o corte de todas as tabelas de corte em pixels individuais ainda o deixar com muitos objetos a serem rastreados, um tamanho mínimo maior ainda funcionará.
Ou apenas não se preocupe. Se o jogador está preparado para gastar muito tempo cortando objetos em pó, obviamente não está com pressa, para poder lidar com o atraso que causou. ;-)
fonte