Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该单独绘制瓷砖,还是将瓷砖的图像粘贴到较大的图像上并绘制?_C#_Performance_Xna_Draw_Tile - Fatal编程技术网

C# 我应该单独绘制瓷砖,还是将瓷砖的图像粘贴到较大的图像上并绘制?

C# 我应该单独绘制瓷砖,还是将瓷砖的图像粘贴到较大的图像上并绘制?,c#,performance,xna,draw,tile,C#,Performance,Xna,Draw,Tile,我正在和一个朋友做一个游戏,我们就如何在游戏中画瓷砖发生了争执。游戏是2d的,自上而下,具有等距外观。每个瓷砖要么是地板瓷砖(玩家可以继续移动),要么是墙砖(玩家和其他对象与之碰撞)。每个瓷砖由4种纹理组成,这些纹理由相邻瓷砖的材质决定。这使得长而平的墙在拐角处是独一无二的。目前,在屏幕上绘制4种纹理的永久平铺需要很快的速度 所以我建议我们改变这些瓷砖的绘制方式。由于瓷砖不会移动或改变纹理,我想出了一个主意,我们可以在游戏开始运行之前将所有纹理粘贴到一个大图像上,然后绘制该图像,而不是绘制每个瓷

我正在和一个朋友做一个游戏,我们就如何在游戏中画瓷砖发生了争执。游戏是2d的,自上而下,具有等距外观。每个瓷砖要么是地板瓷砖(玩家可以继续移动),要么是墙砖(玩家和其他对象与之碰撞)。每个瓷砖由4种纹理组成,这些纹理由相邻瓷砖的材质决定。这使得长而平的墙在拐角处是独一无二的。目前,在屏幕上绘制4种纹理的永久平铺需要很快的速度

所以我建议我们改变这些瓷砖的绘制方式。由于瓷砖不会移动或改变纹理,我想出了一个主意,我们可以在游戏开始运行之前将所有纹理粘贴到一个大图像上,然后绘制该图像,而不是绘制每个瓷砖。瓷砖及其碰撞框仍然存在,但未绘制。这一变化导致了相当大的速度提升。我的朋友说这样做的复杂性不值得提速,并提出了以下问题:

  • 虽然游戏运行速度更快,但初始加载时间更长

  • 在XNA中,纹理的最大大小为4096x4096,这意味着根据我们的瓷砖大小,每个“megatexture”只能容纳128块瓷砖

  • 我们需要一个单独的巨纹理为每个屏幕层,这可能会变得复杂


尽管如此,我仍然认为megatexture方法更好,我们应该使用它。那么我们应该用什么呢?其他基于平铺的游戏做什么?如果我不够具体,请告诉我。

根据SO的反馈,您不太可能回答这个问题。但是,您可以轻松编写软件,使其以任何方式工作(通过编译选项或设置)。如果是这样的话,你可以把问题推迟到游戏准备就绪——如果在所有内容都包括在内之后,你需要进行速度优化,那么答案将是显而易见的。如果结果证明您不需要优化,那么答案也是显而易见的。正是模糊的中间地带使生活变得有趣

如果这使事情变得太复杂,那么您基本上需要基于性能计算(可能由性能测试补充)执行同样的操作。这些可能相当困难,但您可能没有太多选择


一个更好的解决方案是研究/测试其他算法,这些算法可以为您提供一个满足双方需求的解决方案。

这一提升与单独绘制每个瓷砖的复杂性有关

随着计算机越来越强大,您可以放弃一些性能改进,以减少加载时间和代码复杂性;最后由您决定是选择加载时间还是fps

当您对此提出疑问时,我会考虑到您在渲染地图时遇到的性能问题。是否渲染整个地图,而不是仅渲染其可见部分?这是游戏开发过程中经常出现的问题

我还可以举一个Ragnarök Online的例子,这是一个在2000年左右开始开发的“老游戏”。它有一个2D/3D贴图,并“单独”渲染每个2D平铺,也就是说,每个纹理在一个DirectX调用中渲染。游戏运行良好,有很多特效,声音,一些3d特效(悬崖),甚至在旧电脑上。
你应该尝试使用3d原语而不是依赖SpriteBatch(我认为你正在使用)来渲染瓷砖,看看你是否有一些改进。

首先,你听起来好像128块瓷砖只是一点点瓷砖。您可以在一张地图上使用128个独特的瓷砖来完成令人惊叹的事情。您还可以选择使用alpha纹理混合这些纹理,以创建数千个独特的瓷砖。根据地图这是足够的,看看一些好的老游戏。他们在隐藏网格方面做得非常好,并且只使用四分之一的独特瓷砖就可以让事情看起来非常好

在技术网站上,一个图形卡可以存储的纹理数量是有限的,因为有很多纹理,你会遇到GFX需要处理纹理的问题,这显然需要额外的时间。如果您为单个区域声明一个大的精灵表,那么您就不太可能遇到问题。如果需要,只需加载另一个区域的新spritesheet即可

我不确定XNA,但我坚信它和许多引擎一样,将纹理存储为二次幂。因此,如果纹理上没有这些约束,则大小将向上取整。这是创建图纸的另一个重要原因

我个人的经验是,拥有16种纹理而不是16种单独纹理的精灵表可以极大地提高性能。我可以用一张精灵表在一张拼贴地图上放大1000个精灵。既然你说的是32x32大小的瓷砖,在全高清屏幕上绘制大约2000个精灵,我真的建议你使用床单,如果你真的需要额外的瓷砖,甚至两张床单。也不用担心大小,4048x4048在没有alpha的简单dds(DXT1)格式中有点超过10MB,并且每个纹理都使用xna转换为dds。即使有两张4048x4048图纸,也有足够的空间来绘制其他东西

-编辑-

阅读你的评论,我知道你想免费为背景画大纹理,这一点都没有问题。就像瓷砖一样,你必须知道你想在屏幕上画什么。假设您选择4048x4048尺寸,当您站在其中一个角落时,最多只能绘制其中的4个。您可以在靠近边缘时进行检测,并在需要时加载边缘。我不知道加载10MB纹理时它会对FPS造成什么影响,但您可以始终使用单独的线程。如果每帧在屏幕上绘制4个4048x4048纹理,我也不知道它会对cpu造成什么影响,但这很容易测试。50MB的纹理对我来说听起来很不错,但我通常使用单个1028x1028瓷砖