Tag: performance

XNA游戏性能

我正在使用C#2010和XNA 4.0编写游戏。 我希望它是一个好游戏,而不是“只是另一个废话”,所以我的目标之一是良好的帧率。 为此,我想请教您一些建议,无论是XNA相关还是C#相关 – 我该怎么做才能加快我的代码速度,从而提高FPS。 这是我发现的一些东西: (c#)使用list array将大大提高性能,以防你想要访问大量数据(甚至很多:拥有20000个项目的数组给出了近200%的FPS列表的180%。 (c#)使用for而不是foreach将提高性能。 在相同的20000元素上,它就像5-10%的差异。 (xna和c#)调用方法会降低性能,因此当我将代码分散到调用其他方法等的方法时,一切都非常酷且面向对象,每次调用的成本为1-3 FPS。 (xna)更新与绘制:当我将代码放入update()和draw()时,性能没有区别,所以如果你不太在意,你不必在update()下放一些方法而不是保持一切都在draw()希望更好的FPS。 (xna)不知道它是我还是4.0,但当你加载一个带有大量纹理的.X和非常复杂的网格时,需要很多时间来加载。 我不得不编写自己的.X加载器和网格/模型渲染器,因为XNA开始为每个三角形加载纹理,无论前一个三角形是否具有相同的纹理。 即使编写我自己的缓存纹理的内容加载器也不是解决方案,因为它仍然被使用了很多次。 如果你做了一些漂亮而蓬松的东西我建议使用drawuserprimitives而不是Model类。 (不知道是否只有4.0,或者3.1也有这样的性能问题) (xna和c#)尽量避免在绘图时使用“new”。 我在网上看到了一些代码,什么是复制/粘贴在一起并且有“basicEffect = new BasicEffect(graphicsDevice);” draw()中的这种丑陋,甚至更糟:在draw()中的迭代中。 这会扼杀表现。 而不是在“游戏”或静态类中有一个这样的类。 这也适用于其他“临时对象”:丑陋但我认为最好创建一些全局的东西,然后注意使用它然后制作一个漂亮而蓬松的代码,因为垃圾收集器会使我们的游戏变得更好。 好吧,所以长话短说,请在这里发表一些好的建议,这样我/我们就可以做出好的,快速的,优化的游戏;) 提前致谢:Zéiksz

c#DataSet.Fill Firebird 2.5填补了可怕的性能问题

备注我完全重写了问题,因为在探索选项和获得见解时,我意识到我的问题的根源完全不是我想的。 我使用Firebird作为数据库引擎和标准.Net提供程序(v.5.11.0)使用以下代码获取数据: // myBlob1 is BLOB SUB_TYPE 1 (text field) with some empty, but some // VERY long stuff (xml-content) which exceeds VARCHAR(32765), but I removed // those before performing my tests!!! var tick = Stopwatch.StartNew(); DataTable dataTable = new DataTable(); DbLive.Open(); FbCommand command = new FbCommand(“SELECT myBlob FROM MY_TABLE”, DbLive); try { dataTable.BeginLoadData(); FbDataAdapter […]

StorageFile比IsolatedStorageFile慢50倍

