How to update a big area without flickering

I want to update the screen but when I do it it flickers too much.

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1351.h>

// OLED Display Dimesions (pixels)
#define OLED_WIDTH 128
#define OLED_HEIGHT 128

// OLED Display PINS
#define DIN_PIN 12
#define CLK_PIN 11
#define CS_PIN 10
#define DC_PIN 9
#define RST_PIN 8

// On / Off Button Pin
#define OnOff_TOGGLE_SWITCH_PIN 4

// OLED Colours
#define  BLACK           0x0000
#define BLUE            0x001F
#define RED             0xF800
#define GREEN           0x07E0
#define CYAN            0x07FF
#define MAGENTA         0xF81F
#define YELLOW          0xFFE0  
#define WHITE           0xFFFF

Adafruit_SSD1351 display = Adafruit_SSD1351(OLED_WIDTH, OLED_HEIGHT, CS_PIN, DC_PIN, DIN_PIN, CLK_PIN, RST_PIN);

// Alien Settings
#define NUM_ALIEN_COLUMNS 7
#define NUM_ALIEN_ROWS 3
#define X_START_OFFSET 6
#define SPACE_BETWEEN_ALIEN_COLUMNS 5
#define LARGEST_ALIEN_WIDTH 11
#define SPACE_BETWEEN_ROWS 9

// OLED Graphics
static const unsigned char PROGMEM InvaderTopGfx [] =
{
  B00011000,
  B00111100,
  B01111110,
  B11011011,
  B11111111,
  B00100100,
  B01011010,
  B10100101
};

static const unsigned char PROGMEM InvaderMiddleGfx [] =
{
  B00100000, B10000000,
  B00010001, B00000000,
  B00111111, B10000000,
  B01101110, B11000000,
  B11111111, B11100000,
  B10111111, B10100000,
  B10100000, B10100000,
  B00011011, B00000000
};

static const unsigned char PROGMEM InvaderBottomGfx [] =
{
  B00001111, B00000000,
  B01111111, B11100000,
  B11111111, B11110000,
  B11100110, B01110000,
  B11111111, B11100000,
  B00111001, B11000000,
  B01100110, B01100000,
  B00110000, B11000000
};

struct GameObjectStruct  {
    signed int X;
    signed int Y;  
};

struct AlienStruct  {
  GameObjectStruct Ord;
};

AlienStruct  Alien[NUM_ALIEN_COLUMNS][NUM_ALIEN_ROWS];

byte AlienWidth[]={8,11,12};  // top, middle ,bottom widths

void setup()
{
  display.begin();
  InitAliens(0);
}

void loop()
{
  UpdateDisplay();
}

void UpdateDisplay()  
{
  display.fillScreen(BLACK);
  for(int across=0;across<NUM_ALIEN_COLUMNS;across++)
  {
    for(int down=0;down<NUM_ALIEN_ROWS;down++)
    {
      switch(down)  
      {
        case 0: 
          display.drawBitmap(Alien[across][down].Ord.X, Alien[across][down].Ord.Y,  InvaderTopGfx, AlienWidth[down], 8,WHITE);
          break;
        case 1: 
          display.drawBitmap(Alien[across][down].Ord.X, Alien[across][down].Ord.Y,  InvaderMiddleGfx, AlienWidth[down], 8,WHITE);
          break;
        default: 
          display.drawBitmap(Alien[across][down].Ord.X, Alien[across][down].Ord.Y,  InvaderBottomGfx, AlienWidth[down], 8,WHITE);
      }
    }
  }
}

void InitAliens(int YStart)  { 
  for(int across=0;across<NUM_ALIEN_COLUMNS;across++)  {
    for(int down=0;down<3;down++)  {
      Alien[across][down].Ord.X=X_START_OFFSET+(across*(LARGEST_ALIEN_WIDTH+SPACE_BETWEEN_ALIEN_COLUMNS))-down;  
      Alien[across][down].Ord.Y=YStart+(down*SPACE_BETWEEN_ROWS);
    }
  }
}

The reason I want to update it every frame is because I am going to animate them.

See fillRect() and fillScreen() too slow and flickers too much - #23 by musman12