2012-03-03 2 views
0

Я не могу понять, почему это так медленно, поэтому я надеялся, что кто-то еще может знать: /. chunk_vertices и chunk_indices - это списки.Почему эта функция работает так медленно?

public void get_cube_at_position(int x, int y, int z,Color colour) 
    { 
     int length; 
     if (y > y_size - 2) 
     { 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(x, y + 1, z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(1 + x, y + 1, z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(x, y + 1, 1 + z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(1 + x, y + 1, 1 + z), colour)); 
      length = chunk_vertices.Count - 4; 
      chunk_indices.Add(0 + length); 
      chunk_indices.Add(1 + length); 
      chunk_indices.Add(2 + length); 
      chunk_indices.Add(3 + length); 
      chunk_indices.Add(2 + length); 
      chunk_indices.Add(1 + length); 

     } 
     else if (blocks[x, y + 1, z] == 0) 
     { 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(x, y + 1, z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(1 + x, y + 1, z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(x, y + 1, 1 + z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(1 + x, y + 1, 1 + z), colour)); 
      length = chunk_vertices.Count - 4; 
      chunk_indices.Add(0 + length); 
      chunk_indices.Add(1 + length); 
      chunk_indices.Add(2 + length); 
      chunk_indices.Add(3 + length); 
      chunk_indices.Add(2 + length); 
      chunk_indices.Add(1 + length); 

     } 
     if (y != 0 && blocks[x, y - 1, z] == 0) 
     { 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(x, y, z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(x, y, 1 + z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(1 + x, y, z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(1 + x, y, 1 + z), colour)); 
      length = chunk_vertices.Count - 4; 
      chunk_indices.Add(0 + length); 
      chunk_indices.Add(1 + length); 
      chunk_indices.Add(2 + length); 
      chunk_indices.Add(3 + length); 
      chunk_indices.Add(2 + length); 
      chunk_indices.Add(1 + length); 
     } 
     if (x > x_size - 2) 
     { 
     } 
     else if (blocks[x + 1, y, z] == 0) 
     { 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(1 + x, y, z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(1 + x, y, 1 + z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(1 + x, 1 + y, z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(1 + x, 1 + y, 1 + z), colour)); 
      length = chunk_vertices.Count - 4; 
      chunk_indices.Add(0 + length); 
      chunk_indices.Add(1 + length); 
      chunk_indices.Add(2 + length); 
      chunk_indices.Add(3 + length); 
      chunk_indices.Add(2 + length); 
      chunk_indices.Add(1 + length); 
     } 
     if (x != 0 && blocks[x - 1, y, z] == 0) 
     { 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(x, y, z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(x, y + 1, z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(x, y, 1 + z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(x, y + 1, 1 + z), colour)); 
      length = chunk_vertices.Count - 4; 
      chunk_indices.Add(0 + length); 
      chunk_indices.Add(1 + length); 
      chunk_indices.Add(2 + length); 
      chunk_indices.Add(3 + length); 
      chunk_indices.Add(2 + length); 
      chunk_indices.Add(1 + length); 
     } 
     if (z > z_size - 2) 
     { 
     } 
     else if (blocks[x, y, z + 1] == 0) 
     { 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(x, y, 1 + z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(x, y + 1, 1 + z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(1 + x, y, 1 + z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(1 + x, y + 1, 1 + z), colour)); 
      length = chunk_vertices.Count - 4; 
      chunk_indices.Add(0 + length); 
      chunk_indices.Add(1 + length); 
      chunk_indices.Add(2 + length); 
      chunk_indices.Add(3 + length); 
      chunk_indices.Add(2 + length); 
      chunk_indices.Add(1 + length); 

     } 
     if (z != 0 && blocks[x, y, z - 1] == 0) 
     { 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(x, y, z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(1 + x, y, z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(x, y + 1, z), colour)); 
      chunk_vertices.Add(new VertexPositionColor(new Vector3(1 + x, y + 1, z), colour)); 
      length = chunk_vertices.Count - 4; 
      chunk_indices.Add(0 + length); 
      chunk_indices.Add(1 + length); 
      chunk_indices.Add(2 + length); 
      chunk_indices.Add(3 + length); 
      chunk_indices.Add(2 + length); 
      chunk_indices.Add(1 + length); 
     } 
    } 
+0

Определить «медленный». Медленно по сравнению с чем? –

+0

Определите «так медленно». – millimoose

+0

Имеет ли значение, как OP хочет определить медленное? Просто просмотрите код и попытайтесь найти возможные оптимизации. – Marlon

ответ

1

Ничего вы делаете в этот метод не является по своей сути медленная операция.

Есть несколько микрооптимизаций, которые вы могли бы сделать, чтобы сбрить некоторое время. Но ничего существенного.

Вещи, которые вы могли бы делать в списки вне этот метод потенциально может вызвать метод Add быть значительно медленнее, чем это может быть (например, регулярно воссоздавать их с new).

Но реальная проблема заключается в том, что вы просто называете ее 150000 раз в секунду (как вы упомянули в своем комментарии). Вы всегда должны упоминать такие вещи, как то, что быстро в одном контексте может быть медленным в другом.

Кроме того, предполагается, что вы загружаете данные, которые этот метод генерирует на GPU, возможно, путем копирования его на новый массив - по крайней мере один раз на кадр. Это, вероятно, слишком часто, и настоящая причина потери скорости.

Что вы, вероятно, должны делать, это генерировать все ваши данные вершин/индексов во время загрузки, а затем ссылаться только на время рисования.

Или, если вам нужно изменить данные по мере запуска игры, выяснить способы вызова этого метода реже и прикоснуться к меньшим количеством данных, когда вы это сделаете (например: только регенерировать, когда вам нужно, только регенерировать измененные данные и т. Д.).