首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASCII DOS游戏渲染方法

ASCII DOS游戏渲染方法
EN

Stack Overflow用户
提问于 2010-07-22 20:54:03
回答 5查看 960关注 0票数 9

我正在写一个老式的ASCII DOS提示游戏。老实说,我正在尝试效仿ZZT来学习更多关于这个品牌的游戏设计(即使它已经过时了)。

我做得很好,让我的全屏文本模式工作,我可以创建世界和移动没有问题,但我找不到一个像样的时间方法来渲染。

我知道我的渲染和预渲染代码很快,因为如果我不添加任何-renderBegin()s或(clock()/CLK_TCK) time.h的延迟检查,渲染就会非常快。

我不想使用delay(),因为它是特定于我的知识平台的,最重要的是,我不能在它延迟的时候运行任何代码(比如用户输入和处理)。所以我决定这样做:

代码语言:javascript
复制
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编译

EN

回答 5

Stack Overflow用户

发布于 2010-09-05 19:26:01

最佳的游戏体验通常是通过与显示器的垂直回溯同步来实现的。除了提供计时功能外,这还将使游戏在屏幕上运行更加流畅,至少当您将CRT显示器连接到电脑上时是这样的。

在80x25文本模式下,垂直回溯(在VGA上)每秒发生70次。我不记得EGA/CGA的频率是否相同,但我非常确定在Hercules和MDA上的频率是50 Hz。例如,通过测量20帧的持续时间,您应该对您正在处理的频率有一个足够好的估计。

假设主循环是这样的:

代码语言:javascript
复制
  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));
  }
票数 2
EN

Stack Overflow用户

发布于 2010-07-22 21:13:35

代码语言:javascript
复制
clock()-renderTimer > RenderInterval * CLOCKS_PER_SEC

计算速度会快一点,如果你预先计算RenderInterval * CLOCKS_PER_SEC部分,可能会更快。

票数 1
EN

Stack Overflow用户

发布于 2010-07-24 19:30:03

我弄明白了为什么它不能立即渲染,我创建的计时器很好,问题是实际的clock_t只能精确到.054547XXX,所以我只能以18fps的速度渲染。我解决这个问题的方法是使用一个更精确的时钟...这是一个完全不同的故事

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3309006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档