2011-06-15 10 views
6

Así que estoy escribiendo una especie de simulador de partículas, como un "juego de arena cayendo" si sabes qué es eso, y he golpeado un obstáculo ahora. La forma en que lo hago es tener un objeto de partículas que básicamente ahora tiene una posición (int x, int y) y eso es todo. La forma en que estoy dibujando/moviéndolos, es con un hilo y el evento onDraw para un panel de Android. Cada vez que se llama onDraw, recorro todas las partículas, las muevo hacia abajo un píxel a menos que toquen el fondo y luego las dibujen, esto es bastante suave hasta que llego a unas 200 partículas, luego el fps cae significativamente. Sé que esto es un cálculo pesado de la manera que lo estoy haciendo, no hay debate al respecto, pero ¿hay alguna manera de que yo pueda hacer esto para permitir que se dibujen muchas más partículas y con menos retraso?Método más eficiente de dibujar miles de partículas (Java/Android)

Gracias de antemano.

Respuesta

0

Si difumina su imagen un poco, entonces podría simplemente mover la mitad de las partículas a la vez, tal vez un cuarto solamente e imprimirlas todas ... eso reduciría el cálculo y el usuario no lo vería, sintiendo todo partículas se mueven.

Pero independientemente de lo que elija, creo que debe poner un límite fuerte, no todos los usuarios tienen potentes dispositivos con Android.

Saludos, Stéphane

2

lo tomo que está utilizando una función de dibujo individuales píxeles para esto? Eso sería de hecho lento.

Veo un par de formas de mejorarlo. Lo primero es poner los píxeles en un mapa de bits en memoria y dibujar todo el mapa de bits al mismo tiempo. En segundo lugar, dado que las partículas siempre descienden un píxel, puede desplazarse por una parte del mapa de bits en lugar de volver a dibujar todo. Si Android no tiene un pergamino, simplemente dibuja el mapa de bits un píxel hacia abajo y comienza un nuevo mapa de bits para las partículas sobre el pergamino. Tendrás que arreglar las partículas en la parte inferior, pero hay menos de esas.

+0

es la función drawPoint (x, y, Paint) de Android. – Hamel

0

Creo que si las partículas se cierran entre sí, puede crear objetos que representen 3 o más partículas.

Al mostrar varias partículas en la pantalla, los conjuntos de granos pueden pasar desapercibidos.

2

Es posible que desee buscar en OpenGL ES aceleración de hardware y renderscript. No le da una solución más eficiente en cuanto al código (vea las otras respuestas para eso). Sin embargo, abre mucho más poder de procesamiento para su uso. Incluso puede ejecutar toda la simulación en la GPU (posiblemente no conozca los detalles de su implementación).

Editar
Además, si aún así decide hacer el procesamiento en Java, usted debe buscar en Method Profiling in DDMS. Esto te ayudará a visualizar dónde están los cuellos de botella de tu rendimiento.

+0

+1: Realmente, la única respuesta razonable aquí. OpenGL está diseñado exactamente para hacer este tipo de procesamiento. – Rekin

2

Nunca he hecho cosas como esta antes, pero he hecho algunos autómatas celulares complejos . Lo siento si esto es demasiado vago.

La idea básica aquí es marca todas las partículas que deben "seguir cayendo" o "no se mueven" y excluir desde un procesamiento complejo (con un procesador especial corta/rápida para la lista de "caída" - todo lo que necesitas hacer es dejar caer cada uno por un píxel).

  • La aceleración para partículas no móviles - partículas estáticas (las llamaré partículas S), es que no se mueven. Marcarlo para todas las regiones que no se mueven (como una "pared" inmune a la gravedad o "tazón" que un usuario podría hacer. Marcar las partículas por encima de S si son estables, por ejemplo, para líquido, si tiene partículas S en , y para ambos lados de sí mismo, no se moverá. Para algo así como la arena que forma pilas, si tiene una S en cada uno de los tres puntos debajo de ella, hace una pila, obtendrá bonitos 45- grados acumulados como este, estoy seguro de que puede cambiarlo para hacer que algunas cosas formen montones más empinados o menos escarpados. Haga un mapeo S de abajo hacia arriba
  • La aceleración de partículas sin partículas debajo de ellas está cayendo - Partículas F Las partículas con una partícula F debajo de ellas también son partículas F. Marque estas de abajo hacia arriba también.
  • Partículas sin marcar F o S a re complejo, pueden comenzar a caer, dejar de caer, o rodar, use el procesador lento, que ya tiene, para manejarlos, no debería haber muchos.

Al final lo que tendrá es muchas partículas rápidas. Los que están en una pila/lago y los que llueven. Las partículas sobrantes son aquellas en el borde de las pendientes, en la parte superior de los lagos o en otras posiciones complejas. No debería haber tantos como partículas rápidas.

Marca visualmente cada tipo de partícula con un poco de color, las partículas complejas son de color rojo brillante. Encuentre casos donde todavía es lento y vea qué otros tipos de procesadores rápidos debe hacer. Por ejemplo, es posible que al hacer muchas pilas de arena se creen muchas áreas rojas a lo largo de las pendientes, es posible que desee invertir en acelerar las "zonas de laminación" a lo largo de las laderas de las pilas.

Espero que tenga sentido. ¡No olvide volver y editar una vez que haya resuelto algo!

+0

esto es muy útil, probablemente haga esto – Hamel

Cuestiones relacionadas