如何删除浮点数或减少代码函数的实际文件大小? (阿杜伊诺)
How to remove floats or reduce actual file size of code function? (Arduino)
我正在尝试使用 neopixels 为 gemma 获取我的 arduino 代码,它有 5310 字节的内存更小,所以我可以在程序中加入更多东西。
目前我正在尝试删除浮点数/减小下面代码片段的大小:
void gradient(Color c1, Color c2, float time) {
for (float i = 0; i < time; i += 0.001) {
Color result(0, 0, 0);
result.Red = c1.Red * (1 - (i / time)) + c2.Red * (i / time);
result.Green = c1.Green * (1 - (i / time)) + c2.Green * (i / time);
result.Blue = c1.Blue * (1 - (i / time)) + c2.Blue * (i / time);
for (uint8_t x = 0; x < 20; x++)pixels.setPixelColor(x, result.Red, result.Green, result.Blue);
pixels.show();
delay(1);
}
}
我设法将其减少了 30 个字节:
void gradient(Color c1, Color c2, float time) {
float stepsize = 0.01; // Stepsize in seconds
float lambda;
int maxiter = (int) (time/ stepsize);
Color result(0, 0, 0);
for (int i = 0; i <= maxiter; i++) {
lambda = (float) i / maxiter;
result.Red = c1.Red * (1 - lambda) + c2.Red * (lambda);
result.Green = c1.Green * (1 - lambda) + c2.Green * (lambda);
result.Blue = c1.Blue * (1 - lambda) + c2.Blue * (lambda);
for (uint8_t x = 0; x < 20; x++)pixels.setPixelColor(x, result.Red, result.Green, result.Blue);
pixels.show();
delay(stepsize * 1000); // delay in milliseconds
}
}
但我仍在努力让它变小。
对于那些想知道 Color 对象只是一个具有 3 个整数的对象,分别称为 Red、Green 和 Blue。此代码的示例用法为:
gradient(Color(255, 0, 0), Color(0, 255, 0), 2);
这将是 2 秒内从红色到绿色的渐变。
提前致谢!
-首先,您的颜色对象应该采用 3 个无符号字符 (0-255),没有理由在其中放置整数。 (arduino 中的字节类型)
-其次,我不确定你是如何实现时间的,但通常在 arduino 中你是以毫秒为单位工作的。此外,在没有看到您的其他实现的情况下,我猜 time 是一段时间并且根据您的延迟,我猜您可以将时间发送为短时间(向上乘 x1000 如有必要)(这最多可以保持 32 秒,以毫秒为单位)
void gradient(Color c1, Color c2, short time) {
short maxiter = (short) (time/ 10);
Color result(0, 0, 0);
for (int i = 0; i <= maxiter; i++) {
result.Red = (c1.Red * (maxiter-i) + c2.Red * i)/maxiter;
result.Green = (c1.Green* (maxiter-i) + c2.Green* i)/maxiter;
result.Blue = (c1.Blue* (maxiter-i) + c2.Blue* i)/maxiter;
for (uint8_t x = 0; x < 20; x++)pixels.setPixelColor(x, result.Red, result.Green, result.Blue);
pixels.show();
delay(10); // delay in milliseconds
}
}
如果您可以从所有代码中提取 "delay()",似乎可以避免包含 100 字节大小的库? idk tbh,但这是我建议的修改,在我的测试中它节省了 100 字节的内存:
void gradient(Color c1, Color c2, float time) {
float stepsize = 0.01; // Stepsize in seconds
float lambda;
int maxiter = (int) (time/ stepsize);
Color result(0, 0, 0);
for (int i = 0; i <= maxiter; i++) {
lambda = (float) i / maxiter;
result.Red = c1.Red * (1 - lambda) + c2.Red * (lambda);
result.Green = c1.Green * (1 - lambda) + c2.Green * (lambda);
result.Blue = c1.Blue * (1 - lambda) + c2.Blue * (lambda);
for (uint8_t x = 0; x < 20; x++)pixels.setPixelColor(x, result.Red, result.Green, result.Blue);
pixels.show();
//delay(stepsize * 1000); // delay in milliseconds
long lastTime=millis();
long delayTime = stepsize * 1000;
while(millis()-lastTime<delayTime){}
}
}
我正在尝试使用 neopixels 为 gemma 获取我的 arduino 代码,它有 5310 字节的内存更小,所以我可以在程序中加入更多东西。
目前我正在尝试删除浮点数/减小下面代码片段的大小:
void gradient(Color c1, Color c2, float time) {
for (float i = 0; i < time; i += 0.001) {
Color result(0, 0, 0);
result.Red = c1.Red * (1 - (i / time)) + c2.Red * (i / time);
result.Green = c1.Green * (1 - (i / time)) + c2.Green * (i / time);
result.Blue = c1.Blue * (1 - (i / time)) + c2.Blue * (i / time);
for (uint8_t x = 0; x < 20; x++)pixels.setPixelColor(x, result.Red, result.Green, result.Blue);
pixels.show();
delay(1);
}
}
我设法将其减少了 30 个字节:
void gradient(Color c1, Color c2, float time) {
float stepsize = 0.01; // Stepsize in seconds
float lambda;
int maxiter = (int) (time/ stepsize);
Color result(0, 0, 0);
for (int i = 0; i <= maxiter; i++) {
lambda = (float) i / maxiter;
result.Red = c1.Red * (1 - lambda) + c2.Red * (lambda);
result.Green = c1.Green * (1 - lambda) + c2.Green * (lambda);
result.Blue = c1.Blue * (1 - lambda) + c2.Blue * (lambda);
for (uint8_t x = 0; x < 20; x++)pixels.setPixelColor(x, result.Red, result.Green, result.Blue);
pixels.show();
delay(stepsize * 1000); // delay in milliseconds
}
}
但我仍在努力让它变小。
对于那些想知道 Color 对象只是一个具有 3 个整数的对象,分别称为 Red、Green 和 Blue。此代码的示例用法为:
gradient(Color(255, 0, 0), Color(0, 255, 0), 2);
这将是 2 秒内从红色到绿色的渐变。
提前致谢!
-首先,您的颜色对象应该采用 3 个无符号字符 (0-255),没有理由在其中放置整数。 (arduino 中的字节类型)
-其次,我不确定你是如何实现时间的,但通常在 arduino 中你是以毫秒为单位工作的。此外,在没有看到您的其他实现的情况下,我猜 time 是一段时间并且根据您的延迟,我猜您可以将时间发送为短时间(向上乘 x1000 如有必要)(这最多可以保持 32 秒,以毫秒为单位)
void gradient(Color c1, Color c2, short time) {
short maxiter = (short) (time/ 10);
Color result(0, 0, 0);
for (int i = 0; i <= maxiter; i++) {
result.Red = (c1.Red * (maxiter-i) + c2.Red * i)/maxiter;
result.Green = (c1.Green* (maxiter-i) + c2.Green* i)/maxiter;
result.Blue = (c1.Blue* (maxiter-i) + c2.Blue* i)/maxiter;
for (uint8_t x = 0; x < 20; x++)pixels.setPixelColor(x, result.Red, result.Green, result.Blue);
pixels.show();
delay(10); // delay in milliseconds
}
}
如果您可以从所有代码中提取 "delay()",似乎可以避免包含 100 字节大小的库? idk tbh,但这是我建议的修改,在我的测试中它节省了 100 字节的内存:
void gradient(Color c1, Color c2, float time) {
float stepsize = 0.01; // Stepsize in seconds
float lambda;
int maxiter = (int) (time/ stepsize);
Color result(0, 0, 0);
for (int i = 0; i <= maxiter; i++) {
lambda = (float) i / maxiter;
result.Red = c1.Red * (1 - lambda) + c2.Red * (lambda);
result.Green = c1.Green * (1 - lambda) + c2.Green * (lambda);
result.Blue = c1.Blue * (1 - lambda) + c2.Blue * (lambda);
for (uint8_t x = 0; x < 20; x++)pixels.setPixelColor(x, result.Red, result.Green, result.Blue);
pixels.show();
//delay(stepsize * 1000); // delay in milliseconds
long lastTime=millis();
long delayTime = stepsize * 1000;
while(millis()-lastTime<delayTime){}
}
}