Questions tagged «performance»

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

3
如何在JavaScript中处理多人游戏?
我只是对用于移动多人游戏的技术进行了一些研究。 目前,这只是一个实验,因此,玩家唯一需要了解的就是其他玩家。 如果这是一个典型的Web应用程序而不是一个游戏它只会一直触发HTTP请求-但是由于这是一个游戏,因此性能和准确性将成为一个问题。 由于该游戏针对多个电话平台,因此可以说客户端将使用JavaScript或基于JavaScript的框架编写。服务器技术是完全开放的。 每个玩家都需要做一个HTTP帖子,并且只能使用更快的协议。基于网络的多人游戏的原因是,跨蓝牙或其他本地网络的多人游戏在平台之间的差异太大,可能会引起问题。 因此,问题归结为可用于JavaScript多人游戏的良好协议/技术是什么?关于服务器端的东西有什么建议吗?有什么理由我应该放弃这种两层体系结构并直接进行电话到电话的连接?

4
实时多人游戏使用哪个数据库(RDBMS,NoSQL和BOTH)?
我正在开发一个实时多人游戏,该游戏将需要一个数据库(用于诸如播放器配置文件,朋友,解锁,新闻等功能)。这是一个标准PC游戏(不是基于浏览器的游戏),将使用客户端服务器建筑。我刚接触数据库,过去几天,我偶然发现了激烈的争论:RDBMS与NoSQL,进行了一些研究。目前,我倾向于NoSQL,但是在阅读了每种用法(RDBMS和NoSQL)之后,我很想同时使用两者。我知道这似乎很奇怪,但让我解释一下我的情况: 我的团队有一个共享的虚拟主机程序包,该程序包提供无限的mySQL存储和带宽,唯一的警告是我们一次只能打开25个连接(共享主机规则)。我打算将其用于我的网站(无疑是一种典型用法),以便发布新闻更新,支持社区功能(例如评论,上传粉丝艺术等)等。一切都很好,但是-!这是事情变得有趣的地方...我想在游戏中显示发布在我的网站上的相同信息。这意味着我的网站和游戏都使用mySQL。除了新闻发布之类的内容外,我还计划在游戏中将其用于聊天和服务器列表之类的事情。我最关心的是25连接规则。 这就引出我问问题1:这是否可行,还有更好的选择吗? 现在,除此之外,我还阅读了有关NoSQL的性能以及适用于实时游戏的信息(我可能是错的,我经历了一场巨大的RDBMS与NoSQL的火焰之战,到达这里并可能被烧死了)。基本上,我想对所有游戏对象数据使用MongoDB。 同样,如果我提供一些背景信息将对您有所帮助:我找到了一个主机(MongoLab),该主机免费提供240MB的MongoDB软件包,我打算在需要升级之前使用它。假设有240MB,我已经计算出能够存储大约60,000个播放器(如果每个播放器大约为4KB,而我们忽略了可能存储的其他内容)。存储空间以及将来必须支付更多费用(我们的游戏应该成功)不是问题。我目前打算对所有游戏对象数据使用MongoDB的唯一原因是由于将访问该游戏对象数据的频率(例如,每当玩家被杀死,拿起物品,开枪等时)也喜欢无格式的直接文档(这使得映射游戏对象数据更加容易)。我应该注意到,一次 我打算在我的网站上使用相同的MongoDB来显示玩家资料信息(我不关心完全的一致性,可以从游戏中进行更新有些延迟)。这使我想到第二个问题,即问题2:这是个好主意还是应该做得更好? 游戏将具有类似于以下的启动体验: 客户端登录(MongoDB) 客户端位于带有聊天室的游戏首页(MySQL) 客户端转到服务器列表(MySQL) 客户端连接到服务器并在其中播放 服务器传达所有播放器的更新(MongoDB) 这就是我想象中的工作方式。这对您来说看起来不错,还是对如何改进此计划有建议?

