Archive

Archive for the ‘C/C++’ Category

Compilar el driver de MongoDB para C++

Hoy he tenido que usar el driver de MongoDB para C++, concretamente junto a QT, y me he encontrado con distintos errores a la hora de compilar del tipo Leer más…

Categorías:C/C++, Programación Etiquetas: , ,

Reutilizando objetos para ahorrar tiempo y memoria en Java

25 septiembre, 2011 3 comentarios

Aunque lo comento a raíz de una optimización que estoy realizando en una aplicación Android, es aplicable a Java y cualquier otro lenguaje.

Por lo general, estamos acostumbrados a crear objetos cada vez que lo necesitemos y a destruirlos una vez que ya no nos hagan falta, sin embargo, esto no es muy adecuado cuando vamos  a crear muchísimos objetos y a destruirlos tras un breve uso, pues el sistema tendrá que buscar un hueco de memoria, reservarlo, usarlo y borrarlo en cada ocasión.

Para solventarlo, lo mejor es reciclar objetos, lo cual se hace de una forma MUY sencilla.

Supongamos que tenemos un objeto Bala de un juego de disparos, del cual sabemos que crearemos miles y miles a lo largo de una partida. Podría ser algo así:


public class Bala {

    private int x;

    private int y;

    private float direccion;

    public Bala(int x, int y, float direccion) {

        this.x = x;

        this.y = y;

        this.direccion = direccion;

    }

}

Evidentemente necesitaría unos cuantos métodos más como el avanzar y tal, pero eso no nos concierne ahora, lo que nos preocupa es como poder volver a utilizar este objeto una vez no nos haga falta, como en nuestro caso, una vez choque contra el enemigo o salga de la pantalla.

El sistema es simple, una vez un objeto no lo necesitemos más, en vez de borrarlo, lo reciclamos y lo guardamos para cuando necesitemos uno nuevo.

Después, cuando necesitemos un objeto de este tipo, en vez de crearlo, miraremos si tenemos alguno guardado y si es así lo devolvemos, si no, creamos uno.

La clase finalmente podría quedar así:


public class Bala {

    private int x;

    private int y;

    private float direccion;

    private static LinkedList<Bala> balas = new LinkedList<Bala>();

    public Bala(int x, int y, float direccion) {

        this.x = x;

        this.y = y;

        this.direccion = direccion;

    }

         //Método estático que usaremos para obtener nuevas balas
         public static Bala getBala(int x, int y, float direccion) {

              //Si no tenemos elementos reciclados, creamos uno nuevo

           if (balas.isEmpty())

                 return new  Bala(x, y, direccion);

            //Si hay elementos, sacamos uno de la lista. Le ponemos los valores y lo devolvemos

            Bala bala = balas.removeFirst();
            bala.x = x;
            bala.y = y;
            bala.direccion = direccion;
            return bala;
     }

      //Una vez añadimos uno a reciclar NO debemos volver a usarlo, pues podríamos estar
      //usándolo en dos sitios distintos a la vez...
      public void reciclar() {
          balas.add(this);
      }
      //Cuando sepamos que no vamos a necesitar más ningún elemento, podemos borrar la lista
      //para no seguir almacenándolos en memoria.
      public static void borrarRecicladas() {
           balas.clear();
       }

}

Como podéis ver, la idea es muy simple y muy útil. Dependiendo de vuestras necesidades podéis modificarlo, como no guardar más de un máximo de elementos o borrarlos todos cada cierto tiempo.
En fin, espero que os sea de utilidad.

Números aleatorios en C/C++ con Threads

 Con los nuevos multicore, los programadores debemos aprender a programar para estos sistemas, y uno de las formas más eficientes es mediante el uso de hebras (threads). Leer más…