超大纹理传输

原文网盘

由于本人英语,3d图形图像领悟水平有限,难免文章翻译有错误,强烈建议看原文。

超大地理空间纹理传输

2007年4月17日
J.M.P.范·波伦
?2007,Id Software,Inc.
抽象
提出了一种允许流量大的高速流水线,

来自诸如DVD播放器的慢存储设备的地理空间纹理数据。

低级别,对齐非缓存读取用于最大化吞吐量,并且避免内存和文件系统缓存污染。

带宽要求通过压缩显着减少,并带有纹理数据库优化的布局 用于 最小化寻道时间。

而且,多线程被实现以提高吞吐量和卸载


压缩计算 到 可用的单独的 CPU  /核心。

介绍


特殊纹理的地形需要大量不能全部存储的纹理数据记忆在同一时间。

纹理数据需要从一些存储设备流传输到之前的内存可以用于渲染。

高保真渲染步行/跑步/开车


在独特纹理的地形上,快速需要很多带宽来流式传输纹理数据。


假设一个视点在平坦的地形上移动,并且纹理细节显示在平方视点周围的层。

视点周围的每一层都显示相同的数字纹素,

但较低的细节层是世界单位的大小是直接比较高细节层的两倍它上面。

要以1024 x 768或更高的分辨率渲染平坦的地形,

这是一个典型的分辨率

每个方块使用2048 x 2048的纹素。

如果有五个方块2048 x 2048的层纹素总共有5 x 2048 x 2048 texels(约21 Mega Texels)

可用于渲染随时。

视图移动时,层必须被更新,并且基本上是行和纹理列必须在方形图层的方向上 

更新 观点 移动。

在最坏的情况下,视点沿对角线移动,并且都是一排需要更新纹素的列。

假设每平方英寸有一个纹理细数

最高的细节层,这相当于每英寸移动必须更新的5610个纹素沿对角线。

人的平均步行速度约为3英里/小时,相当于53英寸
   

第二。在这个速度上,大约0.3兆像素必须每秒流式传输才能更新纹理细节周围的观点。

运行速度非常快的人的速度可达20英里小时,等于352英寸/秒。

在这个速度上,大约2兆的纹素必须流传每秒。

当以每小时80英里的速度驾驶汽车时,大约需要流过8兆兆像素


  第二。  这些数字用于渲染 完全平坦 的地形 而 没有 任何 高程。

为一个丘陵和山脉的地形需要更新的纹理细节数量可以为1.5倍以上。

可以理解的是,当观察点附着在每小时80英里的汽车上时,

没有必要渲染每平方英寸独特的纹理细节。

渲染较少的纹素可能不明显,或者可能感觉为运动模糊。

然而,如果汽车很快就停下来,这是可取的

立即在屏幕上可以  看到  每英寸 独特的纹理  细数。

如果流式传输不能保持,    

在高速驾驶汽车时,所需的细节水平将不可用汽车来到一个快速的停止,

将有一个延迟之前的细节弹出或淡入淡出。

这被认为是一个瞬间的焦点损失,这是分散注意力,

可能导致观众试图重新聚焦他或她的眼睛。

  从慢速存储设备(如DVD播放器)流出大量纹理数据不是不重要的。

首先,需要了解存储设备的工作原理。


此外,必须使用各种技术来减少存储和带宽要求并最大化吞吐量。

从DVD读取数据

以下重点是从DVD流式传输。但是,当尝试改进流式传输时


性能,同样的优化策略也适用于其他存储设备。

尤其是,吞吐量和块大小可能不同, 但可以是相同或相似的优化


用于从任何基于磁盘的存储设备(如CD或Blu-Ray)进行流式传输。


DVD上的数据像CD一样作为连续的螺旋存储。

数据被布置在在这个螺旋上的扇区,每个扇区可以容纳2048个字节。

扇区分为32 kB 纠错码(ECC)块(每个块16个扇区)。

ECC是一个用来代码的代码自动检测并纠正错误。

DVD播放机必须读取和验证整个块,每当从ECC块请求任何数据时。

因此,实现了最佳吞吐量   当一次读取具有 有用数据 的整个ECC块时。

DVD上的文件在扇区上对齐边界。

