【发布时间】:2011-09-08 18:00:47
【问题描述】:
我正在开发一款 Windows Phone 7 XNA 游戏。它是用 C++ 编写的游戏的移植版本,因此,我尝试尽可能少地重写游戏代码。
垃圾在 WP7 上是一个巨大的问题,因为收集器是非分代的并且速度很慢,所以收集(每 1MB 触发一次)每 MB 分配大约需要 10 毫秒。我完全打算使用最大 90MB 的可用空间,因此我们正在查看每 MB 分配约 900 毫秒的延迟。
我已经能够重做一些事情,这样我们就不会在每帧产生垃圾,除了少数字符串。
看来StringBuilder.ToString()会产生垃圾,here描述的方法在WP7上不起作用。
我需要做的两件事是:
- 将分钟/秒/百分位格式化为 mm:ss.hh 以显示在屏幕上。显然,我可以使用 StringBuilder 来做到这一点(使用不会通过装箱 int 产生垃圾的扩展方法)并直接使用 SpriteBatch 显示 StringBuilder。
- 将格式为“foo.bar.baz.qux”的字符串拆分为 '.' 上的数组,即 {"foo", "bar", "baz", "qux"} 并复制一个元素到时间到一个字符串数组。这是为了设置游戏角色的层次状态。它也几乎直接从原始游戏移植而来,并且在很大程度上取决于它以这种方式工作。我真的很想避免重写它。
没有将大量代码转换为使用 char[] 而不是字符串,有没有办法在 C# 中拥有真正无垃圾的可变字符串?
【问题讨论】:
-
只是一个旁注芒果有代GC blogs.msdn.com/b/abhinaba/archive/2011/04/13/…
-
这也是使某些东西“更接近”可变字符串stackoverflow.com/questions/6913435/…的一种方法
标签: c# windows-phone-7 garbage-collection xna