C 是什么导致每次渲染新颜色之间出现第二次延迟?
所以我试图深入研究SDL2。到目前为止,我已经构建了以下简单的程序。它所做的只是在屏幕上渲染一个矩形,并让它快速改变颜色 game.hC 是什么导致每次渲染新颜色之间出现第二次延迟?,c,linux,graphics,sdl-2,C,Linux,Graphics,Sdl 2,所以我试图深入研究SDL2。到目前为止,我已经构建了以下简单的程序。它所做的只是在屏幕上渲染一个矩形,并让它快速改变颜色 game.h #include<SDL2/SDL.h> #include<stdbool.h> typedef struct Game { bool finished; SDL_Event curevent; SDL_Window* mainwin; SDL_Renderer* mainren; }Game; Game *initGame(); vo
#include<SDL2/SDL.h>
#include<stdbool.h>
typedef struct Game {
bool finished;
SDL_Event curevent;
SDL_Window* mainwin;
SDL_Renderer* mainren;
}Game;
Game *initGame();
void destoryGame(Game*);
void drawRect(Game*);
void handleEvents(Game*);
我使用的是Linux系统。Ubuntu 16.04。我的编辑是:
SRC_FILES = ./src/main.c ./src/game.c
CC_FLAGS = -Wall -Wextra -Os -g -lSDL2 -std=gnu11
CC = gcc
all:
${CC} ${SRC_FILES} -o game ${CC_FLAGS}
这个程序编译和运行没有问题。输出如下所示:
我想知道为什么每种新颜色之间都有一秒的延迟
直觉告诉我,每次循环迭代时都会有一种新的颜色。这应该是每秒数百次。也许看起来像这样:
是什么导致了这次延误?或者我对代码的理解有误,并且代码的运行方式完全符合要求?伪随机数生成器通过对前面的值进行计算,生成一个可预测的数字序列 举个简单的例子:
int lastValue;
int rand(void) {
lastValue = (lastValue * 13) / 7;
return lastValue;
}
当然,rand()
的真正实现更为复杂
如果没有先前的数字,则必须使用默认值,如果默认值始终相同(例如,启动程序时始终为零),则所有程序都会生成完全相同的序列
要解决此问题,您可以设置“初始上一个编号”或种子编号。这就是srand()
的用途
现在
每次绘制矩形时都使用srand()
,并从当前时间获取种子值。如果当前时间不变,则种子相同,因此数字序列与上次相同
当前时间每秒更改一次。伪随机数生成器通过对以前的值进行计算,生成一个可预测的数字序列 举个简单的例子:
int lastValue;
int rand(void) {
lastValue = (lastValue * 13) / 7;
return lastValue;
}
当然,rand()
的真正实现更为复杂
如果没有先前的数字,则必须使用默认值,如果默认值始终相同(例如,启动程序时始终为零),则所有程序都会生成完全相同的序列
要解决此问题,您可以设置“初始上一个编号”或种子编号。这就是srand()
的用途
现在
每次绘制矩形时都使用srand()
,并从当前时间获取种子值。如果当前时间不变,则种子相同,因此数字序列与上次相同
当前时间每秒更改一次。您正在通过调用drawRect中的
srand()
重新设定随机数生成器的种子。您正在将time()
的返回值作为新种子提供,该值仅每秒更改一次,因为它报告了自历元开始以来的时间(以秒为单位)。然后调用rand()
获取矩形颜色的随机RGB值
因为您正在使用返回值time()
重新播种RNG,所以即使主函数经常调用drawRect()
,您也只能大约每秒看到一个新的随机颜色。您可能认为,rand()
仍然应该给您一个不同的“随机”值,但这不是大多数RNG的工作方式。其中许多为给定的种子值提供可预测的数字序列,因此术语“伪随机数生成器”。这实际上在可测试性方面有好处
如果您取消了对
srand()
的调用,或将其移出drawRect()
(最好是在主游戏循环之外),您应该会更频繁地看到颜色的变化。在drawRect中调用srand()
,您正在重新播种随机数生成器。您正在将time()
的返回值作为新种子提供,该值仅每秒更改一次,因为它报告了自历元开始以来的时间(以秒为单位)。然后调用rand()
获取矩形颜色的随机RGB值
因为您正在使用返回值time()
重新播种RNG,所以即使主函数经常调用drawRect()
,您也只能大约每秒看到一个新的随机颜色。您可能认为,rand()
仍然应该给您一个不同的“随机”值,但这不是大多数RNG的工作方式。其中许多为给定的种子值提供可预测的数字序列,因此术语“伪随机数生成器”。这实际上在可测试性方面有好处
如果您取消了对
srand()
的调用,或者将其移出drawRect()
(最好是在主游戏循环之外),您应该会更频繁地看到颜色的变化。Wow。谢谢你们两位把这件事弄明白并解释给我听。这让人大开眼界。哇。谢谢你们两位把这件事弄明白并解释给我听。这让人大开眼界。哇。谢谢你们两位把这件事弄明白并解释给我听。这让人大开眼界。下面是一些C语言常见问题解答的进一步解释。谢谢你们两位把这件事弄明白并解释给我听。这让人大开眼界。下面是C语言常见问题解答中的一些进一步解释:函数:srand()
在整个程序执行过程中只能调用一次,而不是每次都需要一些随机数。建议将对srand()
的调用移动到函数中的第一个代码行:main()
函数:srand()
在整个程序执行过程中只能调用一次,而不是每次需要一些随机数时。建议将对srand()
的调用移动到函数中的第一个代码行:main()
int lastValue;
int rand(void) {
lastValue = (lastValue * 13) / 7;
return lastValue;
}