换句话说,如果文件小于2 kB扇区大小,则扇区的其余部分是浪费了。

在s上放置多个单独的纹理文件不是个好主意

    ector或ECC封锁边界之间浪费的空间。

文件之间浪费的空间是相当的吊带宽度。

相反,使用单个纹理数据库文件更好,其中纹理数据存储尽可能的紧凑。

纹理数据库文件应该在ECC块边界中对齐,

或者 应该 计算到  ECC块边界的偏移量 以 读取ECC块对齐.

DD驱动器通常具有128kB的物理高速缓存或更多。

     为了获得最佳性能128 kBis从磁盘一次以四个ECC块的形式读取。

打开纹理数据库文件,禁用操作系统(OS)文件缓存。

(在Windows上使用CreateFile withFILE_FLAG_NO_BUFFERING)。

非缓存读取用于避免内存和文件系统缓冲区污染。

在具有严格的内存限制的系统上,

由于大量地理空间纹理数据的流量不断增长的文件缓存

可能会导致应用程序数据(例如几何)的其他部分被交换出内存,

这可能会对性能产生负面影响。

     当传输大量数据时,通常应用程序本身只能缓存必要的数据。

所有的应用程序知道或者可以预期数据访问模式比操作系统好多了。

当一次读取整个128 kB块时,可能还没有一些额外的纹理数据被读取,

并不是立即需要的。

然而,利用良好的数据库布局,128 kB块可以包含尽可能多的有用的纹理数据。

     此外,使用高效的缓存系统,

最小量的存储器用于对任何不立即使用的纹理数据进行时间检测,

从而不需要再次从磁盘中传输.

DVD播放器的速度通常从1x速度到16倍速1x速度DVD播放器

具有11.08 Mbps(1.32 MB / s)的最大吞吐量,

16x速度的DVD播放器的最大输出功率为177.28 Mbps(21.13 MB / s)。

但是,对于某些DVD播放器,只有从磁盘的外边缘读取数据时,才能实现最大的输出。

DVD光盘直径为120毫米(mm)或4.72英寸。

DVD数据区距离中心距离24mm,距离中心不超过58mm。

所有扇区具有相等的长度,并且一些DVD播放器以恒定的角速度旋转盘。

因此,在数据区的内边缘和外边缘之间每秒通过读取头的扇区数量可能达到2.4倍的差异。

这可以导致基于将要读取的数据存储在DVD上的位置的显着的吞吐量差异。

如果没有实时流式传输的DVD上的其他数据,则将此数据靠近磁盘的中心。

    将数据实时地传输到纹理数据库,尽可能靠近DVD的外边缘。

尽管有更快的DVD驱动器,但平均DVD寻道时间通常为100毫秒或更长。

对于短距离寻找玩家有时可以跳过几个ECCblocks相对较快。

然而,更长的距离寻求,这需要显着移动的DVD播放器读头,通常是非常耗时的。

非常重要的是尽量减少寻求,因为任何时间花费在寻找相当于浪费带宽。

因此,重要的是设计一个纹理数据库布局,

最大限度地减少所需的搜索  以加载  渲染 任何特定场景  所需的 所有 纹理 数据。

通常更重要的是最小化搜索的数量,而不是最小化搜索距离。

随着读取头必须进一步移动,寻找时间可能会变长,

但是由于读取头必须重新聚焦,

所以任何搜索至少造成  潜 在 带宽 的 重要基础 被 浪费。

      特定的数据库结合一次读取128 kB块可能会导致读取的数据不可用。

就像寻求一样,这也是浪费带宽。然而,在寻找和潜在阅读无用的数据之间有一个平衡。

在这两种情况下,带宽都被浪费,但是读取一些百分比的无用数据可能会避免寻找,

这通常会导致更大的带宽浪费,因为读取头必须重新聚焦。

比寻找更糟的是DVD层交换机-layerDVD。

如果可能的话,最好不要使用双层DVD,但是如果额外的空间是必需的,

应用程序不应该从双层DVD的两层读取数据,而在Streamtex数据3。

纹理数据库布局要实现视图相关的纹理级别的细节,

需要一种能够以不同分辨率表示纹理不同部分的层次结构。

有不同的方法来渲染非常大的纹理。

然而,几乎所有的方法都采用mipmap链或纹理金字塔的形式[5]。

