我正在编写一个老式的ASCII DOS提示符游戏。说实话,我试图模拟ZZT,以了解这种游戏设计(即使它已经过时)。
我的进展不错,全屏文本模式能够正常工作,我可以创建世界并移动角色,但是我找不到一个合适的定时方法来渲染画面。
我知道我的渲染和预渲染代码很快,因为如果我不添加任何delay()或者(clock()-renderBegin)/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,而是只有18fps。
我想也许我可以尝试将RenderInterval设置为0.0,看看性能是否会提高...但实际上并没有。即使使用RenderInterval为0.0,我最多只能获得18-20fps的帧率。
我认为可能是由于我不断调用所有这些clock()和“除以那个”的方法,导致CPU速度变慢,但当我将渲染和ballLogic调用从if语句的括号中取出并将RenderInterval设置为0.0时,我得到了非常快的渲染速度。
这对我来说没有意义,因为如果我保留if检查,它不应该仍然很慢吗?我的意思是它仍然必须执行所有计算。
顺便说一下,我正在使用Borland的Turbo C++ V1.01编译。
#throwstar seek
). @Parad0x13: 如果你不介意离开DOS,我写了一个库来模拟这种图形风格在任何由SDL支持的平台上:http://libfake437.googlecode.com - Jack Kelly