Real-Time Volumetric Cloudscapes

                                                                                  实时体积云景
GPU Pro 7 实时体积云景的翻译 

4.1 概览
   游戏中的实时体积云通常为了提高渲染效率而降低质量。最成功的方法仅限于低空蓬松半透明的层状云。我们提出了一种体积解决方案,可以使用不断变化并且逼真的结果填充天空,来描绘高海拔卷云和所有主要的底层云类型,包括厚厚的、像波浪一样翻滚的积云。此外,我们的方法近似于实现了几种实时云渲染中尚未出现过的体积光照效果。最后,我们的这种解决方案在内存和GPU的消耗上足够低,可以运用在3A主机游戏中。



4.2 简介

在 AAA 游戏机游戏中,渲染云彩的标准解决方案涉及某种资产,包括二维广告牌、极地天空穹顶图像或在渲染时实例化的体积图库。对于需要不断变化的天空并允许玩家覆盖广阔距离的游戏(如开放世界)而言,高精细资产的优势被存储和访问多个摄像机角度、一天中的不同时间和光照条件的数据的成本所掩盖。此外,对云层系统演变的模拟仅限于技巧或伪造,如旋转天穹或使用 2D 噪音扭曲图像。

程序云系统的许多技术都不依赖于资产。ShaderToy.com 上免费提供了几个很好的例子,如 "Clouds" [Quilez 13]。Evolution 工作室使用名为 TrueSky 的中间件为游戏《Drive Club》提供了令人印象深刻的大气天气效果[Simul 13]。

然而,这些方法也有几个局限性:
 

    •  它们都只描述了低空的层云,而没有描述蓬松和波状的层积云或积云。
    •  目前的体积方法无法实现云层特有的逼真照明效果。云层特有的照明效果。
    •  实时体积云通常在性能和内存方面都相当昂贵,而且与所产生结果的质量相比并不划算。


对于游戏《地平线:零之曙光》,我们开发了一种新的解决方案来解决这些问题。我们提交了用于建模、照明和渲染的新算法,可在 20 MB 内存预算和 2 ms 性能目标范围内提供逼真且不断变化的结果。

4.3 云的建模

图 4.2 显示了各种云类型及其高度范围。我们按体积渲染的云层有两层:存在于 1.5 千米到 4 千米之间的低层云和横跨 1 千米到 8 千米整个低层大气的积雨云。
 