Mipmaps是预先过滤的收缩样本纹理,伴随着旨在减少别名的全分辨率纹理

       通过允许快速访问过滤的较低分辨率版本的纹理,在渲染过程中发生变化。

每个渲染像素从一个或多个从mipmap层次结构的一个或多个层次取得的纹素样本派生。

特别是texel样本取自mipmap级别,并且是与屏幕上渲染像素最接近的1:1映射的直接邻居。

当处理非常大的纹理时,mipmap级别通常被分解成可以独立流式传输的manysmaller块。

虽然级别的数量取决于解决方案,

但是各个瓦片通常也具有自己的mip映射链,

以允许对当今图形硬件进行过滤。

下面的图像显示了介绍中描述的情况的纹理金字塔。

当在地形上移动时,视点周围的纹素的可见正方形

通常不会使用纹素的行和/或列进行更新。

当视点在一个方向上移动得足够远时,相应地更新瓦片的行和/或列。

在磁盘上存储磁贴的顺序对于基于当前视频或视图点的更改流式

传输图块时的吞吐量具有显着影响。

优化磁盘存储在磁盘上的顺序可以显着减少浪费从一个磁贴到另一个磁盘的时间。

最常用的存储和排序磁贴的结构是四叉树[6,7]。

在四叉树结构中,矩形区域被递归地细分为四个统一象限。

     

    以下图形以线性顺序和四叉树顺序显示一层瓦片。

每个单元格的位置表示瓦片的空间位置,单元格中的数字表示磁盘上的瓦片。

1 2 3 4 5 6 78 9 10 11 12 13 14 1516 17 18 19 20 21 22 2324 25 26 27 28 29 30 3132 33 34 35 36 37 38 3940 41 42 43 44 45 46 4748 49 50 51 52 53 54 5556 57 58 59 60 61 62 630 1 4 5 16 17 20 212 3 6 7 18 19 22 238 9 12 13 24 25 28 2910 11 14 15 26 27 30 3132 33 36 37 48 49 52 5334 35 38 39 50 51 54 5540 41 44 45 56 57 60 6142 43 46 47 58 59 62 63

线性顺序四叉树顺序瓷砖的线性排序

没有寻找在阅读一个rowof瓷砖之间 需要 瓷砖。

     然而,当阅读一列瓷砖时,每个瓷砖需要长时间的寻找。

随着纹理大小的增加,列的两个瓦片之间的这些距离也变得越来越大。

四叉树排序使查找次数和搜索距离最小化。

当通过一次读取4个连续的块的块来精确地读取一行或一列瓦片时,

需要为行或列的每两个瓦片进行寻找。换句话说,当读取4个连续瓦片的块时,

在读取一列或一列瓦片之间的所需寻找次数没有差异。

此外,当使用许多连续码读取较大的块时,寻找的次数显着减少,

同时读取尽可能多的有用的块。结构在读取N×N个瓦片的整个平方时是最有效的,

例如当视点被立即移动时到一个全新的位置。

然而,当需要在视点的可见边界的一侧需要读取多个行和列时,访问也将变得更加有效,

例如由于某种原因,流不能跟踪。视图周围的纹素的可见正方形点都是移动的观点。

     换句话说,mipmap链的不同层的Tile需要同时流动,

其中从一层传输的瓦片的数量是  直接 从 下面从图层流出的瓦片数量的两倍。

为了减少mipmap链层之间的寻道量,  可以将 层间 存储在磁盘上。

5 20 2510 15 30 3540 45 60 6550 55 70 751 2 6 7 21 22 26 273 4 8 9 23 24 28 2911 12 16 17 31 32 36 3713 14 18 19 33 34 38 3941 42 46 47 61 62 66 6743 44 48 49 63 64 68 6951 52 56 57 71 72 76 7753 54 58 59 73 74 78 79层  N层N + 1

 上图显示了四较高细节层的瓦片直接存储在层的每个瓦片上。

在这个例子中,只有来自两个层的瓦片被交错,

但是可以以相同的方式存储任何数量的层的瓦片。

降低带宽和存储要求下图显示了硬件级别的流媒体流水线。

根据手头的系统,硬件组件的带宽可能不同。

