Questions tagged «performance»

由于游戏的设计和结构及其架构中的几个因素,导致运行游戏的质量,效率和速度。

2
在托管语言中使用粒子池是否值得?
我打算用Java为我的粒子系统实现一个对象池,然后在Wikipedia上找到了它。换句话说,它说不值得在Java和C#等托管语言中使用对象池,因为与非托管语言(如C ++)中的数百种分配相比,分配只需要进行数十次操作。 但是众所周知,每条指令都可能会损害游戏性能。例如,一个MMO中的客户端池:客户端进入和退出池的速度不会太快。但是粒子可能在一秒钟内更新数十次。 问题是:使用对象池来管理语言中的粒子(特别是那些死掉并很快被重新创建的粒子)是否值得?

2
GPU的参考位置值得担心吗?
是否引用的局部性化妆一样多GPU性能差异,因为它确实CPU的性能? 例如,如果我向GPU发送200条绘制命令,如果每个命令的数据在内存中是连续的,而不是在缓冲区/纹理贴图上跳转,我是否会(可能)看到明显的不同? 附带问题:我假设GPU通过使大多数资源保持不变来确保避免错误共享问题。但是,如果不是这样,为什么线程总是执行四个片段的工作呢?

2
如何在2d城市建造者中提高昂贵功能的性能
我已经在寻找答案,但是我无法找出处理昂贵函数/计算的最佳方法。 在我当前的游戏(基于2d瓷砖的城市建筑物)中,用户能够放置建筑物,建造道路等。所有建筑物都需要与用户必须放置在地图边界处的路口相连接。如果建筑物未连接到此路口,则在受影响建筑物上方将弹出“未连接到道路”标志(否则必须将其删除)。大多数建筑物都有半径,并且可能彼此也有关联(例如,消防部门可以帮助半径30瓦范围内的所有房屋)。这也是我在公路连接发生变化时也需要更新/检查的内容。 昨天我遇到了一个很大的性能问题。让我们看一下以下情况:用户当然也可以删除建筑物和道路。因此,如果用户现在在连接点之后立即断开连接,则需要同时更新许多建筑物。我认为第一个建议是避免嵌套循环(在这种情况下,这绝对是一个重要原因),但是我必须检查一下... 如果在拆除路砖的情况下建筑物仍连接到路口(我仅对那条路受影响的建筑物这样做)。(在这种情况下可能是一个较小的问题) 半径图块列表,并获取半径范围内的建筑物(嵌套循环-大问题!)。 // Go through all buildings affected by erasing this road tile. foreach(var affectedBuilding in affectedBuildings) { // Get buildings within radius. foreach(var radiusTile in affectedBuilding.RadiusTiles) { // Get all buildings on Map within this radius (which is technially another foreach). var buildingsInRadius = TileMap.Buildings.Where(b => …

