4

首先,一些背景故事:

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

由于这是一个自我练习,我努力自己编写大部分代码

最终,我希望游戏可以在任意大的游戏世界上运行。(到了我设想将游戏联网并跨越计算机实验室中的许多显示器的地步)。

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


现在的问题是:

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

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

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

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

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

4

3 回答 3

6

使用 Curses,或者如果您需要自己做,请阅读 VTnnn 控制代码。这两个都应该在 Windows 和 *nix 术语和控制台(和 Windows)上工作。您还可以查阅 nethack 源代码以获取提示。这将使您可以在发生更改的地方更改屏幕上的字符。

于 2009-05-31T17:30:05.840 回答
4

我不会声称自己理解这一点,但我相信这与 James Gosling 的传奇Gosling Emacs重绘代码背后的问题很接近。请参阅他的论文,标题恰当,“A Redisplay Algorithm”,以及一般的字符串到字符串校正问题

于 2009-05-31T17:01:02.630 回答
1

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

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

If you want to experiment with trying to find a way to cut down what you send, then feel free to do that for learning purposes, but we're about 10 years past the point where it is inefficient to update a console display in something approaching real time and it would be a shame to waste time fixing a problem that doesn't need fixing. Note that the PDF linked above gives an O(ND) solution whereas simply sending the entire console is half of O(N), where N is defined as the sum of the lengths of A and B and D.

于 2009-06-01T09:33:23.390 回答