Вы можете оптимизировать это, например, вместо того, чтобы проверять, если x> 0 много раз, поместить только одну обертку в другую, если
if(x > 0) {
if(cells[x - 1][y])
alive++;
if(y > 0 && cells[x - 1][y - 1])
alive++;
if(y < edgeAmount && cells[x - 1][y + 1])
alive++;
}