【问题标题】:vb.net more performance for moving objectsvb.net 移动物体的更多性能
【发布时间】:2010-08-06 12:18:26
【问题描述】:

我的任务是为学校项目制作一款小游戏。图片框,由步行敌人的计时器移动。如果表单上有大约 5 或 6 个移动图片框,我的应用程序会遇到麻烦和滞后。在我杀死一些敌人后(将它们从窗体/面板的控件集合中删除)它会顺利恢复。

我认为敌人移动的循环太复杂了,但我不知道如何使它更简单。

Private Sub TimerEnemyMovement_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerEnemyMovement.Tick
    For Each Enemy As Control In PanelBackground.Controls
        If Enemy.Name.Substring(0, 5) = "Enemy" Then
            _enemy.MoveEnemy(Enemy, 2)
        End If
    Next
End Sub

我也考虑过多线程,但不确定这是否能解决问题,还有我无法访问主窗体的控件的问题。

你看,我对 vb.net 了解不多

有什么办法可以解决这个延迟问题吗?

【问题讨论】:

  • 你的定时器多久触发一次,即它的间隔是多少?

标签: vb.net


【解决方案1】:

试试这个:

Private Sub TimerEnemyMovement_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerEnemyMovement.Tick
    SuspendLayout()
    For Each Enemy As Control In PanelBackground.Controls
        If Enemy.Name.Substring(0, 5) = "Enemy" Then
            _enemy.MoveEnemy(Enemy, 2)
        End If
    Next
    ResumeLayout()
End Sub

【讨论】:

  • 另外我认为你可以只为面板使用 UpdateBegin() 以避免阻塞所有布局(我认为!)
  • @Rene - 它让表单等待重新绘制,直到确定该周期的所有敌人移动,因此它可以进行一次刷新而不是多次刷新。
【解决方案2】:

VB.NET WinForm 应用程序不是创建游戏或移动对象的理想设置。正如您所发现的,表格的绘画使用了很多性能。

尝试迁移到 VB.NET WPF(Windows 演示框架)应用程序,它可以更好地处理图形。

【讨论】:

  • 我可能不会提倡将 WPF 用于“初学者”学校项目。它引入了许多其他可能与手头练习无关的复杂性。与 WinForms 相比,WPF 的学习曲线相当陡峭。
  • 我知道它不是为游戏而生的。但这就是我的练习。但是在我发布我的问题后,我发现问题不是移动的物体。这是背景。我有一个背景图像,敌人是具有透明背景的动画 gif。看来 WinForms 处理不了那么好。
  • 我在 VB6 中多次使用过这种技术(移动图片框),它非常好,因为它很简单。上次我尝试的是 VB.NET 2003。还可以,但性能不太好(但也许我们的旧计算机必须更加努力地运行 .NET?)。从那以后我没有尝试过,但我很惊讶它会变得更糟(我们有超过 5-6 个精灵,但也许我们的逻辑更简单......)。
  • 我刚刚读到您正在为精灵使用动画 GIF。您是否尝试过使用静态精灵表并简单地更改 PictureBox 的图片?我怀疑动画 GIF 是真正伤害你的东西。如果您使用精灵表,6 个屏幕精灵应该不是问题。
  • 似乎单独的动画 gif 不是问题。与背景图像(例如战场)在同一范围内。删除表单的背景并将其设置为黑色后,不再存在性能问题。糟糕的是,在我发布我的问题之前我没有尝试过这个;)。然而:事实上,WinForms 无法处理背景图像上的透明和移动图形,我必须搜索其他方式来添加游戏地图
【解决方案3】:

只是一些建议,可能会提高速度

a) 与其遍历所有控件,不如将它们存储在数组/列表中 b) 旧游戏技巧是在内存中绘制场景,然后将其复制到屏幕.. 那么为什么不使用内存位图(或图形)将“敌人”绘制到此,然后在所有完成后复制到整个 bmp 到屏幕

【讨论】:

  • 嗯...您对数组的建议是有道理的。我试过了。但是我没有找到在 vb.net 中进行引用的方法,例如在 c# 中。
【解决方案4】:

所有的敌人都需要同时移动吗?有些动作更快吗?

如果有 6 个敌人,你可以在第一刻移动 1,3,5,然后在下一个刻移动 2.4.6,以此类推。

?

【讨论】:

    【解决方案5】:

    我一直在使用 XNA 创建一个简单的游戏,这真的很酷。虽然 VB.NET 不受官方支持,但您可以使其工作。它针对风景和大量动画对象进行了优化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      相关资源
      最近更新 更多