Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Unión de arrays

Iniciado por JotaErre, Noviembre 13, 2017, 12:14:35 AM

Tema anterior - Siguiente tema
Noviembre 13, 2017, 12:14:35 AM Ultima modificación: Noviembre 13, 2017, 08:05:32 AM por pioj
Muy buenas!
 
Quizás la pregunta es un poco básica. Aún así he buscado y rebuscado y no encuentro nada que me funcione.
 
¿Como se hace para unir dos arrays en otra en c# ?
 
He intentado lo siguiente           
 



   
       
   
   
      listShips = GameObject.FindGameObjectsWithTag("Ship");
                  listMisc = GameObject.FindGameObjectsWithTag("Misc");
   
   
                  listShips.CopyTo(listAll, 0);
                  listMisc.CopyTo(listAll, listShips.Length);
   
   
       
   

[/quote]
 
Saludos!

Noviembre 13, 2017, 12:35:58 AM #1 Ultima modificación: Noviembre 13, 2017, 08:06:11 AM por pioj



   
      Array.Copy(Source, index, Destine, index, length);
   

[/quote]
 
Por que no utilizas listas
 



   
       
   
   
      List<GameObject> _objects = new List<GameObject>();
   
   
      _objects.AddRange(GameObject.FindGameObjectsWithTag("Ship"));
      _objects.AddRange(GameObject.FindGameObjectsWithTag("Misc") );
   
   
       
   

[/quote]
 
 

Aguante las listas! fuck the arrays, para agregar si querés a lo útlimo tener una version en array podés hacer:
 

GameObject[] arrayFinal;
List<GameObject> lista = new List<GameObject>();
 
//llenaste la lista
 
//...
 
 
arrayFinal = lista.ToArray();

 
 
 
 


int size = array1.Length + array2.Length;
GameObject arrayFinal = new GameObject[size];
for (int i = 0; i < size; i++) {
    if (i < array1.Length) {
        arrayFinal = array1;
    } else {
        arrayFinal = array2[i - array1.Length];
    }
}

 
 

puedes hacerlo con el operador new. En java:
 
var Variable : float[]=new float[6];
 
En C# creo que puede ser (lo mismo que puso Igor):
 
float[] Variable=new float[6];
 
Por otro lado no se si esto es buena idea, ya que con el operador new estás guardando esta variable en la parte dinámica de la Ram (el "heap"), la cual está deslocalizada.
 
Las listas están para crear arrays dinámicos y son compatibles con el C# de unity así que, al igual que los demás, es lo que te recomiendo.

Cita de: gZone date=1510910574No se deben emplear listas con GameObjects (es una mala práctica en Unity que incide en el rendimiento).
   
   
      * Unity recomienda (siempre que se pueda) el uso de Arrays (dimensión fija) para GameObjects/instancias...
   
   
       
   


NO NECESARIAMENTE. Para todo hay excepciones.
 
Y de hecho, si te pasas por las keynotes de Unite2017 Youtube, te enterarás que las listas son BASTANTE rápidas, en cuanto rendimiento, ya que es lo que recomiendan para juegos Mobile. Yo también pecaba de pensar eso, y luego me llevé una grata sorpresa...
 
 
 
A la larga, si el número de ítems (de lo que sea) siempre va a ser variable, es la mejor opción que puedes tener. Es una cuestión de mantener la mejor relación entre coste/rendimiento, por operación.
 
Si uno está comenzado con Unity y no tiene una cantidad de código excesivamente compleja, las List<> son una gran ayuda para aprender gestionar una colección de datos.

¿gZone como estas haciendo estas prueba?
 
Porque una cosa es inicializar un arreglo de 2000 objetos y luego asignar, estás recorriendo un arreglo no creando.
 
Las listas son mucho más óptimas, debido a que es menos costoso insertar un dato debido a que no tienes que recorrer todo o parte del arreglo para asignar un dato, por ejemplo si tienes 20 ítems y necesitas borrar 1 ¿Como lo haces?, ¿Como verificar cuantos items tenes? cada una de las acciones tiene un costo de n(X) por lo cual veo un poco más efectiva las listas.
 
Intenta hacer lo siguiente -
 

List<GameObject> obj = new List<GameObject>(50000);

 
Debería de cambiar un poco la historia.
 
si no importa el orden de los ítems lo mejor es utilizar Stacks son mucho más rápidos.
 
Y si queres ir a algo muchisimo mas rapido utilizar unsafe en C# para la omisión de tipos.
 

unsafe
{
  fixed (GameObject* item = array)
  {
     *item = new GameObject();
  }
}

 
Sigo pensando que las listas es una opción muy buena siempre y cuando el arreglo se modifique, de lo contrario un simple Array es perfecto.

que los arrays son mas "rapidos" es algo que, yo creo, todo el mundo conoce
 
aunque las listas traen una serie de "funcionalidades" que simplifican el trabajo....  todo lo que puedan hacer las listas se puede hacer con array... creo que una vez use una List... :)

@gZone, si sólo se tiene en cuenta un caso concreto (o el ejemplo de tu proyecto en cuestión), y no se plantea todo el espectro de posibilidades que se pueden dar, es normal que te choque nuestra opinión respecto a las listas.
 
Todos esos gráficos y pruebas de rendimiento también los llevamos viendo nosotros desde hace tiempo, al igual que tú. Por aquí hay mucho personaje activo y nervioso que no para en todo el día, estrujando hasta el último blog con información técnica de Unity, para asegurar siempre el máximo rendimiento posible en los juegos...
 
Siguiendo el ejemplo de los Dictionary<string, object>, es curioso como los Lead Programmer (no son precisamente chavalines de 16 años que empiezan) de grandes empresas de videojuegos de China, o de cualquier otro país, van contando sus experiencias en cuanto a qué prácticas son más recomendables que otras. Por supuesto, se basan en lo que han trabajado en varios proyectos de distinto género y tipo, toda clase de juegos de corta o larga duración de desarrollo. 
 
Así que te vuelvo a dar mi opinión: "NO NECESARIAMENTE un array[] es la mejor opción y usar listas es una mala praxis...".

es lo q llaman una micro optimizacion, o en otras palabras una perdedera de tiempo... hay otras cosas mas importantes q optimizar, y no pasas de usar List a usar Array antes de ver en el profiler si en verdad te esta afectando

Esto de la optimización va más allá de una simple comparación de tipos -
 
@gZone Esto es un fallo de normalización -
 

public class ajustaCamara : MonoBehaviour
{
public Vector2 sCala;
public Vector2 res = new Vector2(1920f, 1080f);
public Text telemetria;
public Image raw1;
public Image raw2;
public Image raw3;
public Image raw4;
public Image lraw1;
public Image lraw2;
public Image lraw3;
public Image lraw4;
private bool sraw;
private float timer;
private Camera cam;
private float px;
private float py;
private bool stelemetria;
...

 
Ahi si podrias utilizar array --

Etiquetas: