我正在写一个老式的ASCII DOS提示游戏。老实说,我正在尝试效仿ZZT来学习更多关于这个品牌的游戏设计(即使它已经过时了)。
我做得很好,让我的全屏文本模式工作,我可以创建世界和移动没有问题,但我找不到一个像样的时间方法来渲染。
我知道我的渲染和预渲染代码很快,因为如果我不添加任何-renderBegin()s或(clock()/CLK_TCK) time.h的延迟检查,渲染就会非常快。
我不想使用delay(),因为它是特定于我的知识平台的,最重要的是,我不能在它延迟的时候运行任何代码(比如用户输入和处理)。所以我决定这样做:
do {
if(kbhit()) {
input = getch();
processInput(input);
}
if(clock()/CLOCKS_PER_SEC-renderTimer/CLOCKS_PER_SEC > RenderInterval) {
renderTimer = clock();
render();
ballLogic();
}
}while(input != 'p');这在“理论”上应该可以很好地工作。问题是,当我运行这段代码(将RenderInterval设置为0.0333或30fps)时,我得不到30fps,我得到的最大值是18。
我想也许我可以尝试将RenderInterval设置为0.0,看看性能是否会提高……事实并非如此。我( RenderInterval为0.0)达到了最高18-20fps。
我想也许是因为我不断地调用所有这些时钟()和“除以那个”方法,所以降低了CPU的速度,但是当我从if语句的括号中取出render和ballLogic调用,并将RenderInterval设置为0.0时,我再次获得了惊人的渲染速度。
这对我来说没有意义,因为如果我离开了if check in,它不是应该运行得同样慢吗?我的意思是它仍然需要做所有的计算
顺便说一句,我正在用Borland的Turbo C++ V1.01编译
发布于 2010-09-05 19:26:01
最佳的游戏体验通常是通过与显示器的垂直回溯同步来实现的。除了提供计时功能外,这还将使游戏在屏幕上运行更加流畅,至少当您将CRT显示器连接到电脑上时是这样的。
在80x25文本模式下,垂直回溯(在VGA上)每秒发生70次。我不记得EGA/CGA的频率是否相同,但我非常确定在Hercules和MDA上的频率是50 Hz。例如,通过测量20帧的持续时间,您应该对您正在处理的频率有一个足够好的估计。
假设主循环是这样的:
while (playing) {
do whatever needs to be done for this particular frame
VSync();
}
... /* snip */
/* Wait for vertical retrace */
void VSync() {
while((inp(0x3DA) & 0x08));
while(!(inp(0x3DA) & 0x08));
}发布于 2010-07-22 21:13:35
clock()-renderTimer > RenderInterval * CLOCKS_PER_SEC计算速度会快一点,如果你预先计算RenderInterval * CLOCKS_PER_SEC部分,可能会更快。
发布于 2010-07-24 19:30:03
我弄明白了为什么它不能立即渲染,我创建的计时器很好,问题是实际的clock_t只能精确到.054547XXX,所以我只能以18fps的速度渲染。我解决这个问题的方法是使用一个更精确的时钟...这是一个完全不同的故事
https://stackoverflow.com/questions/3309006
复制相似问题