2
体素面爬行(简化网格,可能使用贪婪)
编辑:这只是出于我自己的学习经验,并不是出于性能原因而问这个问题。 这是关于Minecraft类地形引擎的。我以块的形式存储块(以块的形式存储16x256x16块)。生成块时,我使用多种过程技术来设置地形和放置对象。生成时,我为整个块(是否有实体)保留一个1D数组,并为实体块保留一个单独的1D数组。 生成后,我遍历实体块以检查它们的邻居,以便仅生成没有实体邻居的块面。我将要生成的面孔存储在自己的列表中(这是6个列表,每个可能的面孔/正常面孔一个)。渲染块时,我渲染相机当前块中的所有列表,而所有其他块中仅渲染面向相机的列表。通过将所有6个列表存储在一个缓冲区中来完成此操作,然后只需更改绘制的范围即可。 结合使用2D地图集和Andrew Russell提出的这个小技巧,我想将相似的面孔完全融合在一起。也就是说,如果它们在相同的列表中(相同的标准),彼此相邻,具有相同的光照水平等。我知道我仍然会以矩形结尾,但是这样可以轻松地将我的顶点数减少50%如果我的估计正确的话,还是更好。 我的假设是将6个列表中的每个列表按其所在的轴排序,然后再按其他两个轴排序(块顶部的列表按其Y值,X,Z排序)。 仅此一项,我就可以很容易地合并面带,但我希望尽可能地合并多个面带。我已经阅读了这个贪婪的网格划分算法,但是在理解它时遇到了很多麻烦。 所以,我的问题是:要按照描述的那样进行人脸合并(忽略对动态地形/照明是否是个坏主意),也许有一种算法更易于实现吗?我也很乐意接受一个答案,它以一种更简单的方式(链接或解释)引导我完成贪婪算法。 我不介意如果它更容易实现,甚至比仅做剥离要好一点,性能都会略有下降。我担心大多数算法都将注意力集中在三角形而不是正方形上,并以我的方式使用2D地图集,我不知道我可以根据当前的技能来实现某些三角形。 PS:我已经对每个块都进行了截锥体剔除,并且如上所述,我也剔除了实体块之间的面。我还没有遮挡剔除,可能永远不会。 *编辑:我实现了自己的小技巧,可能有一个名字,但是我只是简单地浏览了我的6个列表,这些列表按照它们所靠的轴,其次是块类型,然后是照明级别进行了排序。我遍历它们,同时创建新的矩形并同时进行扩展(偏向某个轴)。绝对不是最佳选择,但确实非常快,并且确实使我的顶点数平均降低了近50%。Byte56的评论是我认为是真正答案的壁橱,但我不能选择它作为答案/赏金。 这是在生成完整的初始地形后无需进行任何优化的情况下处理此问题的快速简便的方法。假定给定的所有正方形都是相同的图像,光照水平,法线等。每种颜色都是我要渲染的不同四边形。根据我的列表的排序方式,这是一种非常简单/快速的方法。

1
如何在Unity3D中遮挡灯光?
首先,我拥有Unity Pro。 我一直在寻找遮挡灯光的方法,现在已经有一段时间没有出现了,以提高性能。我遇到的主要方法是使用BecameVisible()并测试相机的视锥。 我的主要问题是,如果玩家正在观看一个被灯光照亮的区域,我仍然希望该灯点亮。 目前,我正在使用一种方法来检查照明区域是否在相机的视锥中,但是问题是有时视锥中的光没有被玩家实际看到(例如,玩家与玩家之间的墙)。我已经尝试过对它们进行光线投射,但是对于实际的照明区域,您永远无法获得足够的详细信息(我能想到的最好的方法是使用renderer.bounds.extent和renderer.bounds.center来计算灯光的最大照明点)。 有谁知道Unity Pro中遮挡灯光的简单方法吗?还是您能告诉我一种使用我正在谈论的相机支点方法的好方法?

3
在持久性在线游戏中多久保存一次玩家的状态?
在在线游戏中,人们喜欢随时随地登录和注销。通常,他们的游戏成就会无缝保存在服务器上。这并不是很难实现,但是我想知道如何以有效且可行的方式完成并扩展规模。 每次发送时都保存玩家的坐标和状态是否有意义?我的node.js服务器可以轻松地做到这一点而不会阻塞响应,我想使用Mongo数据库,但是也许每秒一次并且在服务器范围内的事件中一次收集所有一次更合适?

