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

时间:2009-05-31 16:55:25

标签: c++ perl console-application ascii-art

首先,一些背景故事:

我正在制作一个可能相当于“roguelike”游戏的东西,这样我就可以夸大一些有趣的想法,我已经浮现在脑海中。游戏玩法不会成为地下城爬行,但无论如何,显示器将以类似的方式完成,并带有简单的ascii字符。

由于这是一种自我锻炼,我努力自己编写大部分代码

最终我想让游戏在任意大型游戏世界中运行。 (到了我预计游戏网络化并跨越计算机实验室中的许多监视器的程度)。

现在,我已经有了一些可以读写文本控制台任意部分的代码,并设置了一个简单的分区系统,以便我可以有效地进行路径查找。


现在的问题是:

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

拥有大型游戏世界需要智能更新显示屏。我不想每帧都重新推送我的整个游戏缓冲区... 我需要一些关于如何设置它的指针,以便它只绘制已经更新的游戏部分。(而不仅仅是我现在拥有的个人角色)

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

我尝试过调整一些视频处理程序,因为像素和角色之间的比例几乎是1:1,但我没有运气。

我真的想简单解释其背后的一些原则。但是一些示例(psudo)代码也会很好。

3 个答案:

答案 0 :(得分:6)

使用Curses,或者如果您需要自己动手,请阅读有关VTnnn控制代码的信息。这两个应该适用于Windows和* nix术语和控制台(和Windows)。您还可以查阅nethack源代码以获取提示。这样您就可以在屏幕上更改已发生更改的字符。

答案 1 :(得分:4)

我不会声称理解这一点,但我相信这与James Gosling的传奇Gosling Emacs重绘代码背后的问题非常接近。请参阅他的论文,标题为“重新显示算法”,以及一般string-to-string correction problem

答案 2 :(得分:1)

  

拥有一个庞大的游戏世界   需要智能更新   显示。我不想要   每次重新推动我的整个游戏缓冲区   框架...我需要一些指示如何   设置它以便它只绘制   游戏的各个部分都有过   更新。 (而不仅仅是个人   我现在有的角色)

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

如果您想尝试寻找降低发送内容的方法,那么可以随意为学习目的而努力,但是我们距离更新控制台显示效率低了大约10年在接近实时的事情中,浪费时间来解决不需要修复的问题将是一种耻辱。请注意,上面链接的PDF提供O(ND)解决方案,而简单地发送整个控制台是O(N)的一半,其中N被定义为A和B以及D的长度之和。