专栏文章

开放大世界

科技·工程参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mio8zrei
此快照首次捕获于
2025/12/02 15:19
3 个月前
此快照最后确认于
2025/12/02 15:19
3 个月前
查看原文
众所周知,在学专业级的c++之前,oiers自制的游戏一般都是用一个char类型的数组实现地图的存放、修改、展示。这可以说是最简单直接的方式了
.
但是,这种方式有一个缺点:大小不够大(至少算不上开放大世界),例如我们开一个1w × 1w的数组,DEV C++ BOMB 了,所以我就一直在想如何突破这个限制,制作真正的开放大世界。
.
-----------------------不怎么华丽的分界线----------------------
.

"实现"

某一次我打开MC开始玩,在开启刷沙机后顺手(其实不做就无法运行)做了个区块强制加载器。然后突发奇想!
我们的游戏地图可不可以分区块?
.
.
.
具体实现是这样的,定义两个二维数组,为了方便称呼,一下一个数组叫A,一个数组叫B。A数组存的每一个格子表示一个区块,数组A可以存放区块的状态。B数组用来显示,也就是玩家看到的。这样子就可以大大节省内存空间。我们来简单计 亿 一下:
.
若A、B数组均为5000×5000int类型的数组,那么它们所占空间为:
5000×5000×4×2= 200000000 B≈195313 KB≈191 MB
.
(为什么要乘4? 因为int类型站4个字节)
.
.
我们再来算一下传统算法(应该也不算是算法)的空间需求:
与上述方法等同大小的传统地图应该是 (5000×5000) ×(5000×5000) 的大小
.
也就是25000000×25000000的大小,
.
所占空间为:25000000 × 25000000 × 4 = 2.5e14 B ≈ 2.44140625e12 KB ≈ 2384185791 MB ≈ 2328306 GB ≈ 2274 TB
.

也就是说,这个算法(可能也不算算法)用191MB的空间干了本来应该要2k+ TB 干的事

-----------------------不怎么华丽的分界线---------------------------------

缺点

知周所众众所周知,凡事没有完美。该算法(可能也不算算法)也如此。
.
.
它的缺点是什么呢?
.
首先,它比传统的方式更加复杂。程序变得复杂,增加oiers找bug的难度,
其次,对于地图的修改极其麻烦,目前我使用的方法时用结构体(struct)&队列(queue) 存储方式为:({区块中的x坐标,区块中的y坐标,区块自身的x坐标,区块自身的y坐标,建筑类型...})
具体实现方式:先获取队列长度size,再循环size次,每次把队首元素取出,如果该元素是该区块的,就更新上述B数组,再把元素重新塞回去;如果不是,就同上,但是不更新B数组。
.
但是,这又有问题。随着游戏的进行,队列里的元素数量暴增,会降低运行速度,影响游戏体验(谁会愿意玩游戏还像在看PPT呢?),而且,极端情况下,就是塞了超级多元素,队列也会爆掉。
.
上述问题也是可以解决的。如:开多几个队列。然后各个队列分别存几个几个区块。
.
什么!你问我为什么不用动态数组!?
.
总之,存储方式还需要改进,不过这种比传统算法(可能也不算算法)大几十甚至几百几千倍的东西,谁看了不心动?这种算法(可能也不算算法)只能作为对于传统算法(可能也不算算法)的补充。不知这个算法(可能也不算算法)经过dalao们的创作会出现什么有意思的游戏呢?
----------------------------------不怎么华丽的分界线---------------------------------

应用

对于这个算法(可能也不算算法),我暂时只运用于那种模拟治理国家的游戏,详见这里
还希望本篇对于各位 喜欢摸鱼的 oier们有帮助

评论

0 条评论,欢迎与作者交流。

正在加载评论...