2010-09-02 11 views
9

Miré en la implementación de Array.Resize() y noté que se creaba y devolvía una nueva matriz. Mi objetivo es la asignación de memoria cero durante el juego, así que debo evitar crear nuevos tipos de referencia. ¿Cambiar el tamaño de una matriz activa el Recolector de basura en la matriz anterior? Estoy creando mi propio redimensionador de matriz 2D, pero básicamente funciona de la misma manera que el método .NET Resize().¿Cambia el tamaño de la matriz al GC?

Si la nueva matriz es más pequeña que la anterior, pero los objetos en exceso ya se han vuelto a colocar en un conjunto de objetos genérico, ¿invocará esto al GC?

Las matrices se crearán constantemente en mi ciclo de juego, así que debo tratar de hacerlo lo más eficiente posible. Intento crear un array pool como tal, para que no haya necesidad de seguir creando en el juego. Sin embargo, si el método de cambio de tamaño hace lo mismo, no tiene mucho sentido no crear una nueva matriz en lugar de tener la agrupación.

Gracias por la ayuda

+0

Quizás podría usar 'List ' que es básicamente una matriz de redimensionado automática, y supongo que cuando la reduzca, no reducirá la matriz de inmediato ... mmh Tengo que comprobar ... – digEmAll

+3

@digEmAll: 'List ' utiliza 'T []' internamente pero cambia el tamaño para usted. En otras palabras: creará nuevas instancias. –

+0

Gracias por la sugerencia. Una lista de una lista pasó por mi mente (ya que estoy usando arreglos 2D) pero es un poco más complicada para mi juego. – keyboardP

Respuesta

12

Array.Resize en realidad no cambia la matriz original en absoluto, cualquiera que todavía tenga una referencia a ella podrá usarla como antes. Por lo tanto, no hay optimización posible. Francamente, es un método mal llamada, la OMI :(

Desde el docs:

Este método asigna una nueva matriz con el tamaño especificado, copias elementos de la antigua matriz a la nueva, y a continuación, sustituye a la antigua matriz con el nueva.

Así que no, no va a volver a utilizar la memoria original ni nada de eso. es sólo la creación de una copia superficial de un tamaño diferente.

+0

Ese es un buen punto. Hubiera sido mejor aceptar el original por valor y devolver el nuevo. Todo el pasar por referencia aquí realmente podría confundir a un programador junior en este caso. –

+0

Estaba revisando el método en Reflector y simplemente no me sentó bien cuando vi que se estaba creando una nueva matriz. Supongo que tendré que llegar a un compromiso con respecto al diseño y llevar a cabo algunas pruebas de rendimiento. ¡Gracias por la respuesta! – keyboardP

2

Sí, utilizando Array.Resize provoca una nueva matriz que se asignará y el viejo para ser recogida con el tiempo (a menos que todavía hay referencias a ella en alguna parte).

Un redimensionador de matriz de bajo nivel podría hacer una optimización menor en algunos casos (por ejemplo, cuando la matriz se está haciendo más pequeña o hay memoria disponible justo después de la matriz), pero la implementación de .NET no Haz eso.

1

implícitamente sí.

Explicitly no.

1

Cualquier asignación eventualmente será limpiada por el GC cuando no haya más referencias, así que sí.

Si desea evitar el cambio de tamaño de sus matrices, lo mejor que puede hacer es preasignar con un tamaño lo suficientemente grande para evitar tener que reasignar en absoluto. En ese caso, también podría usar una clase de colección con una capacidad inicial especificada en el constructor, como Lista.

Cuestiones relacionadas