返回信息流抽象成一个算法题吧,这样沟通的时候,没有理解性的不一致,题目如下:
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是很顺滑的,插火把的时候。
不知道他是怎么搞的?有没有思路?
这是一条镜像帖。来源:北邮人论坛 / acm-icpc / #99923同步于 2021/6/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ACM_ICPC机器人发帖
我的世界(MineCraft)(MC)火把?
YiYeShu
2021/6/9镜像同步15 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
不搞那种非常真实的光照,就计算火把能不能照射到,方块的表面就行了,
MC里大部分都是trick,不真实。
【 在 zzywq 的大作中提到: 】
: 不是很懂,但是光追复杂度肯定不止这么点。
单个火把的照射范围是个常数,每次更新对每个火把跑一次FloodFill,o(n)就够了吧。另外动态加载chunk,也少了不少计算量。
口胡的,错了就错了吧(
假设火把范围是 9*9*9
一共10个火把
就是 10 * 9 * 9 * 9
【一帧之内】算这么多,肯定是卡的。
【 在 lingzichao 的大作中提到: 】
: 单个火把的照射范围是个常数,每次更新对每个火把跑一次FloodFill,o(n)就够了吧。另外动态加载chunk,也少了不少计算量。
口胡的,错了就错了吧(
怎么肯定?
这个数字是7290,24fps就是174960。单核CPU算力约10^8每秒,你看看这两个数字差了多少,更别说加上GPU和多线程。
何况,3D游戏视角就是移动一个摄影机吧。用不着毎帧都要计算吧
【 在 YiYeShu 的大作中提到: 】
: 假设火把范围是 9*9*9
: 一共10个火把
: 就是 10 * 9 * 9 * 9
: ............
当然要是用指令同时插上万个火把的话,应该真的会卡
【 在 YiYeShu 的大作中提到: 】
: 假设火把范围是 9*9*9
: 一共10个火把
: 就是 10 * 9 * 9 * 9
: ............
不是说每一帧,是说我在10个火把,旁边,继续放置一个方块。
就这个操作,需要遍历附近的每一个火把,然后计算光照。
【 在 lingzichao 的大作中提到: 】
: 怎么肯定?
: 这个数字是7290,24fps就是174960。单核CPU算力约10^8每秒,你看看这两个数字差了多少,更别说加上GPU和多线程。
: 何况,3D游戏视角就是移动一个摄影机吧。用不着毎帧都要计算吧
我说的这个数字,不包含,具体的运算,只包含了大概的复杂度
比如:一个方块有六个面,其实就要乘以6了。
我应该抽象一下,变成一个具体的题目就好了。
【 在 lingzichao 的大作中提到: 】
: 怎么肯定?
: 这个数字是7290,24fps就是174960。单核CPU算力约10^8每秒,你看看这两个数字差了多少,更别说加上GPU和多线程。
: 何况,3D游戏视角就是移动一个摄影机吧。用不着毎帧都要计算吧