当我发现在我的Lumia 920上运行的应用程序的WP7版本加载数据的速度是在同一设备上运行的WP8版本的2倍时,我只是对多个算法进行基准测试以找到加载我应用程序中所有数据的最快方法。 我编写了以下独立代码来测试WP8的StorageFile和WP7的IsolatedStorageFile的性能。 为了澄清标题,这里是我做的初步基准测试结果,读取50个20kb和100kb的文件: 有关代码,请参阅下文 更新 在做了几个小时的基准测试和一些有趣的结果之后,让我重新解释一下我的问题: 为什么await StreamReader.ReadToEndAsync()在每个基准测试中都比非异步方法StreamReader.ReadToEnd()更慢? (这可能已经在Neil Turner的评论中得到了回答) 使用StorageFile打开文件时似乎有很大的开销,但只有在UI线程中打开它时才会出现。 (请参阅方法1和3之间或5到6之间的加载时间的差异,其中3和6比等效的UI线程方法快10倍) 有没有其他方法来读取可能更快的文件? 更新3 好吧,现在有了这个更新我添加了10个算法,重新使用每个以前使用的文件大小和使用的文件数量的每个算法。 这次每个算法运行10次。 因此,excel文件中的原始数据是这些运行的平均值。 由于现在有18种算法,每种算法都有4种文件大小(1kb,20kb,100kb,1mb),每种文件分别为50,100和200个文件(18 * 4 * 3 = 216),总共有2160个基准测试运行,总时间为95分钟(原始运行时间)。 更新5 添加了基准测试25,26,27和ReadStorageFile方法。 不得不删除一些文本,因为post有超过30000个字符,这显然是最大的。 使用新数据,新结构,比较和新图表更新了Excel文件。 代码: public async Task b1LoadDataStorageFileAsync() { StorageFolder data = await ApplicationData.Current.LocalFolder.GetFolderAsync(“benchmarks”); data = await data.GetFolderAsync(“samplefiles”); //b1 for (int i = 0; i < filepaths.Count; i++) { […]

用于检查字节数组是否为零的SSE指令C#

假设我有一个byte[]并想检查所有字节是否为零。 For循环是一种显而易见的方法,而LINQ All()是一种奇特的方式,但最高性能至关重要。 如何使用Mono.Simd来加速检查字节数组是否满了零? 我正在寻找最前沿的方法,而不仅仅是正确的解决方案。

HashSet或Distinct用于读取对象的List 中的不同属性值

这在某种程度上与此相关( 获取C#列表中的所有唯一项 )问题。 上面的问题是谈论一个简单的数组。 我有从第三方Web服务返回的对象: public class X { public Enum y {get; set;} } 我有一个列表这些对象List data; ,总共约100条记录,但可变。 现在我想要属性y列表中的所有可能值,并且我想绑定它做一个CheckBoxList.DataSource (如果有所不同)。 这是最有效的方法吗? 我可以想到两种算法: var data = HashSet hashSet = new HashSet(xs.Select(s => sy)); chkBoxList.DataSource = data; 要么 var data = xs.Select(s => sy).Distinct(); chkBoxList.DataSource = data; 我的直觉是HashSet,但我不是百分百肯定。 如果有人有任何想法,愿意接受更好的想法?

许多不必要的变量会导致C#中的性能问题吗?

我有一个C#4.0应用程序,在这个应用程序中我有很多不必要的变量。 像下面代码中的_foo变量: public string Foo() { var _foo = “foo bar”; return _foo; } 正如我所提到的,像这样的情况发生在很多方法中。 很多不必要的变量(比如我在这种情况下解释的那些)会导致C#中的性能问题吗? 编辑: 如果我要删除它们,我不会问任何建议。 我的问题是性能效应。 事实上,该应用程序不是由我编写的,我是这个项目的新手。 我只是看到并想知道它是否有任何性能。 效果除了它对代码质量有影响。

在c#字典中只查找或插入一个查找

我是一名前C ++ / STL程序员,试图使用c#/ .NET技术编写快速行进算法… 我正在搜索等效的STL方法“map :: insert”,如果不存在,则在给定键处插入值,否则返回现有键值对的迭代器。 我找到的唯一方法是使用两个查找:一个在TryGetValue中,另一个在Add方法中: List list; if (!_dictionary.TryGetValue (pcost, out list)) { list = new List (); dictionary.Add (pcost, list); } list.Add (new Point { X = nx, Y = ny }); 是否有一些东西可以解释为什么使用.NET容器不可能? 还是我错过了一些观点? 谢谢。

检查null的性能损失

任何人都可以告诉我在c#中检查对象的对象或属性是否为null的性能成本是多少? 我正在开发一个ASP.NET MVC应用程序,在模型中进行空检查,然后在视图中再次完成。 我觉得这是过度的但是如果没有真正的性能打击那么我就不会看到以这种方式做事的伤害。

哪里附上碰撞检测脚本?

我观看了Unity的Basic Platformer Game教程,其中主持人创建了他附加到Coin预制件的硬币拾取脚本。 我想知道是否应该将拾取脚本附加到Player或Coin GameObject。 假设我们有一个可以拾取物体的游戏。 他们只做增加分数(或以另一种方式影响玩家)并在碰撞中摧毁自己。 我想知道这个问题的首选方法是什么。 我想出了两种方法: 方法A. 在玩家游戏对象上有一个ObjectPickup脚本。 该脚本将根据碰撞对象的类型执行任何操作。 private void OnTriggerEnter2D(Collider2D other) { if (other.gameObject.CompareTag(“Coin”)) { IncrementScore(); Destroy(other.gameObject); } else if (other.gameObject.CompareTag(“SuperSpeed”)) { IncreasePlayerSpeed(); Destroy(other.gameObject); } } 方法B. 每个硬币都有CoinPickup脚本, 每个超高速通电都有 SuperSpeedPickup脚本。 private void OnTriggerEnter2D(Collider2D other) { if (other.gameObject.CompareTag(“Player”)) { other.gameObject.IncrementScore(); Destroy(gameObject); } } 和其他脚本: private void OnTriggerEnter2D(Collider2D other) { if (other.gameObject.CompareTag(“Player”)) […]

System.DirectoryServices很慢?

当用户登录网站时,我正在使用以下代码在Active Directory中查找信息。 针对本地域运行它非常快,但是通过VPN运行到远程可信域,它非常慢(需要大约7或8秒)。 从同一个盒子到远程域运行dsa.msc几乎和在本地运行它一样快。 我正在使用属性过滤来检索可能的最小数据量,因此在这种情况下System.DirectoryServices是否存在某些内在缓慢的问题,或者是否有人对如何提高性能有任何提示? 通过VPN的网络连接很好,只有这个代码运行缓慢。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.DirectoryServices; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { using (var LDAPConnection = new DirectoryEntry(“LDAP://domain/dc=domain,dc=com”, “username”, “password”)) { LDAPConnection.AuthenticationType = AuthenticationTypes.Secure; using (DirectorySearcher Searcher = new DirectorySearcher(LDAPConnection)) { Searcher.Filter = “(&(&(objectclass=user)(objectcategory=person))sAMAccountName=username)”; Searcher.PropertiesToLoad.Add(“mail”); SearchResult result = Searcher.FindOne(); //this […]