原文网盘由于本人英语3d图形图像领悟水平有限难免文章翻译有错误强烈建议看原文。超大地理空间纹理传输2007年4月17日J.M.P.范·波伦?2007Id SoftwareInc.抽象提出了一种允许流量大的高速流水线来自诸如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 Mbps1.32 MB / s的最大吞吐量16x速度的DVD播放器的最大输出功率为177.28 Mbps21.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级别并且是与屏幕上渲染像素最接近的11映射的直接邻居。当处理非常大的纹理时mipmap级别通常被分解成可以独立流式传输的manysmaller块。虽然级别的数量取决于解决方案但是各个瓦片通常也具有自己的mip映射链以允许对当今图形硬件进行过滤。下面的图像显示了介绍中描述的情况的纹理金字塔。当在地形上移动时视点周围的纹素的可见正方形通常不会使用纹素的行和/或列进行更新。当视点在一个方向上移动得足够远时相应地更新瓦片的行和/或列。在磁盘上存储磁贴的顺序对于基于当前视频或视图点的更改流式传输图块时的吞吐量具有显着影响。优化磁盘存储在磁盘上的顺序可以显着减少浪费从一个磁贴到另一个磁盘的时间。最常用的存储和排序磁贴的结构是四叉树[6,7]。在四叉树结构中矩形区域被递归地细分为四个统一象限。以下图形以线性顺序和四叉树顺序显示一层瓦片。每个单元格的位置表示 瓦片的空间位置单元格中的数字表示 磁盘上的瓦片。1 2 3 4 5 6 78 9 1011 12 13 14 1516 17 18 19 2021 22 2324 25 26 27 28 29 303132 33 34 35 36 37 38 394041 42 43 44 45 46 4748 49 5051 52 53 54 5556 57 58 59 6061 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和内存之间的带宽通常为每秒许多GigaBytesGB / sPCI-Express 16x最多可达4 GB / s。GPU和图形内存之间的带宽通常甚至更高。与流水线中的其他组件相比DVD带宽非常低。高性能流媒体的关键是通过查找数据存储大小高速缓存大小和处理时间之间的正确交易来最大限度地减少流水线瓶颈的带宽需求。纹理数据以磁盘形式从磁盘流式传输。为了对今天的硬件进行适当的过滤各个瓦片通常需要一个或多个mipmap。为了减少从DVD流出的tiledata可以在飞行中生成瓦片的mipmap。一个简单的boxfilter可以用于生成非常快速的mipmap通常会导致良好的性能。使用Intel Core 2 Extreme的一个核心可以以高达400 MT / s的速度生成mipmap。通过使用压缩可以进一步减少每个磁贴需要流式传输的数据量。可以使用许多不同的压缩算法如JPEGJPEG2000和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个瓦片。这些瓷砖是用mipmapsDXT压缩的图形存储器存储的。有5个这样的正方形直到32k x 32k的分辨率因此在图形存储器中存储总共11MB的DXT压缩的瓦片用于渲染。最小细节层是2048 x 2048纹素与该图层的视点的纹理像素的可见平方相同。因此完整的最低细节层总是在图形存储器中可用并且只需要在启动时一次通过管道。小的低细节层被保持在存储器中压缩使得它们不必实时地从DVD进行最佳化。4k x 4k层是48 MB没有mipmap并以101的压缩率存储结果约为5 MB。8k x 8k层是192 MB无需图像甚至在101的压缩比下也会消耗相当多的内存。为了减少内存使用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层的亮度增强才能产生超过201的相对压缩率因此只需约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瓦片在内存中以101的压缩比或更高的压缩比保持压缩最终导致大约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瓦读取/秒。在平均压缩比为141的情况下每个磁贴不存储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 Demystified2007年1月9日在线可用http://www.dvddemystified.com/dvdfaq.html3。优化DVD性能Windows游戏Microsoft游戏技术GroupDirectX SDK2006年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?page15。Pyramidal ParametricsLance WilliamsComputer Graphics译为 金字塔参数化技术Williams计算机图形学第17卷第3期。1983年7月可在线获取http://www.cse.ucsc.edu/classes/cmps160/Fall05/papers/p1 -williams.pdf6。四叉树和相关的分层数据结构Hanan SametACM Computer Surveys 162pp。187 - 260June 1984可在线获取http://www.cs.umd.edu/~hjs/pubs/SameCSUR84.pdf7。分层空间数据结构韩南沙岛第一届大型空间数据库设计与实施研讨会Santa BarbaraCaUSpp。193 - 212July 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