然而,各种组件的相对带宽通常不同于相同优化策略适用于各种硬件组合的程度。

在该特定流水线中,使用16x速度的DVD驱动器。

忽略寻道时间,16倍速DVD驱动器的峰值吞吐量为21 MB /秒。

这相当于未压缩RGB数据的每秒7兆兆赫(MT / s)。

         然而,这种吞吐量在实践中不能实现,其中一定量的寻找是不可避免的,

并且可能浪费带宽提供无用的数据。

DVD驱动器通过UDMA / 33连接到ATA适配器,最高可达33 MB / s。

一旦DVD播放器将数据传输到ATA适配器,基本上是一个明显的转变,

因为带宽远远大于管道。

CPU和内存之间的带宽通常为每秒许多GigaBytes(GB / s),

PCI-Express 16x最多可达4 GB / s。

GPU和图形内存之间的带宽通常甚至更高。

      与流水线中的其他组件相比,DVD带宽非常低。

高性能流媒体的关键是通过查找数据存储大小,

高速缓存大小和处理时间之间的正确交易来最大限度地减少流水线瓶颈的带宽需求。

纹理数据以磁盘形式从磁盘流式传输。

为了对今天的硬件进行适当的过滤,各个瓦片通常需要一个或多个mipmap。

为了减少从DVD流出的tiledata,可以在飞行中生成瓦片的mipmap。

一个简单的boxfilter可以用于生成非常快速的mipmap,通常会导致良好的性能。

使用Intel Core 2 Extreme的一个核心,可以以高达400 MT / s的速度生成mipmap。

通过使用压缩,可以进一步减少每个磁贴需要流式传输的数据量。可以使用许多不同的压缩算法,如JPEG,JPEG2000和HD-Photo。

然而,减压需要非常快,以便不会成为管道中的瓶颈。

对于质量,压缩比和压缩速度之间的良好交易,

可以像[8]中所述使用类似JPEG的格式。

这种格式的解压缩使用Intel Core 2 Extreme的一个核心可以达到190 MT / s的速度。

尽管GPU和图形存储器之间存在很多可用带宽,

但在光栅化期间可能会访问多个数据纹理数据。

因此,最小化GPU和图形存储器之间的带宽要求仍然是重要的。

       今天的大多数图形卡允许纹理以各种压缩格式进行存储,

这些压缩格式在光栅化期间在硬件中即时解压缩。

大多数显卡支持的一种这样的格式是S3TC,也称为DXT压缩。

缩小的纹理大小增加了渲染性能,因为从内存中获取纹理数据所需的带宽较少。

由于DXT压缩,某些质量可能会丢失。

然而,缩小的内存足迹允许使用更高分辨率的纹理,使得在质量上可能存在显着的变化。

如[9]所示,DXT格式的实时压缩可以使用Intel Core 2 Extreme的一个核心以200 MT / s的速率执行。

一些纹理数据可以在流水线的各个点缓存,从而显着提高流性能。

下图显示了硬件中的流媒体流水线,其中纹理数据被缓存在管道中的各个点。

视点周围的纹素的可见正方形为2048×2048个纹素。

128 x 128纹素的相对较小的tileize用于最佳的CPU高速缓存使用(<256 kB)。

      换句话说,每个可见的方形纹理元素有16×16个瓦片。

这些瓷砖是用mipmaps,DXT压缩的图形存储器存储的。

有5个这样的正方形直到32k x 32k的分辨率,

因此在图形存储器中存储总共11MB的DXT压缩的瓦片用于渲染。

最小细节层是2048 x 2048纹素,与该图层的视点的纹理像素的可见平方相同。

因此,完整的最低细节层总是在图形存储器中可用,并且只需要在启动时一次通过管道。

小的低细节层被保持在存储器中压缩,使得它们不必实时地从DVD进行最佳化。

4k x 4k层是48 MB,没有mipmap,并以10:1的压缩率存储,结果约为5 MB。

8k x 8k层是192 MB,无需图像,甚至在10:1的压缩比下也会消耗相当多的内存。

为了减少内存使用,8k x 8k层相对于4k x 4klayer存储为亮度增强。

要从8k x 8k层解压缩瓷砖,4k x 4k层的四分之一瓷砖首先用移位的双三次过滤器进行标定2倍。

