我应该单独绘制瓷砖,还是将瓷砖的图像粘贴到更大的图像上并绘制
本文关键字:图像 绘制 单独 我应该 | 更新日期: 2023-09-27 17:51:14
我正在和朋友制作一款游戏,我们就如何在游戏中绘制贴图产生了分歧。这款游戏是2d的,自上而下的,具有等距的外观。每个贴图要么是地砖(玩家可以移动的地方),要么是墙砖(玩家和其他物体碰撞的地方)。每个贴图都是由相邻贴图所决定的4种纹理的组合。这使得长而平的墙壁成为角落的独特之处。就目前而言,为屏幕上的每个贴图绘制4个纹理占用了相当大的速度。
所以我建议我们改变这些瓷砖的绘制方式。因为贴图不会移动或改变纹理,所以我想出了一个主意,我们可以在游戏开始运行前将所有纹理粘贴到一张大图像上,然后绘制它而不是每个单独的贴图。瓷砖和它们的碰撞盒仍然存在,但没有被绘制出来。这个变化导致了相当显著的速度提升。我的朋友说这样做的复杂性不值得提高速度,并提出了这些问题:
-
虽然游戏运行速度更快,但初始加载时间更长。
-
在XNA中,纹理的最大大小是4096x4096,这意味着我们的贴图大小,每个"兆纹理"只能占128个贴图。
-
我们需要一个单独的megatture为每个屏幕层,这可能会变得复杂。
尽管如此,我仍然认为megatexture方法更好,我们应该使用它。那么我们应该用什么呢?其他基于贴图的游戏是怎么做的?如果我说得不够具体,请告诉我。
首先,你听起来好像128块瓷砖只是一小块瓷砖。你可以在一张地图上用128个独特的贴图做出非常惊人的事情。你也可以选择使用alpha纹理混合这些纹理来创建数千个独特的贴图。每个地图都有很多,看看一些优秀的老游戏。他们在隐藏网格方面做得很好,只用四分之一的独特瓷砖就能让事情看起来很好。
在技术站点上,图形卡可以存储的纹理数量是有限的,并且由于纹理太多,您会遇到GFX需要处理纹理的问题,这显然需要额外的时间。如果你为一个区域声明一个大的精灵表,你就不太可能遇到问题。如果需要,只需为另一个区域加载一个新的精灵表。
我不确定XNA,但我坚信它,像许多引擎一样,将纹理存储为2的幂。所以如果你在纹理上没有这些限制,大小将被四舍五入。这是创建表单的另一个重要原因。
我的个人经验是,拥有16个纹理的精灵表与16个独立纹理的精灵表可以大大提高性能。我可以用一个精灵表进一步放大一个瓦片图,绘制出1000个精灵。因为你谈论的是大约32x32的贴图大小,在全高清屏幕上绘制大约2000个精灵,我真的建议使用表格,如果你真的需要额外的贴图,甚至可以使用两张表格。也不要担心大小,4048x4048在没有alpha的简单dds (DXT1)格式下是10MB多一点,每个纹理都被转换为带有xna的dds。即使有两张4048x4048的纸,也有足够的空间来画其他东西。
编辑——
看了你的评论,我明白你想自由绘制大纹理的背景,这是没有问题的。就像贴图一样,你必须知道你想在屏幕上画什么。假设你选择了4048x4048的尺寸,当你站在一个角落的时候,你最多只能画4个这样的。您可以检测何时接近边缘并在需要时加载一个。我不知道当加载10MB纹理时它对你的FPS有什么影响,但你总是可以使用一个单独的线程。我也不知道它对cpu有什么影响,如果你在屏幕上每帧画4个4048 × 4048纹理,但这很容易测试。50MB的纹理对我来说听起来很多,但我通常最多使用一个1028x1028的贴图来制作完整的地图。如果正确使用空间,256x256就可以得到非常简洁的结果。查看http://wayofthepixel.net/人们可以用小颜色和空间做些什么。 无论如何,因为64MB的卡并不罕见,你已经接近最大,所以我建议使用1024x1024纹理。这些肯定会加载得更快,像4048x4048,你最多只需要4个较小的,所以这减少了很多东西。当然,你可以在更大的画布上画画,然后把它切成碎片。以DXT1格式保存的1024x1024纹理大约是600kb,这意味着你可以毫不费力地绘制大量纹理,因为高清分辨率只需要在任何时候绘制4个这样的纹理。你不太可能根据SO的反馈回答这个问题。然而,你可以很容易地编写软件,使它以任何方式工作(通过编译选项或设置)。如果是这样,你可以推迟这个问题,直到游戏准备就绪——如果结果证明你需要在所有内容都包含之后进行速度优化,那么答案将是显而易见的。如果结果证明您不需要优化,那么答案也是显而易见的。正是模糊的中间部分让生活变得有趣。
如果这太复杂了,您基本上需要基于性能计算(可能辅以性能测试)执行相同的操作。这些可能相当困难,但您可能没有太多选择。
一个可能更好的解决方案是研究/测试其他算法,给你一个满足你们双方的解决方案。
提升是相对于单独绘制每个贴图的复杂性。
随着计算机变得越来越强大,你可以放弃一些性能改进来减少加载时间和代码复杂性;最后由你来决定你是喜欢加载时间还是fps。
我会考虑到,当你对此提出质疑时,你在渲染地图时遇到了性能问题。你是渲染整个地图,而不是只渲染可见的部分吗?这是游戏开发过程中经常出现的问题。
我还可以举一个《Ragnarök Online》的例子,这是一款在2000年左右开始开发的"老游戏"。它有一个2D/3D地图,并"单独"渲染每个2D贴图,也就是说,它在一个DirectX调用中渲染每个纹理。游戏运行良好,有很多效果,声音,一些3d效果(悬崖),甚至在旧电脑上。你应该尝试使用3d原语来渲染贴图,而不是依赖SpriteBatch(我认为你正在使用),看看你是否有一些改进。