【发布时间】:2011-03-19 13:12:18
【问题描述】:
我正在编写一个老式的 ASCII DOS 提示游戏。老实说,我正在努力模仿 ZZT 来了解更多关于这个品牌的游戏设计(即使它已经过时了)
我做得很好,我的全屏文本模式可以工作,我可以毫无问题地创建世界和四处移动,但我找不到合适的渲染计时方法。
我知道我的渲染和预渲染代码很快,因为如果我不添加任何 delay()s 或 (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 的任何地方,我得到的最大速度更像是 18。
我想也许我会尝试将 RenderInterval 设置为 0.0 以查看性能是否有所提升……但没有。我(RenderInterval 为 0.0)达到最高 ~18-20fps。
虽然我可能是因为我不断调用所有这些时钟()和“除以那个”方法,我正在减慢 CPU 速度,但当我从 if 语句的括号中取出渲染和 ballLogic 调用时将 RenderInterval 设置为 0.0 我再次获得了超快的渲染速度。
这对我来说没有意义,因为如果我离开 if 签入,它不应该运行同样慢吗?我的意思是它仍然需要做所有的计算
顺便说一句,我正在使用 Borland 的 Turbo C++ V1.01 进行编译
【问题讨论】:
-
你和我,咖啡馆。 (
#throwstar seek)。 @Parad0x13:如果您不介意离开 DOS,我编写了一个库来在 SDL 支持的任何平台上模拟这种图形样式:libfake437.googlecode.com -
如果你存储'clock()'的结果并分配存储的值,你将保存对它的调用(最快的代码是你不调用的代码),它将是更准确(否则你会失去你第一次调用'clock()'之间的时间,做所有的数学和处理分支)。即使您不再最大限度地使用 CPU,这种准确性的损失也会使游戏运行速度比您想要的慢。 (编辑:哈哈,刚刚看到这个日期,哦)
标签: c++ ascii render dos turbo-c++