接下来,相对亮度被解压缩并被添加到双向上变频滤波片的亮度。

使用Intel Core 2 Extreme的一个核心,2xshifted双三次高速运行速度为120 MT / s,

亮度减压速度为300 MT / s。

只有存储8k x 8k层的亮度增强才能产生超过20:1的相对压缩率,

因此只需约9 MB就可以将该层存储在内存中。

随着亮度的增加,亮度细节的损失很小,但色度细节可能会有一些损失。

然而,这个较低细节层的纹理只能在一个距离处可见,在该距离处,

色度细节的损失不是或几乎不显现

  。两个最高的细节层是从DVD流式传输的唯一两层。

存储器被存储在磁盘上以最小化寻求网络所浪费的时间量。

对于来自第二高细节层的每个图块,来自最高细节层的4个图块从磁盘读取。

然而,在任何给定的时间,仅需要从最高细节层读取的四分之一的瓦片用于渲染。

它们可以被缓存,而不是丢弃任何不是立即需要的任何tile,

而不必像视图移动一样再次从磁盘流式传输。

从第二高细节层的每个16 x 16瓦片,最高细节层的32 x 32瓦片从磁盘读取。

       只有来自最高细节层的32 x 32tiles的中心16 x 16瓦片才能立即用于渲染,

但是所有32 x 32瓦片都可以以压缩形式。

为了避免在视图点移动时重新使用缓存的橡皮筋,缓存大到足以容纳36 x 36个压缩的瓦片。

这些36 x 36瓦片在内存中以10:1的压缩比或更高的压缩比保持压缩,最终导致大约6 MB的内存。

最终的结果是,只有11 MB的图形内存被用于渲染目标纹理。

在主内存中有11 MB的DXT压缩瓦片的另一个副本,

在上传到图形卡之前,瓦片首先在视图点移动时更新。

此外,存储在内存中的总共有20 MB的压缩瓦片显着提高了流式传输性能。

       多线程增加吞吐量此处呈现的纹理流媒体解码方法从磁盘读取数据,

然后将其解压缩并重新压缩。

如果此过程被序列化,则吞吐量受到此流程中完成所有步骤所需的时间的限制。

即使使用非常快的去压缩器和压缩器,流水线中的每个步骤的时间也快速增加,

并且吞吐量通常不足以很快地快速流入高保真渲染。

纹理数据库以形式存储独特的纹理许多较小的瓷砖。

因此,通过在不同的瓦片上独立地进行每个步骤,

可以并行地从纹理流传输流水线运行不同的步骤。

     以下图像显示了完整的流水线分解了漏洞的线程,从流式传输数据到磁盘到图形驱动程序。

目前的图形驱动程序不能从多个线程进行协调,或者需要先进行同步。

因此,只有一个线程与图形驱动程序通信,这是对方。

驱动程序本身通常也是线程线程管道不会改进流式传输各个瓦片的延迟。

   然而,分割线程中的流水线可以显着提高不断地对不同的瓦片进行流化的吞吐量。

瓦片的流式,解压缩和重新压缩可以分成两个线程。

通过多线程,解压缩时间通常完全隐藏在从磁盘传输压缩数据所花费的时间,

因为解除压缩比从磁盘读取数据快得多。

当从磁盘读取新的磁贴时,解压缩线程可以解压缩并重新压缩已经被读取的磁贴。

另外,流式线程在等待DVD驱动器时不做任何工作,产生CPU时间到解压缩线程。

流线程基本上实现异步读取。

由于数据被复制到外部,因此通过操作系统不使用异步读取时,内存和CPU的使用率可能会更高。

而不是使用本身可以使用异步读取的流线程,解压缩线程也可以直接使用异步读取。

但是,使用单独的线程可以使流媒体容易地被调节,而解压缩线程则保持紧凑的片断。

      单独的流线程还允许随时间进行多个数据查询的动态排序,使得搜索时间最小化。

解压缩和重新压缩可以分别在单独的线程中运行。

但是,当前的CPU足够快,从而使解压缩可以在单个CPU /内核上运行,

而不会在管道中出现瓶颈。

此外,使用多个线程进行解压缩,不会降低整体CPU使用率。