2
如何有效地在网络上存储和显示地图?
关于 这实际上是两个问题合二为一。首先,我正在寻找一种有效存储大量切片数据的方法。另一个方面涉及查询数据集和显示图块。让我先给你一些背景。 我们正在使用CraftyJS库制作基于浏览器的多人大亨游戏,以将其渲染到Canvas。在GUI的后台,我们在PHP上运行Yii Framework,并且它们都连接到Python随机地图生成器和游戏引擎。 这是第一个粗糙地图渲染的外观:http : //i.imgur.com/khAXtl.png 存储地图数据 每次游戏开始时,都会随机生成游戏世界。每个玩家的大小为100x100的六角形瓷砖。这意味着对于一个三人游戏,将创建90.000个图块。目前,我只是创建一个JavaScript数组来渲染地图。 这对于渲染来说效果很好,但是对于与地图的任何形式的交互,我们都需要存储哪个玩家拥有该图块,在该图块之上构建什么样的结构,它的当前价格等等。起初,至少对于原型而言,我们想使用MySQL,但是经过一些测试,它的速度并没有我想要的那么快。也许像MongoDB这样的对象存储将更适合于存储切片数据而不是SQL表。也许还有其他东西? 显示地图 我看到的另一个问题是在地图上移动。目前,我正在为每个图块创建Crafty实体,即使它不在视口中也是如此。这很慢,因为即使Crafty仅在视口中渲染那些,它也会存储并可能遍历每个渲染事件上的所有图块。我目前所拥有的是绘制的生成地图,当您四处走动时加载和停顿非常慢,现在我想使其可玩。 我的第一个想法是加载视口中显示的图块子集。但是,当玩家将视口移至空白区域时,我需要查询服务器并等待响应返回,只有这样才能渲染地图。这在本机应用程序中会很好,但在网络游戏中却比较落后。 从地图上获得平滑性能的方法可能是将较大的图块子集预加载到javascript数组中并将其用作缓存。播放器将有几个屏幕“缓存”,当他移动视口时,我将向JS“缓存”加载更多图块。 我朝着正确的方向前进吗?我很想从做过类似事情的人那里获得更多信息。我是游戏开发的新手,但是在过去的几周中,我已经经历了很多研究。

3
有没有更好的方法来建立事件系统?
事件系统令人惊叹,它们使代码变得极其笨拙,并且确实允许通过对象之间的轻松通信和游戏循环来动态创建游戏。我目前的执行效率很难。目前,我对将对象列表分离为它们响应的事件进行了一些细微的优化,这确实产生了奇迹,但是我应该做的还很多。 目前,我有两种方法: 最简单:发送事件时,所有对象都添加到向量中。所有对象都通过其handle_event()方法发送事件 更复杂:我有一个以字符串为键的映射,以int为值的映射。添加事件类型后,会将其添加到此地图,只需将int简单地增加(必须有更好的方法) ,然后将对象向量的向量推回新的向量以处理该事件类型。 调用事件时,它只需将eventTypes映射中的相应int映射到对象向量的vector内的类型,然后将该事件发送给处理该事件类型的每个对象。 对于许多对象,这第一种方法相当慢(很明显),但是对于很少的对象来说却相当快。而对于要处理不同类型事件的大型对象,第二种方法相当快,但对于处理相同类型事件的对象,每个对象的第二种方法却较慢。 有没有更快的方法?有没有一种更快的方法来从字符串类型查找int?(起初,我有一个枚举,但是它不允许使用自定义类型,这是必需的,因为需要具有一定的动态性。)

4
如何提高配料性能
我正在为移动平台开发基于Sprite的2D游戏,并且正在使用OpenGL(实际上是Irrlicht)来渲染图形。首先,我以一种简单的方式实现了精灵渲染:将每个游戏对象渲染为具有自己的GPU绘制调用的四边形,这意味着如果我有200个游戏对象,则每帧进行200个绘制调用。当然,这是一个错误的选择,我的游戏完全受CPU限制,因为每个GPU绘制调用中都有少许CPU开销。GPU大多数时候都保持空闲状态。 现在,我认为我可以通过将对象分成大批并仅用几次绘制调用就可以渲染这些批处理来提高性能。我实施了批处理(以便共享相同纹理的每个游戏对象都以同一批进行渲染),并认为我的问题已经消失了……只是发现我的帧频比以前更低。 为什么?好吧,我有200个(或更多)游戏对象,并且每秒更新60次。我必须在每一帧中重新计算CPU中顶点的新位置(平移和旋转)(移动平台上的GPU不支持实例化,因此我无法在其中进行实例化),并每秒进行48000次计算(200 * 60 * 4,因为每个子图都有4个顶点)似乎太慢了。 我可以做些什么来提高性能?所有游戏对象都(几乎)每帧都在移动/旋转,所以我真的不得不重新计算顶点位置。我能想到的唯一优化是旋转的查找表,这样我就不必计算旋转。点精灵会有所帮助吗?有讨厌的骇客吗?还要别的吗? 谢谢。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.