Estoy desarrollando un juego usando XNA y C# y estaba tratando de evitar llamar al código de tipo new struct()
en cada fotograma, ya que pensé que eso podría asustar al GC. "Pero espera", me dije, "struct es un tipo de valor. El GC no debería ser llamado entonces, ¿verdad?" Bueno, es por eso que estoy preguntando aquí.¿Qué sucede cuando se crean tipos de valores?
Solo tengo una idea muy vaga de lo que sucede con los tipos de valores. Si creo una nueva estructura dentro de una llamada a función, ¿se está creando la estructura en la pila? ¿Simplemente será empujado y reventado y el rendimiento no tendrá éxito? Además, ¿habría algún límite de memoria o implicaciones de rendimiento si, por ejemplo, necesito crear muchas instancias en una sola llamada?
Tomemos, por ejemplo, este código:
spriteBatch.Draw(tex, new Rectangle(x, y, width, height), Color.White);
rectángulo en este caso es una estructura. ¿Qué sucede cuando se crea ese nuevo rectángulo? ¿Cuáles son las implicaciones de tener que repetir esa línea muchas veces (por ejemplo, miles de veces)? ¿Se crea este rectángulo, se envía una copia al método Dibujar y luego se descarta (es decir, no se consume ninguna memoria más se llama a Draw de esa manera en la misma función)?
P.S. Sé que esto puede ser una optimización pre-madura, pero tengo curiosidad y deseo tener una mejor comprensión de lo que está sucediendo.
Si llamo a la misma función una y otra vez, ¿se presiona un nuevo rectángulo cada llamada para Dibujar y aparece cuando devuelve Draw? – Bob
Sí, pero tenga en cuenta que empujar y hacer saltar marcos de pila es simplemente incrementar/disminuir un puntero (una sola instrucción de máquina). Y el compilador JIT lo optimizará todo para que el reino llegue de todos modos. – thecoop
@Bob: Sí, aunque creo que es posible, en teoría, que el JIT * pueda * ver llamadas idénticas y guardar en caché el valor para enviar varias veces, pero esto parece muy poco probable dada la heurística que implicaría detectar este y podría descartarse fácilmente. –