类别: 开发

你所有的 VRAM 都属于我们 (bob体育竞技和插件)

我在矩阵中学到的一件事是,用户经常发现新的错误比现有的更烦人; 用现有的错误换一个新的错误通常被视为一个大的倒退,即使新的错误没那么糟糕。我认为这只是人类的本性 -- 我们习惯了一些事情 -- 这是人类所做的 -- 这消除了一些已经存在了一段时间的虫子的刺痛。

我提出这个来在上下文中提出纹理分页、模糊纹理和 VRAM 管理在 11.50 中的问题。为了理解是什么让 VRAM 分页变得困难,你必须理解 OpenGL 驱动程序是如何解决这个问题的,并问问你自己: 什么是旧错误,什么是新错误?

什么是纹理分页?

纹理分页是当纹理在显卡 (VRAM) 内存和计算机内存 (“系统内存”) 之间移动时。在任何给定的时间,X-Plane 可能加载的纹理比你可以放在卡上的要多,但是它不需要一次全部加载。当你飞行时,需要不同的纹理,并且纹理必须四处移动。

如果这听起来很像将数据从 RAM 移动到硬盘 (虚拟内存),那就是。当我得到 “当我只有 2gb 卡时,X-Plane 如何使用 2.5 GB 的纹理内存” 的问题时,答案是…… 纹理分页。

OpenGL 驱动程序是如何做到的?

在基于 OpenGL 的应用程序中,对 VRAM 和 back 的分页纹理完全取决于 OpenGL 驱动程序。该算法是这样的:

  1. 开始绘图。
  2. 意识到你需要的东西在系统内存中。
  3. 将你有一段时间没用过的东西移出 VRAM。
  4. 将你需要的东西移动到 VRAM。
  5. 继续绘图。

当我们需要一些新的东西时,OpenGL 驱动程序会在绘图过程中显示页面,结果是口吃 -- 帧需要更长的时间,因为在纹理移动到 VRAM 之前,它无法完成。

现在,英伟达、 AMD 和苹果已经花费了大量的时间和精力来尽可能地完成这项工作, 我肯定是在卖空司机的复杂性和复杂性,因为他们试图猜测什么应该从 VRAM 中转移出来。尽管如此,有两个关键事实是正确的:

  1. 如果我们需要将内容页面放入 VRAM 中进行绘制,我们直到就在我们需要的时候,就要有一口吃。也许是一个你几乎没有注意到的非常短的,也许是一个非常糟糕的,这是一个 “多少” 的问题,而不是 “如果” 的问题。
  2. 你在屏幕上看到的总是看起来棒极了 -- 从不模糊 -- 因为驱动程序不会削减分辨率来保存 VRAM。

所以… 在这种情况下,旧的错误是口吃,因为 VRAM 包含了错误的内容。

X 平面 11.50 是如何做到的?

对于 Metal 和 Vulkan,这取决于我们这个应用程序,来决定什么在 VRAM 中,什么不在,并安排数据在 VRAM 和系统内存之间的移动。我们的策略是:

  1. 留意有多少内存是免费的。
  2. 如果它看起来太接近满,将纹理缩小到更小的尺寸。更喜欢收缩你不看的纹理。在背景中做收缩。
  3. 如果它看起来像 VRAM 有空的空间,生长纹理,更喜欢你现在看到的。在后台做生长。
  4. 如果我们必须在背景中加载新的纹理 (例如,当你飞行时新的 DSFs),等到旧的纹理可以收缩。

在这个游戏中,我们比司机有巨大的优势: 我们知道我们的纹理可能在我们真正需要它们之前很久,未来就需要了。我们也可以收缩纹理。这意味着我们不需要停下来洗牌,这意味着我们可以避免口吃。所以我们可以修复旧的错误: 飞行时口吃。

(明确一点: 当你飞行时,这不是飞行中口吃的唯一来源 -- OpenGL 和 11.41 充满了口吃。)

缺点是: 如果 VRAM 变紧,我们会降低一些纹理的分辨率。这是一种新的行为 (模糊的纹理),所以我担心的是: 用户不会喜欢它。

特别是,OpenGL 驱动程序使用精确的每一帧的最佳纹理集-以口吃为代价。当你飞行的时候,我们可能不会让东西以最好的方式收缩和生长,所以对于同样的 VRAM 和没有口吃,我们可能不会那么敏锐。

