LEDcube icon indicating copy to clipboard operation
LEDcube copied to clipboard

исправление производительности на режимах с синусами/волнами

Open avdosev opened this issue 6 years ago • 0 comments

Смотрел видео с кубом и увидел что волны подлагивают. Решил исправить. Путем нехитрых манипуляций выяснил что компилятор как то плохо оптимизировал.

В итоге разница оказалась существенной:

time old_sinusFill 1260
time new_sinusFill 4

Тестировал на таком примере (тк нет куба)

void sinusFill();
void old_sinusFill();

uint8_t pos = 10;

using fnc_ptr = void (*)(void);

void checkTime(fnc_ptr fnc, const char* fnc_name) {
  Serial.print("start ");
  Serial.println(fnc_name);
  auto start = micros();
  fnc();
  auto end = micros();
  Serial.print("time ");
  Serial.print(fnc_name);
  Serial.print(": ");
  Serial.println(end - start);
}

void setup() {
  Serial.begin(9600);
  
  checkTime(sinusFill, "new_sinusFill");
  checkTime(old_sinusFill, "old_sinusFill");  
}

void loop() { }

void setVoxel(uint8_t first, uint8_t second, uint8_t third) {  }

void old_sinusFill() {
  for (uint8_t i = 0; i < 8; i++) {
    for (uint8_t j = 0; j < 8; j++) {
      uint8_t sinZ = 4 + ((float)sin((float)(i + pos) / 2) * 2);
      for (uint8_t y = 0; y < sinZ; y++) {
        setVoxel(i, y, j);
      }
    }
  }
}

void sinusFill() {

  for (uint8_t i = 0; i < 8; i++) {

    uint8_t sinZ = 4 + ((float)sin((float)(i + pos) / 2) * 2);

    for (uint8_t j = 0; j < 8; j++) {
      for (uint8_t y = 0; y < sinZ; y++) {
        setVoxel(i, y, j);
      }
    }
  }
}

avdosev avatar Aug 11 '19 13:08 avdosev