Vereinfachung der Berechnung

		for (int fwLed = 1; fwLed <= width && (led - fwLed) >= 0; fwLed++) {
			leds[led - fwLed].red = (brightness * red * (width - fwLed) / 255 / width);
		}

Kann man diese Formel weitervereinfachen? Die Werte brightness und red können Werte von 0 - 255 erreichen. width ist variabel.
Das Ergebnis soll dan wie folgt.
(brightness in Prozent) * (red in Prozent) * (width und fwLeds in Prozent)

Vereinfachen zum schneller machen oder vereinfachen zum lesbarer machen?

Na, egal - es steckt auf jeden Fall Vereinfachungspotetial in deiner Berechnung:

  1. Du zählst von 1 bis zu einer errechneten Obergrenze - so muss der µC bei jedem Schleifendurchlauf die Grenze neu berechnen. Herunterzählen spart das ständige neuberechnen:

for (int fwLed = min( width, led ); fwLed > 0; fwLed--) { //... }

Problematisch wird das allerdings, wenn man vorzeichnlosen Variablen bis zu einschließlich 0 hinunterzählen möchte.

In der Schleife berechnest du

brightness * red * (width - fwLed) / 255 / width

Ich glaube, in C heißt das das Gleiche wie

brightness * red * (width - fwLed) / (255 * width)

Etwas Umformen:

= brightness * red * width / (255 * width) - brightness * red * fwLed / (255 * width) = brightness * red / 255 - brightness * red * fwLed / (255*width) = brightness * red / 255 - (brightness * red / 255 ) * (fwLed / width) = (brighness * red / 255) * (1 - fwLed / width)

Mit Ganzzahltypen kann man das so natürlich nicht berechnen - fwLed/width ist eigentlich immer 0 - aber man sieht, dass es sinnvoll sein könnte (brighness * red / 255) einmal vor der schleife zu berechnen.

... redBrightness = (...) brightness * red / 255; for (int fwLed = min( width, led ); fwLed > 0; fwLed--) { ... = redBrightness - (redBrightness * fwLed) / width }

Hierbei mit dem Datentypen aufpassen - er muss die Zwischenergebnisse aufnehmen können, ohne überzulaufen. Das sollte auf jeden Fall etwas schneller laufen - wird aber wohl etwas andere Rundungsergebnisse bringen als deine Version.