Гибкость против производительности считается хорошей практикой - PullRequest
0 голосов
/ 26 октября 2019

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

Iсначала напишу мою проблему, а затем опубликую некоторый код.

Итак, у меня есть переключатель с 4 случаями, а затем в моей функции, вызываемой случаями, у меня есть еще два случая (ifs). Я должен переписать код, используемый во всех этих случаях, но немного отличается в каждом.

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

 private void FillDiagonalStartAndEnd(FastNoise noiseBiome, FastNoise noiseTransition)
{
    switch (direction)
    {
        case DirectionOfBiomeCell.NE:
            TransitionDiagonallyNorthEast(noiseBiome, noiseTransition); // Less checks
            break;
        case DirectionOfBiomeCell.SE:
            towardsRight = 1;
            TransitionDiagonallyED(noiseBiome, noiseTransition, new Vector2(spacePosX -1, spacePosZ + BIOME_CELL_SIZE), new Vector2(spacePosX + BIOME_CELL_SIZE - 1, spacePosZ)); // More flexible
            break;
        case DirectionOfBiomeCell.SW:
            //TransitionLinearlySouth(noiseBiome, noiseTransition);
            break;
        case DirectionOfBiomeCell.NW:
            //TransitionLinearlyWest(noiseBiome, noiseTransition);
            break;
        default:
            Debug.Log("Default case in FillDiagonallyStartAndEnd");
            break;
    }
}

Выше, у меня есть направление NE, которое болееЯ думаю, что это перманент, а затем SE направление, которое является гибким с параметрами.

Затем в функциях:

private void TransitionDiagonallyED(FastNoise noiseBiome, FastNoise noiseTransition, Vector2 start, Vector2 end)
{
    //Variables for flexible function
    int heightModificator;

    //Start and ending values for diagonal line
    int startValue = TerrainGen.GetNoise2D(noiseBiome, (int)start.x, (int)start.y, TerrainGen.min, TerrainGen.max);
    int endValue = TerrainGen.GetNoise2D(noiseTransition, (int)end.x, (int)end.y, TerrainGen.min, TerrainGen.max);

    //Step values
    float endMinusStart = endValue - startValue;
    float stepValue = endMinusStart / BIOME_CELL_SIZE;

    //1 or 0 for height start of diagonal
    heightModificator = (int)start.y > spacePosX ? 1 : 0;

    for (int xz = 0; xz < BIOME_CELL_SIZE; xz++)
    {
        //Making diagonal and adjusting if it starts at the bottom or top of the square
        transitionHeights[xz, Mathf.Abs((BIOME_CELL_SIZE - 1) * heightModificator - xz)] = Mathf.RoundToInt((startValue + stepValue * (xz + 1)) * towardsRight + (endValue - xz * stepValue) * towardsLeft);
    }
}

Я не буду публиковать все остальные функции, так как они очень длинные, но над вамив цикле видно, что я использую умножение на 0 или 1. Это устанавливается в heightModificator, которого нет в другой функции без параметров. Это очень удобно, так как оно гибкое и устанавливается в начале урока.

public int towardsRight = 0;
public int towardsLeft = 0;

Теперь другой функции это не нужно, поскольку ее можно использовать только в том случае, если направление NE

private void TransitionDiagonallyNorthEast(FastNoise noiseBiome, FastNoise noiseTransition)
{
    float endMinusStart;
    float stepValue;

    if (position == PositionOfBiomeCell.outward)
    {
        //For diagonal
        endMinusStart = valuesFromTransitionNoiseEND[BIOME_CELL_SIZE - 1] - valuesFromBiomeNoiseSTART[0];
        stepValue = endMinusStart / BIOME_CELL_SIZE;

        for (int xz = 0; xz < BIOME_CELL_SIZE; xz++)
        {
            //Filling diagonal
            transitionHeights[xz, xz] = Mathf.RoundToInt(valuesFromBiomeNoiseSTART[0] + (xz + 1) * stepValue);

Итак, выше вы можете видеть, что нет умножения на heightModificator,Функции не завершены, поэтому в обеих функциях было бы еще два таких цикла. Я не хотел их писать, так как не знаю, на что пойти. Что считается хорошей практикой, быть более гибким, но менее эффективным или наоборот?

В моем случае этот код будет выполнен МНОГО раз. Я бы сказал, что в моей функции Start () около 2080 (потому что многие объекты используют этот код). Более того, две мои петли, каждая из которых повторяется около 496 раз, будут вложены в первую.

Спасибо за чтение

С уважением.

1 Ответ

1 голос
/ 26 октября 2019

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

Пока вы не уверены, что существует проблема с производительностью, не ищите способ оптимизацииЭто. Есть большая вероятность, что вы тратите время на неправильные вещи. Для вашего примера, приличное устройство даже не потревожится с простым кодом, который вызывается 2000 раз, даже если вы делаете эти вызовы каждую секунду.

С другой стороны, наличие чистого кода позволит вам работать быстрее и производить меньше ошибок. И проще оптимизировать чистый код, чтобы сделать его быстрее, чем убирать ненужные оптимизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...