结果对于总是完全存储在存储器中的最低细节层,除了其他层的所有图块都需要由CPU处理。

来自4k x 4k层的瓷砖,以及从DVD制成的瓷砖,以JPEG格式存储。

这些瓦片首先需要解压缩,然后mipmap必须被生成,最后 mipmap 链需要被压缩成DXT格式。

下表显示了一个磁贴在上载到图形内存之前执行的步骤。

该表还显示了每ti的输入和输出数据

   每个步骤以及可以在Intel Core2 Extreme的单个核心上生成或处理纹素的速度。

规则瓷砖步骤输入/平铺输出/平铺MT / s1。

类似JPEG的解压缩

二进制数据16384 纹理1902. Mipmap

生成16384纹理

5461纹素4003. Mipmap链的DXT压缩

21845纹理二进制数据200

如果这些步骤在单个核心上依次执行,

则导致78 MT / swh的吞吐量相当于每秒4782瓦。

     8k x8k层的瓷砖涉及更多的工作。

相对于4k×4k层的瓦片,这些瓦片作为亮度增强存储。

下表显示了在将8k x 8klayer上传到图形存储器之前生成图块所需的步骤。

亮度块步进输入/平铺输出/平铺MT / s1。

JPEG样的解压缩

  二进制数据16384  纹理1902.四分之一瓦片的两 倍2x高档4096纹素16384纹素1203.亮度解压缩二进制数据16384纹素3004. Mipmap生成16384纹理5461纹素4005.映射链的DXT压缩  21845纹素二进制数据200

如果这些步骤在单个核心上依次执行,

这导致55Mbps的吞吐量等于每秒3357瓦。

大多数瓦片以78MT / s的速度被处理,

并且只有来自8k×8k层的瓦片被处理在55MT / s,

但这些瓦片的更新频率较低(比16k x16k图层的瓦片少2倍)。

以每小时80英里的速度全面显示地形,需要以8 MT / s的纹理数据输出。

       换句话说,只有一点点超过10%的CPU时间的英特尔酷睿2极限才能处理纹理数据。

大部分数据从两个最高的细节层以6 MT / s(= 275瓦)读取/秒)。

在平均压缩比为14:1的情况下,每个磁贴不存储mipmap,

这样就可以获得每秒需要从DVD流式传输的1.25兆字节值。

另外,在相同的压缩比下,大约有30到40个瓦每个128 kB块从DVD读取。

在实践中,从DVD流出的大约一半的瓦片被丢弃并且如此浪费。

这导致每个搜索至少读取15到20个有用的瓦片。

   References1。 120 mm DVD - 只读DiskECMAStandard ECMA-267,

第3版,2001年4月可在线获取:

http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-267.pdf2

DVD FAQJim TaylorDVD Demystified,2007年1月9日在线可用:

http://www.dvddemystified.com/dvdfaq.html3。优化DVD性能Windows游戏Microsoft游戏技术GroupDirectX SDK,2006年4月可在线:

Microsoft Learn: Build skills that open doors in your career

访问DVD和CDROMs上的多媒体内容Rich WintertonIntel软件网络,

2006年7月18日可在线获取:

http://www.intel.com/cd/ids/developer/asmo-na/eng/167202.htm?page=15

Pyramidal ParametricsLance WilliamsComputer Graphics,

第17卷,

第3期。1983年7月可在线获取:http://www.cse.ucsc.edu/classes/cmps160/Fall05/papers/p1 -williams.pdf6。

四叉树和相关的分层数据结构Hanan SametACM Computer Surveys 16(2),pp。

187 - 260,June 1984可在线获取:http://www.cs.umd.edu/~hjs/pubs/SameCSUR84.pdf7

分层空间数据结构韩南沙岛第一届大型空间数据库设计与实施研讨会,Santa Barbara,Ca,US,pp。193 - 212,July 1989可在线:Home Page of Prof.Hanan Samet酒吧/ SametSSD89.pdf8。实时纹理流和解压缩J.M.P。 van WaverenIntel软件网络,2007年4月可在线获取:http://softwarecommunity.intel.com/articles/eng/1221.htm9。实时DXT压缩van WaverenIntel软件网络,2006年10月可在线获取:http://www.intel.com/cd/ids/developer/asmo-na/eng/324337.htm

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值