2015-06-16 4 views
-2

Я написал код сегодня. Я не могу понять, как уменьшить длину этого кода, хотя он кажется повторяющимся, каждая часть отличается.Я пытаюсь уменьшить длину этого кода

  try { 
       totalVerts.Add(verts[i]); 
       if (verts[i].x > maxXvert) 
       { 
        maxXvert = verts[i].x; 
       } 
       if (verts[i].x < minXvert) 
       { 
        minXvert = verts[i].x; 
       } 
       if (verts[i].y > maxYvert) 
       { 
        maxYvert = verts[i].y; 
       } 
       if (verts[i].y < minYvert) 
       { 
        minYvert = verts[i].y; 
       } 
       if (verts[i].z > maxZvert) 
       { 
        maxZvert = verts[i].z; 
       } 
       if (verts[i].z < minZvert) 
       { 
        minZvert = verts[i].z; 
       } 
      } 

В этом коде я добавляю вершины позиции Vector3 (x, y, z) в totalVerts Array. Я также проверяю каждую позицию x, y, z, является ли это максимумом или минимумом всех вершин, если это так, я затем устанавливаю переменные maxXvert, maxYvert ... и т. Д. Для значения, которое выше или ниже.

Если кто-нибудь может подумать о способе уменьшить, это было бы здорово. Спасибо.

+2

Без четкого описания проблемы (т. Е. «Мой код делает X, я хочу, чтобы он выполнял Y вместо»), это не по теме для переполнения стека. Возможно, вы можете получить соответствующую помощь на codereview.stackexchange.com, но даже там у вас возникнет проблема, что «уменьшить CPU [стоимость]» слишком расплывчато, чтобы ответить. Вы должны четко понимать, какую производительность вы видите, какова ваша фактическая производительность, и почему вы считаете, что цель разумна. –

+0

Так вот почему я забвенею в забвении? Мой вопрос в том, как уменьшить размер кода. Было бы неплохо услышать, если кучка if thens является неэффективным методом. Редактирование моего вопроса. –

ответ

5

Вы можете использовать Math.Min и Math.Max.

minXvert = Math.Min(verts[i].x, minXvert); 
maxXvert = Math.Max(verts[i].x, maxXvert); 

Это сделает ваш код более кратким и читаемым, но не сделает его быстрее.

Чтобы сделать это несколько быстрее, вы можете хранить значения x, y, z в локальных переменных, поэтому их нужно искать один раз вместо 2-4 раз. Но компилятор, вероятно, сделает это для вас в любом случае. int x = verts[i].x; и т. Д.

0

Производительность разумная, это нормально. Код просто выглядит уродливым. К сожалению, функция Array.max() в LINQ предназначена только для .net 3.5, а единство - .net 2.0, поэтому я не могу придумать лучшего способа.

Если LINQ там, где это возможно (это не так), вы могли бы сделать.

float minX=totalVerts.min(v => v.x); 

или аналогичный, который был бы намного аккуратнее (я бы проверить производительность)

+0

Я не знаю, почему люди продолжают это говорить. Кажется, я могу использовать Mathf.max и Mathf.min! –

1

Вы можете удалить все скобки: (! Нет рефакторинга, только меньше строк)

try { 
     totalVerts.Add(verts[i]); 
     if (verts[i].x > maxXvert) 
      maxXvert = verts[i].x; 
     if (verts[i].x < minXvert) 
      minXvert = verts[i].x; 
     if (verts[i].y > maxYvert) 
      maxYvert = verts[i].y; 
     if (verts[i].y < minYvert) 
      minYvert = verts[i].y; 
     if (verts[i].z > maxZvert) 
      maxZvert = verts[i].z; 
     if (verts[i].z < minZvert) 
      minZvert = verts[i].z; 
    } 
0

Трудно угадать контекст этого, но по моему опыту, имеющему разные поплавки, вектор представляет собой ненужную боль. Если вы создадите два Vetor3 вместо шести float, вы можете получить доступ к отдельным значениям (например, myVector3.x += 1f;). И, используя более высокую абстракцию, вы оба делают код более читаемым и включать Vector3 функциональные возможности, такие как Макс и Мин методы, которые служат саму цель упрощающего кода:

Vector3 upperBound = Vector3.one * Mathf.NegativeInfinity, 
     lowerBound = Vector3.one * Mathf.Infinity; 

foreach (Vector3 vert in verts) { 

    totalVerts.Add(vert); 
    upperBound = Vector3.Max(upperBound, vert); 
    lowerBound = Vector3.Min(lowerBound, vert); 
} 

В качестве примечания, если вы делая процедурные сетки, и это должно вычислять границы, быть в курсе метода RecalculateBounds(). В большинстве случаев, когда мне нужны границы процедурной сетки, я читал ее из mesh.bounds после создания и пересчета сетки, потому что мне приходилось делать это в любом случае и просто читать, если впоследствии спасет меня от неприятностей.