我如何绕过 SDL2 中的纹理和视频内存限制?
How can I get around the texture and video memory limitations in SDL2?
我测试了 SDL2 中的最大纹理大小和最大纹理数量,它限制为 23 个 16384 x 16384 像素的纹理。之后,根据我收到的 SDL_GetError() 消息,它用完了视频内存。
当然,AAA 级游戏在游戏世界中每帧显示超过 23 种 16384 x 16384 像素的纹理。那么他们如何在 运行 没有视频内存的情况下做到这一点?他们不能不断地从磁盘加载。它必须在游戏加载时已经保存到视频内存中。那么,为什么 SDL2 将我限制为 23 个 16384 x 16384 像素的纹理?有解决办法吗?
我正在编写一个 2d 游戏,想从一开始就加载整个游戏世界,这样玩家就不会在开始玩游戏时出现加载屏幕。
目前,我正在考虑的编程工作是每次玩家进入新区域时只重新合成大型游戏背景纹理,但其余游戏元素将在游戏开始时全部加载游戏。这样,只有几分之一秒的黑屏,在此期间为新区域重新合成大纹理。但考虑到我正在制作的游戏类型,我仍然希望在游戏过程中根本不需要加载或中断任何东西。我正在尝试制作一款完全身临其境的模拟游戏。
我刚刚实现并测试了每一帧的渲染图块。这是在相机视图中每层渲染 5100 个图块,每帧 2 层。因此每帧在屏幕上渲染 10200 个图块(纹理)。使用我的预渲染大纹理方法,它使帧速率从 60 及以上降低到 20。所以这证明了我的观点,即 CPU 的速度不足以迭代那么多元素,即使每个图块都是已经加载到 vram 中的纹理。与每帧渲染 5100 个较小的纹理相比,将 1 个大纹理区域渲染到屏幕上要快得多,即使这些纹理都位于在主游戏循环之前加载到一个纹理中的同一文件中。这就是我在与 HolyBlackCat 的讨论中试图表达的观点。
所以这又回到了我原来的问题post:我怎样才能绕过 SDL2 中的纹理和视频内存限制?
显存限制似乎与SDL2无关,而是与硬件(显卡)有关,这是有道理的。所以我会坚持我的解决方案,将游戏世界分成多个区域,每次玩家进入一个新区域时,它的大纹理都会被预渲染。
问题在于您创建的任何引擎中的管道。
你可以通过这段视频看到我以近 60fps 的速度推动 40,000 个移动物体。
https://www.youtube.com/watch?v=408DkNLuhUU
我是运行一个老系统。显卡是 rx570,频率为 3ghz cpu。
如果我不移动所有这些圈子,我可以推动更多。
该视频是关于我 运行 的 C++ 引擎的。
我制作了它的 python 版本,它以 60fps 的速度移动了 3000 个圆圈,或者围绕着你在 20fps.You 处的同一事物可以找到它 https://github.com/hayesgr/PySDL2-Engine
1秒生成4万房间地下城的同频道视频也能找到。它是基于瓷砖的,而且很大。
https://www.youtube.com/watch?v=yIqPJWl8afw&t=233s
16384x16384 图片大小为 1Gb。大多数视频卡上都装不下其中的许多。如果您使用这些更新,那将是非常昂贵的。
这里的重点是您正在寻找错误的解决方案来满足您的需求。
如果您查看我的引擎的 python 版本,您会发现它是基于状态的。
我的 C++ 引擎还使用 multi-threading 来处理移动和碰撞计算。如果我没有那些活动部件。我不需要 multi-threading 将其推送到屏幕。简而言之,我使用的 multi-threading 并不是纯粹为了减少计算时间而将内容推送到屏幕上。
如果我不移动它们,我可以将大约 50,000 个推到 60fps 的屏幕上。
如果你也看同一个频道,你会看到我也有地形生成器。所以在极短的时间内建立一个巨大的世界是完全有可能的。您只需要编写高效的代码即可。
我测试了 SDL2 中的最大纹理大小和最大纹理数量,它限制为 23 个 16384 x 16384 像素的纹理。之后,根据我收到的 SDL_GetError() 消息,它用完了视频内存。
当然,AAA 级游戏在游戏世界中每帧显示超过 23 种 16384 x 16384 像素的纹理。那么他们如何在 运行 没有视频内存的情况下做到这一点?他们不能不断地从磁盘加载。它必须在游戏加载时已经保存到视频内存中。那么,为什么 SDL2 将我限制为 23 个 16384 x 16384 像素的纹理?有解决办法吗?
我正在编写一个 2d 游戏,想从一开始就加载整个游戏世界,这样玩家就不会在开始玩游戏时出现加载屏幕。
目前,我正在考虑的编程工作是每次玩家进入新区域时只重新合成大型游戏背景纹理,但其余游戏元素将在游戏开始时全部加载游戏。这样,只有几分之一秒的黑屏,在此期间为新区域重新合成大纹理。但考虑到我正在制作的游戏类型,我仍然希望在游戏过程中根本不需要加载或中断任何东西。我正在尝试制作一款完全身临其境的模拟游戏。
我刚刚实现并测试了每一帧的渲染图块。这是在相机视图中每层渲染 5100 个图块,每帧 2 层。因此每帧在屏幕上渲染 10200 个图块(纹理)。使用我的预渲染大纹理方法,它使帧速率从 60 及以上降低到 20。所以这证明了我的观点,即 CPU 的速度不足以迭代那么多元素,即使每个图块都是已经加载到 vram 中的纹理。与每帧渲染 5100 个较小的纹理相比,将 1 个大纹理区域渲染到屏幕上要快得多,即使这些纹理都位于在主游戏循环之前加载到一个纹理中的同一文件中。这就是我在与 HolyBlackCat 的讨论中试图表达的观点。
所以这又回到了我原来的问题post:我怎样才能绕过 SDL2 中的纹理和视频内存限制?
显存限制似乎与SDL2无关,而是与硬件(显卡)有关,这是有道理的。所以我会坚持我的解决方案,将游戏世界分成多个区域,每次玩家进入一个新区域时,它的大纹理都会被预渲染。
问题在于您创建的任何引擎中的管道。 你可以通过这段视频看到我以近 60fps 的速度推动 40,000 个移动物体。 https://www.youtube.com/watch?v=408DkNLuhUU 我是运行一个老系统。显卡是 rx570,频率为 3ghz cpu。 如果我不移动所有这些圈子,我可以推动更多。 该视频是关于我 运行 的 C++ 引擎的。 我制作了它的 python 版本,它以 60fps 的速度移动了 3000 个圆圈,或者围绕着你在 20fps.You 处的同一事物可以找到它 https://github.com/hayesgr/PySDL2-Engine 1秒生成4万房间地下城的同频道视频也能找到。它是基于瓷砖的,而且很大。 https://www.youtube.com/watch?v=yIqPJWl8afw&t=233s
16384x16384 图片大小为 1Gb。大多数视频卡上都装不下其中的许多。如果您使用这些更新,那将是非常昂贵的。
这里的重点是您正在寻找错误的解决方案来满足您的需求。 如果您查看我的引擎的 python 版本,您会发现它是基于状态的。 我的 C++ 引擎还使用 multi-threading 来处理移动和碰撞计算。如果我没有那些活动部件。我不需要 multi-threading 将其推送到屏幕。简而言之,我使用的 multi-threading 并不是纯粹为了减少计算时间而将内容推送到屏幕上。 如果我不移动它们,我可以将大约 50,000 个推到 60fps 的屏幕上。
如果你也看同一个频道,你会看到我也有地形生成器。所以在极短的时间内建立一个巨大的世界是完全有可能的。您只需要编写高效的代码即可。