插件怎么样

使用 OpenGL 的附加组件 (例如带有定制玻璃显示器的飞机) 也使用 VRAM -- 这是我们不能打包的原因之一100%VRAM 与我们的纹理; 我们需要有足够的自由,如果一个插件需要 VRAM,它不会崩溃我们。

我的期望是,对抗由于 VRAM 耗尽而导致的模糊纹理和崩溃将是一个漫长的迭代过程,也是进行 beta 测试的主要原因之一。有一个在实验室或纸上运行良好的算法是一回事 -- 在现实世界条件下,在用户机器上有成千上万个小时的测试时间是另一回事附加组件和无政府状态。

所以当 11.50 是公共测试版,你看到你模糊的纹理时,不要惊慌。VRAM 管理是 X-Plane 的一个非常新的部分,它是一个非常重要的部分,我们将随着时间的推移不断重复它。

(最后,我想提一下,虽然 Vulkan/Metal 的港口是西德尼和我合作的合资企业, 在它的某些部分,西德尼基本上做了 100% 的工作,我唯一的贡献就是抱怨错误。着色器编译器、 OpenGL 插件桥和 VRAM 寻呼机都是西德尼自己做的大提升,使得 Vulkan/Metal 端口成为可能。)

张贴在显影 | 148 条评论

Vulkan/Metal 公共测试版将于 2020年

当我宣布在我之前的帖子中,X-Plane 11.50 以本地 Vulkan 和金属驱动程序支持为特色,是由我们的开发人员组成的私人测试版 (E. g. 第三方开发者)。我们从他们那里得到了一些非常好的错误报告 -- 报告是好的,而不是错误 -- 基于此, 很明显,11.50 今年 (意味着明天) 不会上市。

这让我们很失望 -- 我们在两端都烧了蜡烛,试图在今年一路进入公共测试,但是在这一点上,建筑还没有准备好。

我将在下面详细描述真正阻碍公共测试版的一个错误,明天我将尝试做一个关于 Vulkan 和 Metal 的常见问题解答; 基于上一篇文章的 150 多条评论,我认为很明显,我们有很多基本信息要传达,其中一些直到最近才与第三方开发人员共享。

请不要用 “我可以进入私人测试版吗” 来轰炸我 (或者甚至 “你因为不让我进入私人测试版而成为一大群驼鹿”)。关于私人测试版的事情是这样的: 我们的目标是杀死错误,这样每个人都可以使用测试版,并尽可能快地杀死它们。

在这一点上,十几个正在使用测试版的第三方开发人员生成错误报告的速度比西德尼和我修复它们的速度快 -- 如果我们在测试版中增加更多的人, 我们的错误修复速度将会变慢,因为我们不得不花更多的时间来对即将到来的报告进行分类。因此,只要我们有效地修复了最糟糕的漏洞,更多的人进入私人测试版意味着每个人都要等待更长时间才能进入公共测试版。我认为对西德尼和我来说,最好的事情就是尽快解决问题。

