如何最佳地移动大数组n发生次数

时间:2019-07-13 14:40:09

标签: optimization arduino neopixel

我正在创建自己的音乐可视化工具版本,以响应音乐的频率;一个普通的项目。我正在使用2条Neopixels,每条带300个LED,总共有600个LED。

我编写了如下所示的函数,这些函数产生了使光脉冲独立地沿着条带传播的预期效果。但是,当实时播放音乐时,每秒的更新速度太慢,无法产生良好的脉冲。看起来不稳。

我认为问题在于调用该函数时必须执行的操作数。对于每次调用该函数,必须将每个带区的300个值数组移位5个索引并添加5个新值。

以下是该功能当前工作方式的说明:

-任意数字用于填充数组

-显示2个索引的移位

-X表示未分配值的索引

-N代表函数添加的新值

Initial array: [1][3][7][2][9]
Shifted array: [X][X][1][3][7]
New array:     [N][N][1][3][7]

这里是我的代码。 loop()下的函数声明。我正在使用random()触发脉冲以进行测试;为简洁起见,没有其他功能。

#include <FastLED.h>

// ========================= Define setup parameters =========================
#define NUM_LEDS1 300                    // Number of LEDS in strip 1
#define NUM_LEDS2 300                    // Number of LEDS in strip 1
#define STRIP1_PIN 6                     // Pin number for strip 1
#define STRIP2_PIN 10                    // Pin number for strip 2
#define s1Band 1                         // String 1 band index
#define s2Band 5                         // String 2 band index
#define numUpdate 5                      // Number of LEDs that will be used for a single pulse  

// Colors for strip 1: Band 2 (Index 1)
#define s1R 255
#define s1G 0
#define s1B 0
// Colors for strip 2: Band 6 (Index 5)
#define s2R 0
#define s2G 0
#define s2B 255


// Create the arrays of LEDs
CRGB strip1[NUM_LEDS1];
CRGB strip2[NUM_LEDS2];



void setup() {

  FastLED.addLeds<NEOPIXEL, STRIP1_PIN>(strip1, NUM_LEDS1);
  FastLED.addLeds<NEOPIXEL, STRIP2_PIN>(strip2, NUM_LEDS2);
  FastLED.setBrightness(10);
  FastLED.clear();
  FastLED.show();

}

void loop() {

  int num = random(0, 31);

  // Pulse strip based on random number for testing
  if (num == 5) {
    pulseDownStrip1();
  }

  pulseBlack1();

}




// ======================= FUNCTION DECLARATIONS =======================

// Pulse a set of colored LEDs down the strip
void pulseDownStrip1() {

  // Move all current LED states by n number of leds to be updated
  for (int i = NUM_LEDS1 - 1; i >= 0; i--) {
    strip1[i] = strip1[i - numUpdate];
  }

  // Add new LED values to the pulse
  for (int j = 0; j < numUpdate; j++) {
    strip1[j].setRGB(s1R, s1G, s1B);
  }

  FastLED.show();

}

// Pulse a set of black LEDs down the strip
void pulseBlack1(){

  // Move all current LED states by n number of leds to be updated
  for (int i = NUM_LEDS1 - 1; i >= 0; i--) {
    strip1[i] = strip1[i - numUpdate];
  }

  // Add new LED values to the pulse
  for (int j = 0; j < numUpdate; j++) {
    strip1[j].setRGB(0, 0, 0);
  }

  FastLED.show();

}

我正在寻找有关优化此操作的任何建议。通过我的研究,将所需值复制到新数组而不是移动现有数组似乎是更快的操作。

如果您对优化此过程有任何建议,或者对制作相同动画的替代方法有任何建议,请多多帮助。

1 个答案:

答案 0 :(得分:0)

秘密是不要转移它。转移到开始阅读的位置。跟踪保持起始位置的单独变量,并更改数组的读数以从此处开始,在达到数组长度时将其回滚到零,并在起始位置附近停一格。

Google这个术语“圆形缓冲区”请看Arduino HardwareSerial类中的一个不错的实现示例。