Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是什么导致每次渲染新颜色之间出现第二次延迟?_C_Linux_Graphics_Sdl 2 - Fatal编程技术网

C 是什么导致每次渲染新颜色之间出现第二次延迟?

C 是什么导致每次渲染新颜色之间出现第二次延迟?,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

所以我试图深入研究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();
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;
}