如何以最优方式移动大型阵列 n 发生次数

Posted

技术标签:

【中文标题】如何以最优方式移动大型阵列 n 发生次数【英文标题】:How to Optimally Shift Large Arrays n Number of Incidences 【发布时间】:2019-07-13 14:40:09 【问题描述】:

我正在创建自己版本的音乐可视化工具,它可以响应音乐的频率;一个共同的项目。我使用 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】:

秘诀是不要改变它。转移你开始阅读它的地方。跟踪一个单独的变量,该变量保持起始位置并改变您对数组的读取以从那里开始,当它到达数组长度时回滚到零,并在距离开始的地方停止。

Google 术语“循环缓冲区”查看 Arduino HardwareSerial 类以获得一个体面的实现示例。

【讨论】:

以上是关于如何以最优方式移动大型阵列 n 发生次数的主要内容,如果未能解决你的问题,请参考以下文章

在高维空间中以最优方式计算成本

如何使用parted对齐分区以得到最优性能

移动APP的常见的几种导航形式

如何以最有效的方式将两个未排序的数组合并成一个排序的数组?

P1031 均分纸牌(思维)

洛谷P4136 谁能赢呢?