代码之家  ›  专栏  ›  技术社区  ›  Ape-inago

帮助算法动态更新文本显示

  •  4
  • Ape-inago  · 技术社区  · 16 年前

    首先,一些背景:

    我正在做一个 roguelike “游戏是为了让我能运用一些有趣的想法,这些想法在我的脑海中漂浮。游戏将不会是一个地牢爬行,但无论如何,显示将在一个类似的方式,简单的ASCII字符。

    既然这是一种自我锻炼, 我努力自己编写大部分代码 .

    最后,我想让游戏在任意大的游戏世界中运行。(到了我想象的程度,游戏联网,在计算机实验室中跨越许多监视器)。

    现在,我有一些代码可以读写到文本控制台的任意部分,并建立了一个简单的分区系统,这样我就可以有效地找到路径。


    现在的问题是:

    我已经运行了一些基准测试,最大的瓶颈是重新绘制文本控制台。

    拥有如此庞大的游戏世界需要智能更新显示器。我不想在每一帧中都重复推我的整个游戏缓冲区… 我需要一些关于如何设置它的指针,以便它只绘制游戏的部分已经更新。 (不仅仅是我现在看到的人物)

    我一直在通过windows.h操作windows控制台,但我也有兴趣让它在连接到服务器的Putty客户机上运行在Linux机器上。

    我试过调整一些视频处理程序,因为像素和字符的比例接近1:1,但我运气不好。

    我真的想要一个简单的解释它背后的一些原则。但是一些示例(psudo)代码也不错。

    3 回复  |  直到 16 年前
        1
  •  4
  •   Matthew Flaschen    16 年前

    我不会声称理解这一点,但我相信这与詹姆斯·戈斯林的传奇故事背后的问题很接近。 Gosling Emacs 重新绘制代码。参见他的论文,题目适当,“一个重新显示算法”,以及 string-to-string correction problem .

        2
  •  6
  •   MkV    16 年前

    使用诅咒,或者如果你需要自己动手,请阅读vtnn控制代码。这两种方法都适用于Windows和*nix术语和控制台(以及Windows)。您还可以参考nethack源代码获取提示。这将允许您在发生更改的地方更改屏幕上的字符。

        3
  •  1
  •   Kylotan    16 年前

    有这么大的意志力 需要智能更新 显示。我不想非得这么做 每一次重新推送整个游戏缓冲区 框架…我需要一些关于如何 将其设置为只绘制 游戏的各个部分 更新。(不仅仅是个人 我现在的角色)

    游戏世界的大小并不真正相关,因为您所需要做的只是为每个客户端计算出可见区域并发送数据。如果你有一个典型的80x25控制台显示,那么你每次只发送2或3千字节的数据,即使你添加了色码等。这是大多数这种性质的在线游戏的典型特征:更新人们所能看到的,而不是世界上所有的东西。

    如果你想尝试找到一种方法来减少你发送的内容,那么为了学习的目的,你可以自由地这样做,但是我们已经过了10年,在接近实时的情况下更新一个控制台显示是低效的,浪费时间来修复一个不需要修复的问题是很遗憾的。请注意,上面链接的PDF提供了一个O(n d)解决方案,而简单地发送整个控制台是O(n)的一半,其中n定义为A、B和D的长度之和。