2
多人FPS服务器端性能
这与MMO的性能有关,除了有关带宽的问题。这与cpu负载有关。 我使用node.js和webGL编写了一个简单的FPS。这非常简单,就像MIDI Maze的BuddyMaze克隆一样。发生的事情很少,每个人都可以二维移动(没有高度),发射简单的弹丸,然后撞到墙壁上。 现在,如果我与服务器建立多个连接,每个玩家在旋转时迅速射击,那么在服务器最大化核心并放慢速度之前,我可以在游戏中获得约15-20名玩家。这是在服务器上以30 fps的速度运行时。在10 fps下,我获得约25-30个连接。这是非常糟糕的,因为游戏很快将有更多工作要做,而我需要让更多的玩家适应这一点,这是可行的努力。 我的兄弟刚刚指出了有关其同事的TF2服务器的一些统计信息。他的服务器的规格低于我们的服务器,但它运行的是TF2,显然是一个复杂得多的游戏,每秒高达500滴答声,每个核心36个用户。另外,我们目前消耗的带宽比它们消耗的要多得多,但是我们还没有试图降低太多带宽。 这怎么可能?有什么样的技巧可以将服务器性能提高到这种程度?我知道的一些东西包括: 降低服务器上的帧速率,并在客户端上插入位置。我得到了一些好处,但是显然TF2服务器甚至都没有为此烦恼。 在客户端上执行诸如冲突检测之类的昂贵工作,并在服务器上很少进行验证。我还没有搬过来,今晚我会。即使这样,我也不希望获得如此巨大的收益。 将运动场划分为区域(四叉树)以最小化计算。还没有机会。 我考虑过不幸的是,node.js的速度比TF2正在使用的速度慢得多,并且可能不适合这种高强度任务。 这一切都在服务器配置魔术中吗? 那么,行业中的其他窍门是什么,即仅执行服务器上的最低要求,又具有完美的游戏体验?“推迟到客户端以节省CPU时间”与“不信任客户端”之间存在很大的冲突,因此也许有助于了解在各种情况下的界​​限如何? 更新资料 剖析确实是我所发现的唯一绝对可靠的咒语。我很快在代码周围包装了一些计时功能(感谢FP!),发现了我从未想到的东西:将数据广播到客户端的行为几乎占了整个执行时间。具体来说,约占90%。进一步的测试表明,这段时间取决于客户端数量和数据大小,而后者则更多。在20位用户的负载下,我只发送“ {}”而不是全部数据,从而将广播时间从24ms缩短为2ms,降低了90%。但是只有5个用户,广播大约需要0.5毫秒。因此,我显然需要在此处进行一些优化。 最明显的改进是视线检查。这样既可以减少关心数据的人数,也可以减少发送给感兴趣的各方的数据量。我可以尝试一下这个领域中的其他技巧,以便将广播操作的成本降至最低吗?

2
为什么Unity使用反射来获取更新方法?
为什么为了不统一使用反射来访问MonoBehaviour像信息的方法Awake,Update,Start,...? 使用反射会不会很慢?为什么不利用其他方法Template Method呢?它可以在MonoBehaviour基类中简单地将方法定义为抽象,并强制子类实现该方法。
12 unity  c#  performance 

