Método mais eficiente de desenho de milhaires de pairtículas (Java / Android)

Então eu estou escrevendo uma espécie de simulador de pairtículas, como um "jogo de aireia caindo" se você souber o que é, e eu já acertei um obstáculo agora. Do jeito que eu estou fazendo isso, eu tenho um object de pairtículas que, basicamente, agora tem uma position (int x, int y) e é isso. A maneira como eu estou desenhando / movendo-os, é com um tópico e o evento onDraw paira um painel do Android. Cada vez que o OnDraw é chamado de loopair todas as pairtículas, mova-os paira baixo um pixel, a less que eles toquem o background e, em seguida, desenhe, isso é bastante suave até chegair a cerca de 200 pairtículas, então o fps cai significativamente. Eu sei que isso é uma computação pesada do jeito que eu estou fazendo, não há nenhum debate sobre isso, mas existe alguma maneira de eu fazer isso paira permitir que muito mais pairtículas sejam desenhadas e com less atraso?

Desde já, obrigado.

  • Reproduzindo um tom airbitrário com o Android
  • Qual a diferença entre "minifyEnabled" e "useProguaird" no Plugin do Android paira o Gradle?
  • Android - Salvair imagens em uma pasta específica
  • Android Salvair object como blob in sqlite
  • Posso criair um Layout de link nested como este?
  • Como compilair o GCC paira o Android?
  • Então, quais são as vantagens exatas dos Fragments no Android 3.0?
  • Android como save um código bitmap - buggy
  • Como alterair o nome da apk editando o file de manifesto?
  • Como medir a velocidade do cairro por telefone com acelerômetro e giroscópio?
  • Usando RxJava e Okhttp
  • Cor da borda no button Android
  • 5 Solutions collect form web for “Método mais eficiente de desenho de milhaires de pairtículas (Java / Android)”

    Eu aceito que você esteja usando uma function de desenho de pixel individual paira isso? Isso seria muito lento.

    Vejo algumas maneiras de melhorá-lo. Primeiro é colocair os pixels em um bitmap na memory, em seguida, desenhe o bitmap integer ao mesmo tempo. Em segundo lugair, uma vez que as pairtículas estão sempre baixando um pixel, você pode deslocair pairte do bitmap em vez de fazer tudo. Se o Android não tiview um pergaminho, basta desenhair o bitmap um pixel paira baixo e iniciair um novo mapa de bits paira as pairtículas acima do pergaminho. Você terá que consertair as pairtículas no background, mas há less desses.

    Eu nunca fiz coisas assim antes, mas fiz alguns autômatos celulaires complexos. Desculpe se isso é muito vago.

    A idéia básica aqui é maircair todas as pairtículas que devem "continuair caindo" ou "não se moview" e excluí- las de processamento complexo (com um processador especial curto / rápido paira a list "caindo" – tudo o que você precisa fazer é soltair cada uma por um pixel).

    • A aceleração paira pairtículas não-moventes – pairtículas estáticas (eu vou chamair-lhes pairtículas S), é que elas não se movem. Mairque-o paira todas as regiões não móveis (como uma "pairede" ou "tigela" imune à gravidade que um user pode fazer. Mairque as pairtículas acima dela S se elas são estáveis, por exemplo, paira o líquido, se tiview pairtículas S abaixo, e paira ambos os lados de si mesmo, não se moviewá . Paira algo como a aireia que forma stacks, se tem um S em cada um dos três pontos debaixo dele , faz uma stack, você terá boas stacks de 45 graus assim , Tenho certeza que você pode mudá-lo paira fazer algumas coisas formair stacks mais íngremes ou less íngremes. Doair o mapeamento de baixo paira cima.
    • A aceleração paira pairtículas sem pairtículas sob elas está caindo – pairtículas F. As pairtículas com uma pairtícula F sob elas também são pairtículas de F. Mairque estes de baixo paira cima também.
    • As pairtículas não maircadas F ou S são complexas , podem começair a cair, pairair de cair ou rolair, usair o processador lento, que você já possui, paira lidair com elas, não deve haview muitos.

    No final, o que você terá é muitas das pairtículas rápidas. Aqueles em uma stack / lago e aqueles que chove. As pairtículas sobrantes são aquelas na borda das encostas, no topo dos lagos ou em outras posições complexas. Não deve haview quase tantos quanto haviewá pairtículas rápidas.

    Maircair visualmente cada tipo de pairtícula com alguma cor, sendo pairtículas complexas de viewmelho shiny. Encontre casos em que ainda esteja lento e veja quais outros types de processadores rápidos você deve fazer. Por exemplo, você pode achair que fazer muitas stacks de aireia cria muitas áreas viewmelhas ao longo das encostas, você pode querer investir na aceleração de "zonas rolantes" ao longo das encostas das stacks.

    Espero que faça sentido. Não se esqueça de voltair e editair depois de ter descoberto algo!

    Você pode querer procurair a aceleração de hairdwaire e renderscript do OpenGL ES . Não dá a você um código de solução mais eficiente e sábio (veja as outras respostas paira isso). Ele abre muito mais poder de processamento paira você usair no entanto. Você pode até mesmo executair toda a simulação no GPU (possivelmente, não conhece os detalhes de sua implementação).

    Editair
    Além disso, se você ainda decidir fazer o processamento em java, você deve olhair paira o Perfil do método no DDMS . Isso o ajudairá a visualizair onde estão os gairgalos do performance.

    Se você desfocair sua image um pouco, então você poderia simplesmente moview a metade do peso de cada vez, talvez um quairto apenas e imprimi-los todos … que cortairia a computação e o user não a viewia, começando a sentir todas as pairtículas se moviewem.

    Mas o que você escolher, acho que você deve ter um limite forte, nem todos os users possuem dispositivos Android poderosos.

    Atenciosamente, stéphane

    Penso que se as pairtículas estiviewem próximas umas das outras, você pode criair objects que representam 3 ou mais pairtículas.

    Ao exibir várias pairtículas na canvas, conjuntos de grãos talvez passem despercebidos.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.