BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #99923同步于 2021/6/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖

我的世界(MineCraft)(MC)火把?

YiYeShu
2021/6/9镜像同步15 回复
抽象成一个算法题吧,这样沟通的时候,没有理解性的不一致,题目如下: 1. 将空间分成离散的格子,每一个格子都是正方体,边长都是1。 2. 每一个格子只有三种状态,【空气】【火把】【圆石】。 3. 【火把】具有向四周发射光线的特性,【圆石】的表面如果收到了光线,则发亮。 4. 【圆石】有6个面,每个面是单独计算光照的。 5. 【圆石】的某个面的中心坐标与【火把】所在格子的中心坐标连线,如果连线没有穿过其他【圆石】,则认为【火把】的光线照到了此【圆石】的这个表面。 6. 【火把】本身是透明的,不影响光线的行进。 7. 假设光照不随距离递减。 // arrTorch: 数组,所有【火把】的位置 // arrStone: 数组,所有【圆石】的位置 // light: 浮点数,单个【火把】光线的范围 每个Stone 数据结构 : { x,y,z //坐标 [light0,light1,light2,light3,light4,light5] // 每个面收到的光照 } 输出,要求,填充 arrStone 里每一项的 [light0,light1,light2,light3,light4,light5] function CalculateLight (arrTorch[], arrStone[], light) { } ////////// /////////// //////////// ///////////// ////////////// 最近玩 我的世界(MineCraft),以下简称 MC。 由于对图形学和游戏引擎有点兴趣,我就在想这里面火把是怎么实现的。 就是火把随时插上去,然后随时拆掉,附近的光照会实时改变。 一般的游戏,这种点光源都是固定个数的,MC 里火把的数量和位置都可以变动的。 这样插一两个没啥问题,多了怎么来计算呢? 例如,在某区域内已经插了十个火把了: 如图所示(1代表火把): [1][1][1][1][1][1][1][1][1][1] 然后在下面放置一个圆石 (2代表圆石): [1][1][1][1][1][1][1][1][1][1] [][][][][][][][2][][][][][][][] 那么当我插 2 的时候,是不是需要遍历一下所有的附近的 1 ,重新对这个小区域的所有方块的表面 计算一下光照,这样复杂度是不是 O(N*M) ? N 是指: 区域内火把的数量 M 是指: 区域内方块的数量。 这样搞一下的话,肯定卡死了,但是MC是很顺滑的,插火把的时候。 不知道他是怎么搞的?有没有思路?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
zzywq机器人#1 · 2021/6/9
不是很懂,但是光追复杂度肯定不止这么点。
YiYeShu机器人#2 · 2021/6/9
不搞那种非常真实的光照,就计算火把能不能照射到,方块的表面就行了, MC里大部分都是trick,不真实。 【 在 zzywq 的大作中提到: 】 : 不是很懂,但是光追复杂度肯定不止这么点。
lingzichao机器人#3 · 2021/6/9
单个火把的照射范围是个常数,每次更新对每个火把跑一次FloodFill,o(n)就够了吧。另外动态加载chunk,也少了不少计算量。 口胡的,错了就错了吧(
YiYeShu机器人#4 · 2021/6/9
假设火把范围是 9*9*9 一共10个火把 就是 10 * 9 * 9 * 9 【一帧之内】算这么多,肯定是卡的。 【 在 lingzichao 的大作中提到: 】 : 单个火把的照射范围是个常数,每次更新对每个火把跑一次FloodFill,o(n)就够了吧。另外动态加载chunk,也少了不少计算量。 口胡的,错了就错了吧(
lingzichao机器人#5 · 2021/6/9
怎么肯定? 这个数字是7290,24fps就是174960。单核CPU算力约10^8每秒,你看看这两个数字差了多少,更别说加上GPU和多线程。 何况,3D游戏视角就是移动一个摄影机吧。用不着毎帧都要计算吧 【 在 YiYeShu 的大作中提到: 】 : 假设火把范围是 9*9*9 : 一共10个火把 : 就是 10 * 9 * 9 * 9 : ............
lingzichao机器人#6 · 2021/6/9
当然要是用指令同时插上万个火把的话,应该真的会卡 【 在 YiYeShu 的大作中提到: 】 : 假设火把范围是 9*9*9 : 一共10个火把 : 就是 10 * 9 * 9 * 9 : ............
YiYeShu机器人#7 · 2021/6/9
不是说每一帧,是说我在10个火把,旁边,继续放置一个方块。 就这个操作,需要遍历附近的每一个火把,然后计算光照。 【 在 lingzichao 的大作中提到: 】 : 怎么肯定? : 这个数字是7290,24fps就是174960。单核CPU算力约10^8每秒,你看看这两个数字差了多少,更别说加上GPU和多线程。 : 何况,3D游戏视角就是移动一个摄影机吧。用不着毎帧都要计算吧
YiYeShu机器人#8 · 2021/6/9
我说的这个数字,不包含,具体的运算,只包含了大概的复杂度 比如:一个方块有六个面,其实就要乘以6了。 我应该抽象一下,变成一个具体的题目就好了。 【 在 lingzichao 的大作中提到: 】 : 怎么肯定? : 这个数字是7290,24fps就是174960。单核CPU算力约10^8每秒,你看看这两个数字差了多少,更别说加上GPU和多线程。 : 何况,3D游戏视角就是移动一个摄影机吧。用不着毎帧都要计算吧
Saerdna机器人#9 · 2021/6/9
没看明白为啥插入2的时候需要遍历全部的1进行计算。插入2影响的方块是固定的吧,只计算受影响的方块不行吗