gpt4 book ai didi

c - 如何减少 NCurses C 应用程序中的输入延迟

转载 作者:行者123 更新时间:2023-11-30 17:02:12 24 4
gpt4 key购买 nike

当我运行应用程序时,我遇到了大量的输入延迟。

更多详情:当我按“w”、“a”、“s”、“d”(我指定的输入键)时,对象会移动,但在释放按键后它会继续移动很长一段时间。源代码如下,但是为了缩短问题,已经删除了一小部分代码,但是如果下面的源代码无法编译,我会将所有代码放在 github 上。 https://github.com/TreeStain/DodgeLinuxGame.git感谢您的时间。 -特里斯坦

闪避.c:

#define ASPECT_RATIO_X 2
#define ASPECT_RATIO_Y 1
#define FRAMES_PER_SECOND 60

#include <ncurses.h>
#include "object.h"
#include "render.h"

int main()
{
initscr();
cbreak();
noecho();
nodelay(stdscr, 1);

object objs[1];

object colObj; colObj.x = 10; colObj.y = 6;
colObj.w = 2; colObj.h = 2;
colObj.sprite = '*';
colObj.ySpeed = 1;
colObj.xSpeed = 1;

objs[0] = colObj;

//halfdelay(1);

while (1)
{
char in = getch();
if (in == 'w')
objs[0].y -= objs[0].ySpeed * ASPECT_RATIO_Y;
if (in == 's')
objs[0].y += objs[0].ySpeed * ASPECT_RATIO_Y;
if (in == 'a')
objs[0].x -= objs[0].xSpeed * ASPECT_RATIO_X;
if (in == 'd')
objs[0].x += objs[0].xSpeed * ASPECT_RATIO_X;
render(objs, 1);
napms(FRAMES_PER_SECOND);
}

getch();

endwin();
return 0;
}

渲染.h:

void render(object obj[], int objectNum);

void render(object obj[], int objectNum) //Takes array of objects and prints them to screen
{
int x, y, i, scrWidth, scrHeight;
getmaxyx(stdscr, scrHeight, scrWidth); //Get terminal height and width

for (y = 0; y < scrHeight; y++)
{
for (x = 0; x < scrWidth; x++)
{
mvprintw(y, x, " ");
}
}

for (i = 0; i < objectNum; i++)
{
int xprint = 0, yprint = 0;
for (yprint = obj[i].y; yprint < obj[i].y + (obj[i].h * ASPECT_RATIO_Y); yprint++)
{
for (xprint = obj[i].x; xprint < obj[i].x + (obj[i].w * ASPECT_RATIO_X); xprint++)
mvprintw(yprint, xprint, "%c", obj[i].sprite);
}
}
refresh();
}

对象.h:

typedef struct
{
int x, y, w, h, ySpeed, xSpeed;
char sprite;
}object;

附注请随意批评我的方法和代码,因为我在编程方面还很陌生,并且可以接受所有我能得到的批评。

最佳答案

我相信原因是因为 getch() 一次只会释放一个输入字符(即使输入流中有很多排队的字符),所以如果它们排队的速度比您从流中“删除”它们的速度快,即使释放按键后,循环仍将继续,直到队列被清空。另外,您需要 (1000/FRAMES_PER_SECOND) 来获得所需的延迟时间(以毫秒为单位)(这会产生每秒 60 帧)。

在 while 循环中试试这个。

while (1)
{
char in;
/* We are ready for a new frame. Keep calling getch() until we hear a keypress */
while( (in = getch()) == ERR) {}

if (in == 'w')
objs[0].y -= objs[0].ySpeed * ASPECT_RATIO_Y;
if (in == 's')
objs[0].y += objs[0].ySpeed * ASPECT_RATIO_Y;
if (in == 'a')
objs[0].x -= objs[0].xSpeed * ASPECT_RATIO_X;
if (in == 'd')
objs[0].x += objs[0].xSpeed * ASPECT_RATIO_X;
render(objs, 1);

/* Clear out any other characters that have been buffered */
while(getch() != ERR) {}

napms(1000 / FRAMES_PER_SECOND);
}

从循环顶部开始: while( (in = getch()) == ERR) {} 将快速调用 getch() ,直到检测到按键。如果未检测到按键,getch() 将返回 ERR。while(getch() != ERR) {} 所做的是不断调用 getch() ,直到所有缓冲的输入字符都从队列中删除,然后 getch() 返回 ERR 并继续。然后循环应该休眠约 17 毫秒并重复。这些行应该强制循环每约 17 毫秒仅“计数”一次按键,并且不会超过此频率。

参见:http://linux.die.net/man/3/getch

关于c - 如何减少 NCurses C 应用程序中的输入延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36673255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com