再谈Lua热更新(终)

在写这篇文章之前, 我特意在标题前加了个"终"字。因为我相信,这就是生产环境中热更新的最终出路。 大约在4年前,我实现过一版热更新。 但是这个版本并不理想。在一些简单场景下工作良好,场景稍一复杂,就显得捉襟见肘。 比如下面代码, 我的热更新实现就无法很好的进行更新。 --M1.lua local M1 = {} local case = { [1] = function() --[[xx]] end [2] = function() --[[xx]] end } function M1.foo(x) case[x]() end return M1 --M2.lua local foo = require &quo……

初窥Rust

在2021年4月14号LKML 邮件组在讨论是不是要接纳Rust语言进行开发,而Linus本人似乎对Rust也没有那么反感。种种迹象表明Rust是一门值得一学的语言。但是拖延症让我一直拖到2周以前才开始学习Rust. 现代编程语言一般都围绕三个方面进行设计:范式,内存,并发(这是我自己的理解,也许并不正确,毕竟我没有设计过编程语言:D)。 就“范式”而言,Rust是一门多范式编程语言,而编程范式这几十年来没有什么太大变化,Rust同样在这方面也没有太大的创新。因此这一块没什么好说的。 刚接触Ru……

关于游戏服务器的服务拆分

先阐明一下观点,可以使用单体(单线程)应用程序解决的问题,都不应该使用分布式系统来解决,因为分布式真的很复杂。 在游戏服务器中,我们做服务拆分,大部分情况下都是为了可伸缩,而不是为了高可用(这里暂不考虑那些使用WEB模式实现游戏服务器的思路。我认为这种思路,逻辑的复杂度和实时性都不能保证,而且还需要处理并发问题。) 以前我就说过,游戏服务器的开发更像是在开发数据服务。 现在,我觉得可以更明确一点。 游戏服务器的开发,其实就是针对某种业务逻辑开发的专用数据……

ECS的初步实现

从我开始研究ECS算起, 到现在已经将近20天了。 第一版ECS库终于实现完成了。先不论性能如何,基本功能都实现了。 在我的理解中,ECS中最复杂的地方是EC部分的管理和查询。而S部分的复杂度主要是依赖关系的问题,这会取决于具体的项目。 因此,在这个ECS库中主要解决EC的问题,关于S的部分并没有提供。这也是我称它为库而不是框架的原因。 在整个实现过程中,由于我还没能完全克服性能强迫症,导致我的心路历程非常坎坷(每次实现到一半,总会因为这样或那样的原因,让我推倒重来)……

ECS初探

开始之前先说两句题外话。 GAMES202的作业4是白炉测试,但是我到目前为止还没有做. 其主要原因是,关于GGX BRDF我有点迷惑了. 本来按照LearnOpengl和其他参考书里面讲的, 一般光照计算会分为两部分. 一部分为Diffuse, 一部分为Specular. Diffuse又可以看作是次表面散射的一种简化。这样我们可以用菲涅尔反射, 来计算一束光线有多少反射出去(BRDF项),有多少进入物体内部进行次表面散射(Diffuse项), 然后把两部分加起来就行了。 但是闫神讲课时说:由于已经采用了微表面模型,就不能……

屏幕空间(SreenSpace)的想象力

在写这篇文章时,我特意去Wiki上搜了一下ScreenSpace, 可能是由于太过直白的缘故,并没有找到标准的定义。 不过他的定义是显而易见的,屏幕空间的所有的信息都是与屏幕上的像素有关的,而不是和场景中的几何有关的信息都叫屏幕空间,这一点其实很像是Pixel和Fragment的区别。pixel是定义在屏幕空间上的,而Fragment是定义在三维空间上的。 举个最简单的例子,我们从相机原点射出一条射线,然后穿过两个不透明物体。这两个交点,在进行光栅化时就是2个Fragment, 但是最终渲染到屏幕上……

一些对辐射度量学的理解

随着硬件性能的提升,PBS/PBR已经越来越成为一种趋势。 Unity内置的standard shader都已经默认使用PBR算法。 而学习PBR过程中,有一门必提的知识是“辐射度量学”。 本来我以为我都学会了,毕竟path tracer都写出来了,并且效果看起来很正常。 但是最近在学习全局光照时,突然对“辐射度量学”突然产生了两个疑惑。 光线在传播过程中,Radiance是如何体现出,能量随着距离增加而衰减的? 回忆在写path tracing时,代码并没有刻意去计算距离对光线能量的衰减。 而从数学公式上看,在计……

深度缓冲和半透明渲染

在场景渲染方式上,一般分为“不透明渲染”和“半透明渲染”。 “不透明渲染”意思是,如果A物体被B物体挡住,那么A物体将完全不可见。 至少有两种方式达到这种效果(假设相机的朝向为Z轴正方向): 由于屏幕上每一个相素都是由场景中某一世界坐标(Fragment)投影得到,在绘制时以Fragment在相机空间内按Z轴从大到小进行绘制, 写入颜色值时直接覆盖FrameBuffer中的颜色值。 物体以任意顺序渲染,但是在渲染某一个Fragment时,会将其在相机空间的Z坐标写入一个叫做深度缓冲区的地方,在……

Mysql的间隙锁

学习Mysql, 总会有一座绕不过去的大山, 那就是锁。理论上,锁的花样再多,也超不出操作系统课上讲的那些范畴,但是Mysql锁让我翻车了。 在Mysql中锁的粒度可分为:表级锁,行级锁,间隙锁 三种。表级锁和行级锁都没什么太难理解的地方。只有间隙锁我无法准确理解其设计意图,而且我试验下来的现象让我觉得很诡异。 那么为什么会有间隙锁这种东西呢,按大部分能查到的资料表示,间隙锁的引入是为了解决在RR隔离级别的幻读问题。 下面来看一个实例,首先创建一个Table: Create Table: ……

更新一些GPU相关知识

在学完并实现路径追踪之后,即使增加了多线程渲染,在SPP=1024的情况下,依然需要30+分钟才能渲染一帧。 为了更快的渲染速度 ,我试图通过使用GPU的CUDA SDK来加速渲染。然而测下来竟然还没我的CPU跑的快,一方面我没有更好的显卡,另一方面我也不太确定是不是我CUDA使用错误所致。再加上就算使用GPU也不可能达到每帧秒级渲染。于是GPU的学习就搁置了。 然而在最近研究Splat地形渲染方案时, 我无意间发现了一个现象。测试地形为4层混合,在所有Texture都不开Mipmapping的情况下, FPS……