0

我正在创建一个基于沙子的 windows phone 8 游戏,并且正在考虑提高性能的方法。

沙子从顶部落下并与东西碰撞,因此必须每帧计算一次。

当前的实现是这样工作的:

  • 有一个带有像素信息的 short[,] 数组,就像这个像素充满了沙子/障碍物/线条
  • 沙子算法真的很简单。如果那里有空间,我会随机左右移动每一粒谷物,如果下面有空间,让它掉下来
  • 出于性能原因,我在关卡开始处创建了一个具有不变背景图像的 WriteableBitmap
  • 当我绘制字段时,我复制了预先创建的 WriteableBitmap,通过 WriteableBitmap.Pixels[] 将更改的部分添加到其中,并通过 ImageBrush.ImageSource 将其设置为画布背景
  • 我在每次更新时所做的是计算后台线程中的沙子运动,并让 UI 线程进行绘图。这意味着我遍历整个 short[,] 数组并查看像素 [] 是否为沙子,如果是,则计算颗粒运动。之后将其复制到背景图像等。

使用此设置,我在诺基亚 Lumia 820 的调试模式下获得大约 15 fps,这似乎很慢。

我当然可以进行一些小的优化,比如使用随机映射而不是 random.Next 或使用一个大的 short[] 而不是 short[,],但是我注释掉了我的代码的不同部分,我似乎错过了在此设置中某处的主要性能下降。

4

2 回答 2

1

一个想法是将其下方/侧面完全阻塞的沙子设置为“非活动”。不活动的沙子不会在更新时检查,直到有东西在其侧面/下方移动(这会将现在释放的所有像素设置为“活动”)

于 2013-03-15T03:00:49.183 回答
1

我自己开始创建类似的东西 www.sandicle.com 那里有一个旧的测试视频,现在它有点快并且有更多的功能......(我总是喜欢掉一些熔岩:)......)希望能重新开始这个项目很快(现在有点忙:(

但基本上我通过减小分辨率得到 40-60fps

我还添加了一个编辑器,这样您就可以制作自己的粒子,并且可以在人们创建新元素包时下载它们 :)

于 2013-03-15T11:55:59.453 回答