游戏中的随机地图是如何保存的?U8国际 U8国际官方网站 体育APP下载
栏目:U8体育 发布时间:2026-01-16
  u8,u8国际,u8国际官方网站,u8国际网站,u8国际网址,u8国际链接,u8体育,u8体育官网,u8体育网址,u8注册,u8体育网址,u8官方网站,u8体育APP,u8体育登录,u8体育入口   单机游戏,新建游戏的时候地图是根据随机种子生成的,柏林噪声处理生成具体地貌,然后在加具体装饰物(如树木等),场景加载完毕。请问一下,保

  u8,u8国际,u8国际官方网站,u8国际网站,u8国际网址,u8国际链接,u8体育,u8体育官网,u8体育网址,u8注册,u8体育网址,u8官方网站,u8体育APP,u8体育登录,u8体育入口

游戏中的随机地图是如何保存的?U8国际 U8国际官方网站 U8体育APP下载

  单机游戏,新建游戏的时候地图是根据随机种子生成的,柏林噪声处理生成具体地貌,然后在加具体装饰物(如树木等),场景加载完毕。请问一下,保存与加载的时候如…

  你有在电影特效或游戏中,见过连绵起伏的群山吗? 有没有想过这种特效如何制作? 其实非常简单,只要使用”柏林噪声“,一切化繁为简,非常神奇。

  谢邀。通常我们用来程序化生成的地图都会使用随机种子。通过随机种子来跳到一个数列的某个位置(比如Rand()的实现)。如果这个随机函数满足平立、可复制性、内存占用低的话,一般就可以用来生成地形。通过随机种子的嵌套,我们就可以用一个种子来生成整个地形,地貌用噪声函数来生成。

  很多随机函数会有一个热身阶段。在刚开始生成随机数的时候会先生成几个不那么“随机”的数字。

  数列的长度。比如Rand()的范围只有0~RAND_MAX(RAND_MAX根据平台不同大小也不同,但最少是32767),可能用不了多久,就会碰到和之前重复的数字。

  几乎不支持随机访问。假设我们当前处于数列的第10个数字,如果要获取数列第1000个数字,我们只能调用990次随机函数,显然效率太低了;更糟的是,如果此时我们想获取之前的数字,比如第3个,就跪了。

  噪声函数本质上是个哈希函数。当把随机种子加入到一个哈希值的生成过程中时,就可以利用随机种子来生成不同的数列。如果我们用自然数作为输入,它就像是一个数组。

  支持随机访问。这在生成地图时非常好用。如果用随机函数,地图生成只能在载入时生成,因为地图生成需要严格按照顺序来生成。如果想实现走到哪里生成哪里是做不到的,因为生成顺序是不一致的。而噪声函数就可以方便的实现。同时又可以支持多线程的加载。

  MC的随机地图是根据MC的地图种子(seed)来生成的,只要生成地图使用的种子(与各种其他生成参数)一样,MC根据算法生成出来的地图也就一样。因此当地图刚被生成出来时,你会发现MC的游戏地图存档也就小百KB,因为此时的所有地形只需要一个种子就能全部算出来。

  当玩家进入一个地区(或者区块 chunk)后,游戏因为要记录玩家对这个地区的所有操作和玩家附近的各个更新游戏地图的事件(比如树草作物生长、动物更新等),因此会把这个区域的整个信息全部保存到游戏文件中。因此你会发现一个玩得久的MC存档由于玩家探索过的区域非常多,整个游戏文件能到好几GB。

  当然也有一些游戏的存档不会保存区域的所有信息而是选择只记录玩家对地图修改了哪些部分,并用种子加载完剩余部分,这种做法通常会减小游戏存档的大小,不过极大的增加了游戏加载时间,两种方法各有利弊。

  给一个变量a,定义地图在各点高度h(x,y)=ax+ay。这样一来,我若给定一个随意数字a,我便能生成一整张地图来;并且我给定任意一个不同的数字,就能生成一张不同的地图。根据这两个特点,我就把a叫做种子。

  一个游戏要生成一张随机地图,唯一随机的部分因此实际上只有给种子的这个部分(看我那个简单的地图定义函数就知道没有随机了)。真实游戏中的地图算法也就只是步骤多了些复杂性罢了,并没有本质上区别。所以我们在MC里输种子的时候,我们只要输入一个随机字符串就好了。