3
将相同组件集的实体分组到线性内存中
我们从基本的系统-组件-实体方法开始。 让我们创建组合(源自长期本文章)仅仅是出于对信息类型的组件。它是在运行时动态完成的,就像我们将组件一个接一个地添加/删除到实体中一样,但是让我们更精确地命名它是因为它仅涉及类型信息。 然后,我们构造为每个实体指定集合的实体。创建实体后,它的组合是不可变的,这意味着我们无法直接对其进行修改,但是仍然可以获得现有实体对本地副本的签名(以及内容),对其进行适当的更改,然后创建一个新实体它的。 现在是关键概念:每创建一个实体,就会将其分配给一个名为assemblage bucket的对象,这意味着具有相同签名的所有实体都将位于同一容器中(例如,在std :: vector中)。 现在,系统只是遍历他们感兴趣的每个环节并完成工作。 这种方法有一些优点: 组件存储在几个(精确地:存储桶数)连续的内存块中-这提高了内存友好性,并且更容易转储整个游戏状态 系统以线性方式处理组件,这意味着改进了缓存一致性-再见字典和随机存储器跳转 创建新实体就像将组合映射到存储桶并将所需组件推回其向量一样容易 删除一个实体就像调用std :: move一样容易,将最后一个元素与删除的元素交换,因为此时顺序并不重要 如果我们有很多具有完全不同的签名的实体,那么缓存一致性的好处就会减少,但是我认为大多数应用程序都不会发生这种情况。 重新分配向量后,指针失效也存在问题-可以通过引入以下结构来解决: struct assemblage_bucket { struct entity_watcher { assemblage_bucket* owner; entity_id real_index_in_vector; }; std::unordered_map<entity_id, std::vector<entity_watcher*>> subscribers; //... }; 因此,只要出于游戏逻辑中的某种原因,我们想要跟踪一个新创建的实体,就在存储桶中注册一个entity_watcher,并且一旦在删除期间必须将该实体std :: move移开,我们便会查找其观察者并进行更新他们real_index_in_vector的新价值。在大多数情况下,这对每个实体删除都仅施加了一个字典查找。 这种方法还有其他缺点吗? 尽管很明显,为什么没有提到解决方案? 编辑:我正在编辑问题以“回答答案”,因为评论不足。 您将失去可插拔组件的动态特性,该特性是为摆脱静态类构造而专门创建的。 我不。也许我没有足够清楚地解释它: auto signature = world.get_signature(entity_id); // this would just return …

1
如何分别描述顶点着色器和片段着色器的速度?
我想知道如何检查顶点或片段着色器是渲染管道中的瓶颈。 我已经读过glQueryCounter与GL_TIMESTAMP目标一起使用以获取OpenGL命令之间的时钟检查点的信息,但是这些不能区分不同类型的着色器。 例如,如果GPU上的一帧需要8毫秒的渲染时间,我是否可以说顶点着色器需要7毫秒,片段着色器需要1毫秒?

1
管理图形状态和组件?
在处理图形时,我经常倾向于做很多过早的优化。我一直尝试遵循一些原则: 使D3D组件的数量最少。(渲染状态,缓冲区,着色器等) 仅在绝对必要时绑定组件。(尚未绑定,等等。) 尽可能专门化组件。(仅设置必要的BindFlags等) 这导致我构建非常复杂的包装器来管理创建的组件和当前管道状态。这不仅消耗了我宝贵的开发时间,还增加了另一层复杂性。 最糟糕的是:我什至不知道这一切是否值得麻烦。 我的一些优化考虑因素可能已经在较低级别上实现,而我只是在复制它们,从而浪费了CPU时间。由于对性能的影响可以忽略不计,因此其他考虑可能完全没有必要。 所以我的问题是: 以上哪些准则有效,我应在多大程度上遵循这些准则? GPU如何处理状态变化? 如果我更改了一个从未使用过的状态会怎样?(处于活动状态时,不会进行抽奖。) 绑定各种不同组件的实际性能损失是什么? 还应考虑哪些其他性能方面的考虑? 请不要只是告诉我,在达到实际极限之前,我不应该关心性能。从实践的角度来看,这显然是正确的,但我主要对该理论感兴趣。我不知何故需要抵制建立最佳图形框架的冲动,而且我认为我通常无法通过“过早的优化讲座”来做到这一点。 管理组件 我目前正在使用SlimDX作为托管包装用C#编写DirectX 11应用程序。这是一个非常低级的包装器,而我当前的抽象是基于它的。 使用Direct3D抽象时,有一些明显的优势。设置环境,加载着色器,设置常量和绘制网格更加简单,并且使用的代码更少。而且,由于它管理着大多数组件的创建和处理,因此它们可以在任何地方自动重用,而且我几乎完全避免了内存泄漏。 您通常如何管理所有图形组件和资源? 您能否推荐任何与下面的示例类似的托管包装器? 这是我当前实现的一个示例。我对界面非常满意。它具有足够的灵活性来满足我的需求,并且易于使用和理解: // Init D3D environment var window = new RenderForm(); var d3d = new Direct3D(window, GraphicsSettings.Default); var graphics = new GraphicsManager(d3d.Device); // Load assets var mesh = GeometryPackage.FromFile(d3d, "teapot.gp"); var …

3
Flash游戏的渲染性能
我当时正在阅读有关本机Flash渲染与构建自定义BitmapData帧缓冲区的信息,其中一些答案有些矛盾,所以我想知道: 通常是走定制Bitmap缓冲区路线的最佳实践,还是将渲染留给Flash引擎? 如果您使用矢量动画(MovieClips)而不是精灵,这是否会改变上述答案? 如果是这样,使用基于Sprite的动画是最佳实践吗? (如果有任何区别,我的目标是Flash 10)

3
将Vector3转换为Vector2的最有效方法
将Vector3转换为Vector2的最有效,最快的方法是什么? 铸件: Vector2 vector2 = (Vector2)vector3; 初始化一个新的Vector2: Vector2 vector2 = new Vector2(vector3.x, vector3.y); 还是我不知道另一种方法?
11 unity  c#  performance 


1
如何有效地渲染大型地形网格?
最近,我一直在思考如何在游戏中生成地形的最佳方法。在另一个项目中,我通常使用高度图,因此所有核心工作都基于所使用的引擎,但是现在无法完成,因为地形具有数百万个必须精确绘制的特定多边形。而且,其中许多不能从Y向量进行解析(因为下面隐藏了多边形),也就是说,高度图在这里没有用。在这种情况下,我必须使用COLLADA对象。 有人告诉我要在Blender之类的软件中手动划分模型,但是不幸的是,这也是不可能的,因为这些地形是在另一个软件中成块创建的,然后加载到游戏中(这就是想法)。因此,每次必须手动对其进行切片将是一项巨大的工作。 因此,自从一周以来,我一直在研究如何解决此问题并以程序方式将此网格,地形(对应于相机平​​截头体)加载,以尽可能地节省性能。我遇到了许多有关过程网格生成的文档,我认为可以通过将网格映射到八叉树来解决我的问题。这是一项巨大的工作,至少对我来说是如此,这就是为什么我在这里,因为我不想冒险走错误的道路,而无需经验丰富的人来信。 简而言之,我有数百万个顶点和索引共同构成了地形,但是出于明显的原因,我无法同时绘制它们。它需要某种程序。将大型网格物体视为地形的最佳方法是什么?有没有关于这本书的具体书?有没有最佳的实施方法? 很抱歉出现任何错误,我是这个领域的新手。

1
通过计算着色器与管道着色器实现算法
随着DirectX和OpenGL的计算着色器的可用性,现在可以实现许多算法而无需经过光栅化管道,而是可以在GPU上使用通用计算来解决该问题。 对于某些算法,这似乎已成为直观的规范解决方案,因为它们本质上不是基于栅格化的,而基于栅格化的着色器似乎是利用GPU功率的一种解决方法(简单的示例:创建噪声纹理。此处无需对四边形进行栅格化)。 给定一种可以双向实现的算法,与使用计算着色器相比,使用常规着色器是否有一般(潜在)的性能优势?我们是否应该注意一些缺点(例如,在运行时从计算着色器切换到计算着色器是否存在某种异常的开销)? 在两者之间进行选择时,也许还会考虑其他优点或缺点吗?

1
多灯快速照明
如何实现多灯快速照明? 我不想束缚玩家,他可以放置无限数量,并且可以在关卡中重叠(点)灯。 问题在于,包含动态循环(用于计算光照)所必需的着色器往往非常慢。 我的想法是,如果有可能在编译时编译一个着色器n次,其中n是光照数量。如果在编译时知道数字n,则可以自动展开循环。是否可以仅使用不同数量的灯光来生成同一着色器的n个版本? 然后,在运行时,我可以决定将哪个着色器用于关卡的哪个部分。

2
XNA定期停顿
我正在尝试进行硬件实例化,但是遇到了一些奇怪的性能问题。平均帧率约为45,但非常不稳定。 开窗的 SynchronizeWithVerticalRetrace =假 IsFixedTimeStep = false PresentationInterval = PresentInterval.Immediate 下图显示了我测量的时间(带有Stopwatch)。最上面的图是在该Draw方法中花费的时间,最下面的图是从结束Draw到开始的时间。Update 尖峰几乎相隔1秒,并且总是通常时间的2、3、4或5倍。尖峰之后的帧完全没有时间。我已经检查过它不是垃圾收集器。 我目前正在实例化一个由12个三角形和36个顶点组成的网格作为三角形列表(我知道这不是最佳选择,但仅用于测试),具有100万个实例。如果我将实例化绘图调用分批处理到250个实例的小部分,则每个问题都会得到缓解,但CPU使用率会大大增加。上面的运行是每个draw调用10000个实例,在cpu上要容易得多。 如果我以全屏模式运行游戏,则几乎不存在底部图形,但是该Draw方法现在会出现相同的问题。 这是PIX内部的运行,对我来说根本没有意义。似乎有些帧没有完成渲染... 任何想法,可能是什么原因造成的? 编辑:根据要求,渲染代码的相关部分 CubeBuffer创建并初始化A ,然后填充多维数据集。如果多维数据集的数量超过某个限制,CubeBuffer则会创建一个新的,依此类推。每个缓冲区在一次调用中绘制所有实例。 仅需要一次的信息static(顶点,索引缓冲区和顶点声明;尽管到目前为止没有任何区别)。纹理为512x512 画() device.Clear(Color.DarkSlateGray); device.RasterizerState = new RasterizerState() { }; device.BlendState = new BlendState { }; device.DepthStencilState = new DepthStencilState() { DepthBufferEnable = true }; //samplerState=new SamplerState() { AddressU = TextureAddressMode.Mirror, AddressV …
10 xna  performance 

1
多人空间分割的有效解决方案?
这个问题有点棘手,但我会尽力弄清楚。 可以说我正在构建一个在线游戏(不是MMO规模),但是通过权威的服务器方法可以支持尽可能多的玩家。我想真正的大与世界很多 AI模拟敌人。 我知道一些通过细分空间而不处理不需要处理的东西来节省服务器CPU的策略。我已经按地区划分了世界,这需要加载时间和较小的过渡时间,我认为这对于保持本地(单独或什至有几个朋友)玩游戏时的游戏质量至关重要。我不希望球员出现在一个或两个以上的地区。 问题在于,一个区域可能会变得很大,并且一次模拟了很多NPC。在不影响玩家体验的情况下如何处理?表格中没有像每个区域一台服务器之类的方法。 我主要是在寻找能够容纳成群的敌人,甚至是和平的NPC的数据结构。要最终确定问题,请注意,由于存在车辆,因此车辆在某个区域内的行驶速度相当快,会影响“何时”驶向剔除区域。

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.