随着时间的推移和太阳对地球的加热,水蒸气从地表上升并穿过这些大气层。每一层都有自己的风向和温度。随着水汽在大气层中移动的高度增加,温度也随之降低。随着温度的降低,水汽会在遇到的尘埃颗粒周围凝结成水或冰。(这些水汽在流动过程中存在很大的不稳定性,从而产生湍流。随着云层的上升,它们往往会形成波浪状。当它们扩散时,会像雾一样伸展和消散 [Clausse and Facy 61].

4.3.1 Modified Fractal Brownian Motion 改进的分形布朗运动

对体积云系统进行实时建模的标准方法是使用射线行进和分形布朗运动技术,简称 FBM [Mandelbrot and vaness 68]。简称 FBM [Mandelbrot and van Ness 68]。(见图 4.3。FBM 是一系列 octaves 噪音的总和,每个 octaves 噪音的频率较高,振幅较小。
 



Perlin 噪声 [Perlin 85] 通常用于此目的。虽然这是产生层云雾状形状的可靠模型,但它无法描述积云的圆形、波状形状,也无法赋予积云如图 4.4 所示的隐含运动感。

Perlin 噪声可以在其范围的中间翻转,产生一些蓬松的形状,但由于它只是一种噪声,因此仍然缺乏云中的花椰菜图案。图 4.5 显示了 Perlin 噪声、abs(Perlin * 2 + 1)的结果以及云中分形波浪图案的照片参考。

另一种噪声是 Worley 噪声,由 Steven Worley 于 1996 年提出[Worley 96],常用于渲染腐蚀和水效果,如图 4.6 所示。

如果将其倒置并用于 FBM,Worley 噪声就会近似于漂亮的分形波浪图案。它还可以用来增加低频 Perlin 噪声低密度区域的细节。(如图4.7 左 和 中间) 我们可以使用 Worley 噪声 FBM 作为原始范围的最小值来重新映射 Perlin 噪声。
 



这种将两种噪音类型结合起来的方法,为 Perlin 噪音产生的连通性增加了一些波纹,效果更加自然。
 

我们将其称为低频 Perlin-Worley 噪声,它是我们建模方法的基础。(见图 4.7 右)。

图 4.8 显示了我们的第一个三维纹理,它由 Perlin-Worley 噪声 FBM 和三个倍频程的 Worley 噪声 FBM 组成。图 4.9 显示了我们的第二个三维纹理,它由另外三个倍频程的 Worley 噪声组成。

第一个三维纹理定义了我们的基本云形状。第二个三维纹理频率较高,用于侵蚀基本云形状的边缘并增加细节,详见第 4.3.4 节。



4.3.2 密度-高度函数

该领域之前的工作通过基于高度[Quilez 13]来偏置或缩放云密度值来创建一种特定的云类型。

该函数用于偏置或缩放噪声信号并产生云。这将在其他工作中看到的云的类型限制为一种类型,因为云的最大高度永远不会改变。

我们通过使用三个这样的函数来扩展这种方法,一个分别适用于三种主要的低级别云类型:层云、层积云和积云。图4.10显示了我们使用的梯度函数。图4.11显示了使用这些函数随高度改变云密度的结果。
 



在运行时,我们计算这三个函数的加权和。我们使用天气纹理来改变权重,以或多或少地添加每种云类型——详细信息将在下一节中介绍。

4.3.3天气纹理

就我们的目的而言,我们希望在云系统领域的任何一点上了解三件事:
 

1. 云层覆盖率: 天空中云层覆盖的百分比。

2. 降水量: 头顶云层产生降雨的几率。

3. 云类型: 0.0 表示层云,0.5 表示层积云,1.0 表示积云。
 

这些属性都可以用介于 0 和 1 之间的概率来表示,这使得它们很容易处理并在二维纹理中预览。可以对缓冲区进行采样,以获得世界空间中任意点的每个属性值。

图 4.12 将该场景的天气图分解为多个部分。该图的比例尺为 60,000 × 60,000 米,箭头表示摄像机方向。

        

在现实中,下雨的地方总是会出现雨云。为了模拟这种行为,我们将云的类型偏向于积雨云,并将云的覆盖率偏向于至少 70%,而下雨的几率是 100%。

此外,我们还允许艺术家覆盖天气纹理,以生成 我们还允许艺术家覆盖天气纹理,为场景剪辑或其他定向体验制作艺术指导的天空[Schneider 15, slide 47].


4.3.4云采样器
 

在确定了云密度函数的组成部分之后,我们现在将着手建立云模型。

与迄今为止所有其他体积云解决方案一样,我们使用的是射线行进法。射线行进法在一个区域内行走,并采样密度值,用于照明和密度计算。这些数据用于构建体积主体的最终图像。我们的云密度采样函数主要负责解释采样位置和天气数据,为我们提供给定点的云密度值。

在开始使用该函数之前,我们先计算一个归一化标量值 表示当前样本位置在云层中的高度。这个将用于建模过程的最后一部分。


我们还定义了一个重映射函数,用于将数值从一个范围映射到另一个范围、 以用于组合噪音来制作我们的云。


 



我们采样算法的第一步是利用第一个三维纹理中的低频 Perlin-Worley 噪声构建基本云形。具体过程如下

1. 第一步是获取构建基本云形所需的四个低频噪声值。我们对包含低频 octaves 的第一个三维纹理进行采样。

2.我们将使用包含 Perlin-Worley 噪声的第一个通道来建立基本云图形状。

3. 虽然基本的 Perlin-Worley 噪声提供了合理的云密度函数,但它缺乏真实云的细节。我们使用重映射函数将其他三个低频噪声添加到 Perlin-Worley 噪声的边缘。这种噪声组合方法可以防止 Perlin-Worley 云形状的内部变得不均匀,同时还能确保只在我们能看到的区域添加细节。

4. 为了确定我们要绘制的云的类型,我们根据天气纹理中的云类型属性计算密度高度函数。

5.接下来,我们将云的基本形状与密度高度函数相乘,根据天气数据创建正确的云类型。


 


 

代码如下



 

此时,我们已经有了类似云的东西,尽管是低细节的云(图 4.13)。


接下来,我们应用天气纹理中的云层覆盖属性,以确保可以控制云层覆盖天空的程度。这一步涉及两个操作:

    1.为了让云朵随着覆盖属性的变化而真实地生长,我们使用重映射功能中的云朵覆盖属性来扩展前几步生成的基本云朵形状。


    2.为了确保密度随着覆盖范围的增加而增加,从而达到美观的效果,我们将这一结果乘以云层覆盖属性。
 



代码如下
 



 

这些步骤的结果如图 4.14 所示。基础云的细节仍然较少,但它开始看起来更像一个系统,而不是一片噪点。

接下来,我们将为云层添加逼真的细节,从水汽上升不稳定产生的小波浪,到大气湍流造成的飘渺扭曲(见图 4.15 中的示例)。

我们通过三个步骤对这些效果进行建模:
 

1. 我们使用动画卷曲噪波来扭曲云层底部的样本坐标,当我们使用扭曲的样本坐标对高频三维纹理进行采样时,模拟湍流的效果。

2. 我们用高频 Worley 噪声建立一个 FBM,以增加云层边缘的细节。

   

3. 我们使用高频 FBM 来收缩云的基本形状。在云的底部,我们反转 Worley 噪声,在该区域产生飘渺的形状。在顶部收缩 Worley 噪声,产生波浪状细节。
 


代码如下
 


 


 

这些步骤的结果如图 4.16 所示。这一系列操作就是我们的采样器在光线行进过程中创建云景的框架,但我们采取了额外的步骤来增加隐含的运动感,而传统的基于噪声的云景解决方案则缺乏这种运动感。

为了模拟云从一个大气层上升到另一个大气层时的剪切效应,我们将采样位置偏移到风向与高度之间。此外,两个三维纹理样本在风向上都有偏移,并随着时间的推移略微向上,但速度不同。让每种噪音都有自己的速度,可以使云层的运动看起来更加逼真。在延时效果中,云层看起来是向上生长的。

 


 



这段代码必须位于 CloudDensitySample() 函数中任何 3D 纹理采样之前。

4.3.5 结果

图 4.17 展示了使用不同天气设置创建的一些体积云景。

通过这种建模方法,我们可以制作出许多独特的云景。 当雨信号沿风向接近摄像机时,会产生暴风前线逼近的效果[Schneider 15, slide 43–44].

4.4 云的光照
 

体积云照明是计算机图形学中研究得非常透彻的一个领域。不幸的是,对于游戏开发者来说,最好的结果来自于大量采样。这就意味着,我们必须设法近似制作电影级云彩时发生的复杂而昂贵的过程。


 

我们的方法可以近似解决以下三种特殊效果:云层中的多重散射和定向光照、当我们向太阳看去时的银边效果、当我们向天空看去时的云层散射和定向光照。向太阳时的银边效应,以及远离太阳时云层上的暗边。远离太阳时云层上的暗边。图 4.18 展示了这三种效果的照片参考。这三种效果的照片参考。

4.4.1 体积散射

当光线进入云层时,大部分光线会穿过云层中的水滴和冰层发生折射,然后散射到我们的眼睛[Van De Hulst 57]。光子进入云层后会发生三种情况(另见图 4.19):

1. 光子可能会被云中的水或非参与粒子(如灰尘)吸收;这就是消光或散射。

这就是消光或吸收。

2. 光子可能从云中向眼睛射出;这是内向散射。

3. 它可以从云中流出,远离眼睛;这是外散射。

比尔定律是近似计算这三种结果概率的标准方法。

4.4.2 比尔定律 Beer’s Law

比尔定律最初是用于化学分析的工具,它模拟了光在穿过材料时的衰减 [Beer 52]。(见图 4.20)。

      


 

在体积测量中,它可用于根据光学厚度可靠地计算透射率[Wrenninge 13]。

如果我们的参与介质是(non-homogenous)非均匀的,如云层,我们就必须使用光线行进法沿着光线累积光学厚度。 这一模型在电影视觉效果中得到了广泛应用,也是我们照明模型的基础。

下面是它在代码中的实现方式:
 



4.4.3 Henyey-Greenstein相位函数

在云层中,光向前散射的概率更高[Pharr and Humphreys 10]。这就是云中有silver lining的原因。(见图 4.21.)
 



1941 年,Henyey-Greenstein 相位函数被提出来模拟小颗粒对光散射的角度依赖性,并用来描述星际尘埃云对光的散射 [Henyey and Greenstein 41].在体积渲染中,该函数用于模拟光在参与介质中的散射概率。我们使用偏心率(方向分量)g 为 0.2 的单个 Henyey-Greenstein 相位函数,以确保云中更多光线向前散射:



下面是它在代码中实现的样子:
 



最终的结果显示在图4.22上:
 


 



4.4.4内散射概率函数(粉糖效应)
 

比尔定律是一个消光模型,这意味着它关注的是光能如何随深度衰减。这就无法近似地反映与云层向阳面的内散射有关的重要照明效果。当视线接近光线方向时,这种效应表现为云层边缘变暗。成堆的糖粉也有类似的效果,这也是我们对这种效果昵称的来源。请参见图 4.23。

这种效果在圆形的浓密云层中最为明显,以至于每个隆起之间的皱褶看起来比更靠近太阳的隆起本身更亮。这些结果似乎与比尔定律的模型完全相反。

回想一下,内向散射是指光线在云层中反弹,直到变成平行光线,然后离开云层到达我们眼睛的一种效应。这种现象甚至会出现在我们观察云的阳光面时(图 4.24)。
 


还要记住,由于前向散射,更多的光沿着原始光线方向向前散射。但是,必须存在相对较大的光学深度,光子才有合理的机会转动 180 度。云边缘周围的路径不会穿过足够大的光学深度,无法将相当一部分光子完全转向。具有足够大的光学深度以将光子旋转 180 度的路径几乎总是位于云内部,因此比尔消光定律将在它离开云进入我们的眼睛之前消除这种贡献。空隙和裂缝是个例外; 它们为云体积内部提供了一个窗口,那里有光学深度相对较大的光子路径,为光子逃逸提供了一条低密度捷径,使裂缝处比周围的凸起处更亮。

我们选择用概率来表示这种现象。想象一下,您正以相同的角度注视着云层上的其中一个隆起区域,与您身后从太阳射出的一组光线呈同一角度(图 4.25)。

如果我们在其中一个凸起的表面下方取样,并将其与其中一个裂缝中处于相同深度的点进行比较,那么裂缝中的点会有更多潜在的云物质,从而导致内散射(图 4.26)。就概率而言,裂缝中的点应该更亮。【折痕出内散射多 所以更亮 】


 



以这个思想实验为指导,我们提出了一个新函数来解释这种效应。由于这一结果实际上与比尔定律相反,因此我们将其表示为原始函数的倒数(图 4.27)。
 

就我们的目的而言,这已经是对这一现象足够准确的近似值了、

无需额外取样。我们将这两个函数合并为一个新函数: Beer's-Powder.。请注意,我们将整个结果乘以 2,使其更接近原始的归一化范围(图 4.28)。

下面是代码实现方法:

                                    powder_sugar_effect = 1.0 − exp ( − light_samples ∗ 2.0 ) ;

                                    beers_law = exp ( − light_samples ) ;

                                    light_energy = 2.0 ∗ beers_law ∗ powder_sugar_effect ;


图 4.29 显示了一个独立测试案例和我们的游戏解决方案的部分结果。


 



4.4.5 雨云
 

我们的系统还模拟了雨云较暗的基底。雨云之所以比其他低空云层更暗,是因为水滴凝结得太厉害,以至于大部分光线在到达我们的眼睛之前就被吸收了。

因此,既然我们已经有了采样点的降水属性,我们就可以利用它来人为地 "增厚 "云层物质。通过增加进入 Beer'sPowder 函数的采样密度,就可以轻松完成这项任务;见图 4.30。变量 p 代表降水。

图 4.31 显示了一些结果。



4.4.6 照明模型总结

综上所述,我们的照明模型由四个部分组成:
 

    1 Beer's law

    2 Henyey-Greenstein 相位函数
    3 散射概率函数(糖粉效应)
    4 雨云吸收增益。

E 代表光能,d 代表照明采样密度,p 代表雨云吸收乘数,g 代表我们在光照方向上的偏心率,θ 代表视线与光线之间的夹角:
                



4.5 云渲染
选择在哪里对数据进行采样以构建图像对于性能和图像质量非常重要。我们的方法试图将巨大消耗的工作限制在可能需要的情况下进行.

4.5.1 球形大气层
 

使用ray march进行渲染的第一部分是决定从哪里开始。当观众位于海洋等看似“平坦”的表面时,地球的曲率显然会导致云层下降到地平线上。 这是因为地球是圆形的,云层是球形的而不是平面的。(见图 4.32)。

为了再现这一特征,我们的射线行进是在一个 3.5 千米厚的球壳中进行的,从地球表面上方 1.5 千米处开始。我们使用球面相交测试来确定射线行进的起点和终点。当我们看向地平线时,射线长度会大幅增加,这就要求我们增加潜在样本的数量。这就要求我们增加潜在样本的数量。在播放器正上方,我们 我们需要多达 64 步,而在地平线上,我们需要多达 128 步。我们的 在我们的光线行进循环中进行了多项优化,使其可以提前退出,因此平均采样数比这一数值要低得多。

4.5.2 Ray March 优化
 

我们不会每次都评估完整的云密度函数,而是只评估云密度函数的低频部分,直到接近云为止。在云的基本形状的边缘进行侵蚀。仅评估 密度函数的低频部分意味着只需读取一个三维纹理,而不是两个,这大大节省了带宽和指令数。图 4.33 展示了使用 "廉价 "样本在空旷空气中进行的步进,以及在接近空旷空气时切换到昂贵样本的过程。在接近云层时切换到昂贵的样本。一旦有几个样本返回 零,我们就返回 "廉价 "样本。


要在代码中实现这一点,我们从零的cloud_test值开始,并使用我们的采样器的布尔值true 在循环中累积密度。 只要cloud_test为0.0,我们就会继续搜索云边界。一旦我们得到一个非零值,我们就抑制该步骤的行进积分并继续使用完整的云密度样本。在连续六个返回0.0的完整云密度样本后,我们切换回云边界搜索。这些步骤确保我们已经退出了云边界并且不会触发额外的工作。


 


 



该算法将3D纹理调用的数量减少了一半,以实现最佳情况,即我们在空旷的天空中步进采样。


为了计算光照,我们需要在每一步光线行进中对光线采集更多的样本。这些采样的总和将用于照明模型,然后在每个视图光线行进步长中按照当前视图光线的密度总和进行衰减。图 4.34 展示了光线行进中的基本光线采样整合行进。

由于我们的目标是在支持许多其他 GPU 密集型任务的游戏引擎中使用,因此我们限制每个光线行进步骤的采样不超过六个。

减少光线采样数量的一种方法是,只有当 光线行进到云层内部时才执行采样。这是一项重要的优化,因为 光采样的成本极高。这种优化不会改变视觉效果。视觉效果没有变化。



4.5.3 锥形采样照明
 

测量查询点与太阳之间云层的透射率,显然是找到太阳光照量的方法。然而,云层中任何一点的光线都会受到光源方向周围区域光线的极大影响。可以把它想象成一个光能漏斗,在我们的样本位置达到顶峰。为了确保照明模型中的比尔定律部分受到这种影响,我们在一个向光源方向扩散的圆锥体中采集六个光样本,从而通过将云的邻近区域包括在内来加权比尔定律衰减函数。见图 4.35。

由于采样次数少,条带状的伪影会立即出现。锥形采样有助于稍微打破条带状,但为了进一步平滑它,我们以较低的mip级别对密度进行采样。

为了计算圆锥偏移量,我们使用了-(1, 1, 1)和+(1, 1, 1)之间的六个噪声结果核,并在远离样本位置时逐渐增大其幅度。如果沿视图行进的累积密度超过了一个阈值(我们使用的是 0.3),那么我们就会将样本切换到低细节模式,以进一步优化光线行进。在此阈值下,视觉差异很小。
 


 



此外,为了考虑到从远处云层投射到我们正在计算光照的云层部分上的阴影 我们在计算光照时,会在三倍于锥体长度的距离处采集一个远距离样本。距离是锥体长度的三倍。(见图 4.36)。
 


 



4.5.4 高空云

我们的方法只对低空云层进行体积渲染。高空云层使用滚动纹理表示。不过,为了将它们与体积云进行整合,需要在光线行进的末端对它们进行采样。对于具有三个通道的 512 * 512 纹理来说,读取纹理的成本可以忽略不计。我们将风向与天气系统中的风向不同的云层制作成动画,以模拟不同云层中的不同风向。(见图 4.37)。

4.5.5 结果

图4.38显示了说明一天中变化时间的照明结果序列。
 



4.6 结论和未来工作

这种方法可以在一天中的任何时间制作出逼真、不断变化的云景,完全取代了我们基于资产的云彩制作方法。这也意味着我们整个天空的内存使用量仅限于几个总计 20 MB 的纹理,而不是为不同天气条件和一天中的不同时间制作多个天空穹顶和广告牌所需的数百兆字节。GPU 上的性能大约为 20 毫秒,但当我们使用temporal reprojection技术构建图像时,这个数字会降低 2 毫秒[Schneider 15, slide 91–93].

内散射概率函数是基于一个思想实验得出的,但我们正在对此进行进一步研究。我们计划使用Magnus Wrenninge)[Wrenninge 15]使用的自然产生暗边的粗暴方法,沿着光线收集数据点,并开发一个更精确地适合这些数据的函数。

4.7 致谢

我要感谢 Nathan Vos、Michal Valient、Elco Vossers 和 Hugh Malan 的帮助。我还要感谢 JanBart van Beek、Marijn Giesbertz 和 Maarten van der Gaag,感谢他们协助我们实现了本项目的外观目标。在实现本项目的外观目标方面提供的帮助。


此外,我个人还要感谢同事们,他们的工作对本报告产生了重大影响 他们的工作对本研究产生了很大影响: Trevor Thomson、Matthew Wilson 和 Magnus Wrenninge。
 

Bibliography(参考)

[Beer 52] A. Beer. “Bestimmung der Absorption des rothen Lichts in farbigen Flussigkeiten” (Determination of the Absorption of Red Light in Colored Liquids). Annalen der Physik und Chemie 86 (1852), 78–88.

[Clausse and Facy 61] R. Clausse and L. Facy. The Clouds. London: Evergreen Books, LTD., 1961. 

[Henyey and Greenstein 41] L. G. Henyey and J. L. Greenstein. “Diffuse Radiation in the Galaxy.” Astrophysical Journal 93 (1941), pp. 78–83.
 

[Mandelbrot and van Ness 68] B. Mandelbrot and J. W. van Ness. “Fractional Brownian Motions, Fractional Noises and Applications.” SIAM Review 10:4(1968), 422–437.


[Perlin 85] K. Perlin. “An Image Synthesizer.” In Proceedings of the 12th Annual Conference on Computer Graphics and Interactive Techniques, pp. 287–296.New York: ACM Press, 1985.


[Pharr and Humphreys 10] M. Pharr and G. Humphreys. Physically Based Rendering: From Theory to Implementation. Boston: Morgan Kaufmann, 2010.


[Quilez 13] I. Quilez. “Clouds.” Shadertoy.com, Shadertoy BETAview/xslgrr, 2013.


[Schneider 15] A. Schneider. “The Real-Time Volumetric Cloudscapes Of Horizon: Zero Dawn.” Paper presented at ACM SIGGRAPH, Los Angeles, CA,August 26, 2015.


[Simul 13] Simul. “TrueSKY.” 30 Day Free Trial - Award winning weather renderer | Simul trueSKY, 2013.


[Van De Hulst 57] H. Van De Hulst. Light Scattering by Small Particles. New York: Dover Publications, 1957.


[Worley 96] Steven S. Worley. “A Cellular Texture Basis Function.” In Proceedings of the 23rd Annual Conference on Computer Graphics and Interactive Techniques, pp. 291–294. New York: ACM Press, 1996.


[Wrenninge 13] M. Wrenninge. Production Volume Rendering: Design and Implementation. Boca Raton, FL: CRC Press, 2013.


[Wrenninge 15] M. Wrenninge. “Art-Directable Multiple Volumetric Scattering.”In ACM SIGGRAPH 2015 Talks, article no. 24. New York: ACM Press,2015.

相关推荐

  1. Linux read 命令

    2023-12-25 07:34:03       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-25 07:34:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-25 07:34:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-25 07:34:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-25 07:34:03       20 阅读

热门阅读

  1. git 命令的使用

    2023-12-25 07:34:03       37 阅读
  2. react优劣势

    2023-12-25 07:34:03       38 阅读
  3. 使用 Verdaccio 构建自己的私有 npm 仓库

    2023-12-25 07:34:03       31 阅读
  4. ps怎么扣圆

    2023-12-25 07:34:03       36 阅读
  5. DDOS攻击简介——什么是DDOS

    2023-12-25 07:34:03       28 阅读
  6. k8s的探针

    2023-12-25 07:34:03       34 阅读
  7. 深入理解.net运行时方法表

    2023-12-25 07:34:03       39 阅读
  8. Microsoft Edge使用方法和心得

    2023-12-25 07:34:03       41 阅读
  9. Microsoft Edge使用方法和心得

    2023-12-25 07:34:03       37 阅读