Мне нужна помощь в оптимизации алгоритма генерации мира для игры на основе тайлов - PullRequest
0 голосов
/ 21 октября 2018

Итак, я нахожусь в процессе создания 2D нисходящей игры на основе плиток в Gamemaker: Studio 1.4.Вот текущий сценарий для мирового поколения:

//Generate Center Points
var centerPointCount = 500;
var centerPoint;
var centerPointX;
var centerPointY;
for (var p = 0; p < centerPointCount; p++){
    switch (irandom(3)){
        case 0: centerPoint[p] = 0; //Grass
        break;
        case 1: centerPoint[p] = 0; //Grass
        break;
        case 2: centerPoint[p] = 0; //Grass
        break;
        case 3: centerPoint[p] = 1; //Water
        break;
        default: centerPoint[p] = 0;
        break;
    }
    centerPointX[p] = irandom(499);
    centerPointY[p] = irandom(499);
}

//Set Tiles Based On Center Points
var tiles;
for (var c = 0; c < 500; c++){
    for (var r = 0; r < 500; r++){
        var centerPointDistance = 1000000000;
        var centerPointType;
        for (var p = 0; p < centerPointCount; p++){ //Find Closest Center Point
            var distancePrime = sqr(c - centerPointX[p]) + sqr(r - centerPointY[p]);
            if (distancePrime < centerPointDistance){
                centerPointType = centerPoint[p];
                centerPointDistance = distancePrime;
            }
        }
        tiles[c, r] = centerPointType; //Set Tile To Center Point Type
    }
}

//Generate Objects (Trees, Rocks, Etc.)
var objects;
for (var c = 0; c < 500; c++){
    for (var r = 0; r < 500; r++){
        switch (tiles[c, r]){ //Tile Object Is On
            case 0: //Grass
                if (random(1) <= 0.10){
                    objects[c, r] = 0; //Tree
                } else{
                    objects[c, r] = -1;
                }
            break;
            case 1: //Water
                objects[c, r] = -1;
            break;
            default:
                objects[c, r] = -1;
            break;
        }
    }
}

//Return The World Generated
var world;
world[0] = tiles;
world[1] = objects;
return world;

Выполнение этого кода на процессоре Ryzen 1300x занимает у меня ~ 2 минуты, поэтому мне действительно нужна помощь в его оптимизации, так как я планирую также расширить его., что займет еще больше времени.

...