gpt4 book ai didi

c++ - ASCII DOS 游戏 - 渲染方法

转载 作者:可可西里 更新时间:2023-11-01 16:41:38 27 4
gpt4 key购买 nike

我正在编写一个老式的 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。

我虽然可能因为我不断调用所有这些 clock() 和“除以那个”方法,我正在减慢 CPU 的速度,但当我从 if 语句的括号中取出渲染和 ballLogic 调用时,将 RenderInterval 设置为 0.0,我再次得到极快的渲染。

这对我来说没有意义,因为如果我离开 if checkin ,它不应该运行得同样慢吗?我的意思是它仍然需要做所有的计算

顺便说一句,我正在使用 Borland 的 Turbo C++ V1.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));
}

关于c++ - ASCII DOS 游戏 - 渲染方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3309006/

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