(我认为将它交到第三方开发人员手中也是一种胜利 -- 在某些情况下,我们已经看到插件意外地使用了错误的 api 进行处理,因此不兼容使用 Vulkan 时,他们不需要-开发人员可以得到更新此代码的开端。如果你是第三方开发者,我们可以让你进入测试程序 -- 我不想让一些第三方开发者偏爱其他人。

模糊纹理

我们内部测试版的性能反馈的简短总结可能是这样的: 平滑度和 FPS 是好的,VRAM 管理不是。

我们所看到的飞行中的大多数崩溃看起来像是 sim 耗尽了 VRAM 并且无法恢复,对于使用较小 gpu (例如 4 GB VRAM) 的用户来说 x-Plane 进入一个紧张的 VRAM 情况,并通过使屏幕上的一切低分辨率和模糊来解决它。

VRAM 管理路径是为 Vulkan/Metal 后端编写的全新代码,是…… 嗯,它是全新的,需要一系列测试, 调试和迭代以获得稳定。在 8gb 卡上,VRAM 是如此丰富,以至于 X-Plane 有点天真的 VRAM 分配方案工作正常。在 4gb 卡上,我们只是有点短 (几百 MB),但结果是纹理分辨率的惊人损失。

这是我们可以做得更好的东西!它在我们的控制之下,因此现在正在进行。(西德尼写这篇博客,而他在这里完成了真正的工作。)但是,在我们有更好的 VRAM 管理之前,现在上市还为时过早。如果我们这样做了,我们只会被数百份 “我的纹理模糊不清” 的报告淹没。它太吵了,无法运输bob电竞官网。

为什么这不是 OpenGL 上的问题?

有人可能会问: 你为什么不做任何事情来管理 VRAM 呢?问题是: OpenGL 的解决方案是口吃。

OpenGL 驱动程序根据您现在真正需要绘制的内容,在 VRAM 和系统内存之间交换纹理。如果你把目光从西雅图移开,太空针塔的纹理可以存在于系统内存中,但是你可能需要雷尼尔的山地纹理。

我们也尝试这样做-最大的区别是:停止渲染当它移动纹理时,我们不会。其结果是,OpenGL 总是显示您所选择的纹理分辨率的完美图像-没有模糊的图像。但是你可能会口吃!如果你在 VRAM 的边缘,通过飞行,然后改变视图或在相机周围盘旋,你可以看到这一点 -- 如果你的 FPS 去 “块 VROOOM”,你吃了一些口吃,而纹理四处移动, 然后你又跑得很快。

OpenGL 的方式是一个我们从未想过可以接受的解决方案 -- 我们的目标是最好的图像质量没有牺牲平滑。解决低 VRAM 的情况需要更多的时间,但是一旦我们到了那里,我认为这是值得的。

张贴在显影,新闻 | 116 条评论

Vulkan 和 Metal: 测试和 Bug 战斗

上周,我们向外部发送了我们的第一个 Vulkan/Metal ready X-Plane (将是 11.50 版),昨晚我们发送了第一个私人测试版。

我们的计划是,一旦我们对构建的运行情况有了一些反馈,我们将很快进入公开测试。这将取决于错误报告; 我正在祈祷。

它是如何工作的

在 X-Plane 11.50 中,渲染设置中有一个启用 Vulkan 或 Metal 的复选框; 您必须重新启动才能使更改生效。如果 sim卡崩溃真的很早(例如,在主菜单之前) 它将恢复到 OpenGL 以防止你被 “锁定”,但是飞行时随机崩溃不会这样做。还有命令行覆盖来控制运行性能测试场景的人员的驱动程序。

我还应该提到,我们已经改变了反射滑块的功能 -- 它现在就像 X-Plane 10,并且不试图实时更新环境立方体地图。(如果你真的就像以 5 fps 飞行一样,您可以在 settings.Txt 中重新启用这一点 -- 底层技术尚未被删除。)

在过去的几年里,我们发现用户会将每个滑块都向右拖动,然后对 sim卡的性能不佳感到惊讶。虽然我过去轻蔑地声称他们做错了 (“不要把每个配料都放在你的比萨饼上”) 不可避免的事实是,我们违反了行业 UI 规范,让最高可能的设置运行在用户可以接触到的最快可能的计算机范围之外。

现在我们有了 Vulkan 和 Metal,我们可以对什么是实时的,什么不是实时的做出一些判断。全景影仍然可用,并得到了 Vulkan 和金属驱动程序的帮助; 一台像样的机器应该能够以 30 fps 的速度运行完整的 autogen + 风景阴影。

Vulkan 和 Metal 后端改变了耗尽 VRAM 的方法。使用 OpenGL 驱动程序,当 VRAM 耗尽时,纹理会被移动到系统内存中,当驱动程序在最后一刻进行疯狂的洗牌时,应用程序会口吃。

当使用金属和 Vulkan 运行时,当你在背景中飞行时,X-Plane 会降低你的纹理分辨率,没有口吃, 宁愿减少目前没有使用的纹理分辨率。结果应该更平稳,通常破坏性更小。你仍然可以降低整体纹理分辨率,以更好地适应您的卡的预算。

这个新的 “动态寻呼” 是…… 嗯,它是全新的,我怀疑它需要在测试期间进行大量调试。这是一个我们只需要收集用例数据来更好地调整算法的领域。

X-Plane 11.50 不再允许未压缩的纹理 -- 如果磁盘上存在 DDS,我们将使用它。我必须以最强烈的措辞推荐纹理压缩; 虽然人工制品很烦人,但当我们关闭它时,一切由于 VRAM 压力,看起来更糟 -- 未压缩不是使用我们 VRAM 预算的好方法。预压缩你的纹理最好的结果!

详细视图

使用 Vulkan/Metal 后端运行的一大好处是渲染路径中没有任何暗物质 -- 当我们这样说时,所有需要时间的事情都需要时间。这意味着当我们有口吃时,我们可以把框架拆开,弄清楚为什么会这样。

上周,在发送建筑之前的最后一次消防演习发生了 -- 在 Vulkan 后端和内存分页正常工作的情况下,我们仍然会看到这些剧烈的口吃在洛杉矶市中心上空盘旋。事实证明,代码删除当你飞离它时,autogen 速度太慢,每次不得不拆除一个 3千米银的正方形时,它都会导致搭车。

该代码现在被重写,结果更加顺利。以下是胜利的样子:

这是我的旧 iMac,运行速度为 60 fps -- 它不能在一切都透支的情况下做到这一点, 但是当它达到 60 fps 时,你会注意到顶部的死亡甚至橙色条 -- 这是一致的帧率。屏幕底部显示了当前帧渲染中的一些任务的框图。

删除了 “奇怪的司机行为” 后,当有东西口吃时,到目前为止我们已经能够识别它,例如上周的自动口吃。口吃是这样的:

你看到的橙色尖峰是口吃 -- 我在飞行时通过命令标签将这些诱导到其他应用程序; 当窗口管理器交换应用程序时,这是相当具有破坏性的。屏幕中间的大空白空间是我们花在做一些我们还没有跟踪的事情上的时间 (可能是在窗口管理器中)。

最后一张展示和讲述的图片: 由于某种原因,当以 45 fps 运行时,sim 实际上每隔一帧以 60 和 30 fps 的混合速度运行,这并不好。我们可以很容易地看到我们的工具:

在这里,我们可以看到两个框架,一个长的在左边,一个短的在右边。不同之处在于: “获取表面” 需要大量时间。长框卡住了,等待窗口管理器给我们一些 VRAM 来吸引我们。有了这种细节,我们至少可以理解这个错误并尝试修复它。

接下来的步骤

在这一点上,唯一剩下要做的就是修复错误,即使私人测试版退出,其中一些仍然是开放的。一旦我们有了一些我们认为最初的体验不是蓝屏和眼泪的东西,我们将转向公开测试。

张贴在显影 | 202 条评论

行文件的结束大写字母

这里有一个进入 X-Plane 11.35 的功能,对于极少数风景作者来说非常令人兴奋: 在 X-Plane 11.35 中,行文件 (。 lin) 可以在每一端都有自定义绘制的端盖,并且纹理重复可以与网格对齐。

已经深入 X-Plane 的风景系统的风景作者已经从第一段中知道为什么这是有用的, 但是对于在过去 30 天里见过太阳的正常人来说。Lin 文件是定义细线性特征外观的艺术文件。X-Plane 将它们用于机场环境中绘制的黄色和白色线条,但是开发人员可以将它们用于任何线性线条。

线文件重复,平铺,并可以沿着地面在贝塞尔曲线路径,这使得他们伟大的曲线滑行道线。到目前为止,他们的致命弱点是当队伍结束时,队伍就… 停止了。这使得它们不适合非常厚的用途,在这种用途中,线末端的硬 “切割” 会非常明显和丑陋。

在 X-Plane 11.35 中,您可以为每个线定义提供起点和终点。像线条本身一样,如果需要,它可以是多层的。因此,举例来说, 你可以用它在农村机场的建筑物之间铺设泥路 -- 在这条路的尽头,你可以在这条路上有一个 “软” 的结尾,而不用担心把这条线塞进去另一个隐藏切口的风景元素。

我们还没有在默认艺术中使用这些,但是代码已经完成,我已经更新了。Lin 文件格式规范使用新语法。

张贴在显影,风景 | 3 评论

附加开发人员: 请尝试 X-Plane 11.35 Beta 4

X-Plane 11.35 beta 4 现在正在运行我们的更新程序,并检查 “获取 betas”。发行说明这里

蒸汽用户:如果没有一夜之间发生大火的迹象,我们将在明天发布这个 -- 它已经上传到服务器上了。

附加开发人员:如果您在 11.35 中没有运行您的附加组件,请现在就测试它。所有可能有风险或奇怪的东西都已经存在,我们现在只是在消灭虫子。如果你的插件有兼容性问题,我们现在需要知道我们是否会在测试期间解决这个问题。虽然我们试图用旧的附加组件让一切 “正常工作”,但你的附加组件总是有可能做一些我们没有想到的特别的事情。请立即测试!

张贴在显影,新闻 | 43 条评论

FlightSimExpo 2019 Talk

这是我们上周 FlightSimExpo 2019 的主题演讲!

FSExpo 2019

埃文斯视频团队今年在 feed 方面做得非常出色 -- 一切都以高质量直播,talk 直接向幻灯片和高质量音频提供了反馈。完全是我们所希望的!

张贴在显影,新闻 | 19 条评论

WED 2.1 Beta

你现在可以抓住这里的 WED 2.1 beta。这是一个带有错误修复和增强功能的小更新,例如将外观预览扩展到所有类型的外观和地图窗口。你也可以在这里阅读迈克尔的扩展发行说明

新的元标签识别 2D 或 3D 机场

我们想让您特别注意 11.30 或更高出口目标的新 “2D” 或 “3D” 元标签。这个标签告诉 X 平面图形用户界面将机场列为 “2D” 或 “3D”。

在 X-Plane 11.35 之前,X-Plane airport 选择菜单中 “功能” 列中的信息来自任何用户自定义风景目录中的风景,而不是资源/默认风景/默认 apt dat/目录中系统范围的 apt.dat 中的条目。假设任何阿登机场都会一直成为 3D。但是从 X-Plane 11.33 开始,所有的全球机场,甚至那些只有 2d 布局的机场,现在都包括在内
在全球机场 -- 这使得 X 平面图形用户界面有效地将每个机场列为 “3D”。

在出口,WED 2.1 将分析 3D 内容的场景,并寻找元标签 “GUI 标签” 的存在。如果出口目标是 11.30 或更高,它会警告标签是否丢失或设置不当,最终由设计者决定他们希望机场如何在 X-Plane 中列出。如果目标是 “网关”,它将强制创建或更新该元标签,以始终根据导出的实际场景正确设置。

为了修复 X-Plane 11.35 及更高版本中未通过网关提交的任何场景的 2D/3D 显示, 作者需要通过 “机场-> 添加元数据” 手动添加标签,然后重新导出到 X-Plane 11.30 或更高的目标。

张贴在显影,新闻,风景 | 7 条评论

Vulkan 和金属: 它运行!

自从我上次Vulkan 更新,我们现在有完整的 sim卡本地运行 Vulkan 和金属!为了实现这一目标,仍然有一个相当大的随机列表被关闭或绕过,但是我们可以在驾驶舱飞行并使用 sim卡。

以下是一些正在工作的东西:

  • 使用常规和 HDR 渲染,以及金属上的 SSAO。
  • 在 AMD 、英伟达和英特尔驱动程序上与 Vulkan 一起飞行。
  • OS X 上的硬件立体渲染 -- 在金属之前从未存在过,因为 Mac GL 驱动程序不支持它。硬件立体渲染对于 VR 支持是必要的。
  • 金属上的 MSAA -- 通过对我们代码的重组,您将能够在不重启的情况下更改 MSAA 设置。我不知道这个代码现在是否在 Vulkan 上工作; 可能。

这里有一些还不起作用的东西:

  • 插件现在被绕过了。我们还没有编写插件-OpenGL-互操作层。
  • VR 仅在使用 OpenGL 作为驱动程序时工作; 我们需要编写一些新的 VR 代码,将金属和 Vulkan 帧直接传递给 OVR 和 Rift api。
  • 截图/电影捕捉是一项正在进行的工作 -- 这就是我本周一直在做的事情。

我们仍然有许多视觉错误,所以截图是一个重要的功能,所以我们可以运行我们的自动化测试系统。测试系统在许多配置中拍摄了数百张 sim卡截图,并将其与 11.30 进行比较,以捕捉新 Vulkan 和金属后端引入的错误。显然,我必须先解决我的颜色问题。

这个端口的一个有趣的方面: 金属和 Vulkan 副本Direct3d 的惯例其中视口的 Y 轴指向向下而不是向上。这导致了一系列奇怪的 “它又颠倒了” 的错误,其中大部分已经被修复。

世界被正确地描绘,但它周围的气氛是颠倒的。

(那架飞机可能看起来很傻,但至少全部图像始终颠倒。这是因为唯一剩下的颠倒代码是电影/截图捕获代码本身。)

下周我们应该会发布一些性能数据; 现在我们的主要关注点是修复错误,特别是导致整个机器瘫痪的错误。

这里还有一些在开发过程中出错的事情的照片。

张贴在卷盘,显影 | 71 评论

X 平面 11.33b1 现在出来

X-Plane 11.33b1 是一个增量更新,包括更新的网关机场和翻译、崩溃修复和诊断、小的用户界面改进和错误修复,例如:

  • XPD-9441 重量,平衡和燃料-总重量 (lbs) 不包括武器。
  • XPD-9683 在 FMOD 中修复欺骗银行崩溃的 sim卡。
  • XPD-9882 固定的 KOAK 导航数据。
  • XPD-9919 虚拟现实中的驾驶舱出现闪电。
  • 旧英特尔 gpu 上的 XPD-9991 崩溃。
  • XPD-9992 默认 FMC,保持模式将只飞行一次。
  • XPD-10003 着陆灯对电池电流消耗没有影响。
  • XPD-10007 固定滑球限制。

有关错误修复的完整列表,请参见此处的发行说明

只是提醒一下,sim 不会提示您安装此测试版 -- 您需要手动启动安装程序,并选择 betas 来获得此版本。

我们正在付出更多努力来清理频繁的撞车事故。我们最近将后端崩溃报告升级到一项昂贵的付费服务,我们希望这将使我们能够更深入地了解出了什么问题。此测试版包括用于此目的的额外崩溃日志记录。

为了解决崩溃问题,我们相信我们也修复了本次测试版中两个值得注意的崩溃: 英特尔 gpu 和重复 FMOD sound bank 的问题。我们听到很多英特尔用户对这些崩溃的看法,所以西德尼看了看,并找到了解决办法。FMOD 坠机事件已经有一段时间了,是由复制了一个包括 FMOD 在内的飞机文件夹造成的。当 FMOD 银行有同样的内容在不同文件路径的磁盘上,FMOD 不会加载它。我们现在优雅地处理这个案子。

更新:蒸汽用户可以通过选择应用程序属性下的公共测试版来获得 11.33b1。

张贴在显影,新闻 | 32 评论

Vulkan 和 Metal-快速状态更新

只是我们与 Vulkan 和 Metal 的进展的快速更新。几周前,我们最后一次在直播中谈到这个,但我们走得更远了。以下是总结:

  • 飞机制造商和翼型制造商经营 Vulkan 和金属。
  • X-Plane 在 Vulkan 和 Metal 中运行,直到主菜单 (例如,应用程序启动),但还不能飞行或显示风景。
  • Vulkan 和 Metal 代码在 Mac 、 Windows 和 Linux 上运行。
  • Vulkan 代码运行在英伟达、 AMD 和英特尔驱动程序上。
  • 所有着色器都被移植。
  • 所有 zoo 动物 (围绕图形引擎部分的抽象) 现在都完成了。自从直播以来,我们杀死了最后两三个。

在过去的两个星期里,西德尼和我一直在努力将所有渲染通道移植到新代码中,所以我们不必通过 OpenGL 来驾驶飞机。我为此损失了几天:

结果是一个单独的 if 语句,在其中一个移植步骤中,它在网格绘制代码中被反转, 导致一些跑道灯被随机的…… 见鬼,我从来没有发现什么是错误的网格,只是它来自 sim卡的其他不相关的部分,并随着相机的移动而改变。更糟糕的是,错误只出现在 Mac 上,所以我们不能使用 Windows OpenGL 调试工具来发现问题。

一线希望是,一旦我们都是 Vulkan/Metal,我们将至少有四个独立的调试工具来追踪这样的错误。

我们还没有性能的测量; 一旦我们可以坐在运行金属或 Vulkan 的 X 飞机上,我们至少可以得到一些初始性能数字。

张贴在显影,新闻 | 47 条评论