Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 游戏图形-质量相关的FPS控制?_.net_Vb.net_Winforms_Performance_Graphics - Fatal编程技术网

.net 游戏图形-质量相关的FPS控制?

.net 游戏图形-质量相关的FPS控制?,.net,vb.net,winforms,performance,graphics,.net,Vb.net,Winforms,Performance,Graphics,我目前正在制作一个游戏(在vb.net中),它使用绘制大多数游戏对象,但我遇到了性能的老问题。为了对抗滞后,我添加了一些代码来自动降低游戏质量,这样我就可以尝试提高游戏的速度,这在一定程度上是可行的,但是当更多的“敌人”被添加到更高的级别时,游戏的速度仍然会明显减慢。我对graphics类很陌生(几天前才开始使用它),所以我知道唯一有助于加快游戏速度的方法是:关闭抗锯齿,降低计时器间隔(这在很大程度上控制着我的游戏刷新率),那么除了上一步,还有其他方法可以提高游戏的性能吗 游戏截图。。。 这是

我目前正在制作一个游戏(在vb.net中),它使用绘制大多数游戏对象,但我遇到了性能的老问题。为了对抗滞后,我添加了一些代码来自动降低游戏质量,这样我就可以尝试提高游戏的速度,这在一定程度上是可行的,但是当更多的“敌人”被添加到更高的级别时,游戏的速度仍然会明显减慢。我对graphics类很陌生(几天前才开始使用它),所以我知道唯一有助于加快游戏速度的方法是:关闭抗锯齿,降低计时器间隔(这在很大程度上控制着我的游戏刷新率),那么除了上一步,还有其他方法可以提高游戏的性能吗

游戏截图。。。

这是我到目前为止的代码(质量调整位在底部)

公共类表单1
作为新哈希集按下私钥(共键)
Private firstRun As Boolean=True
私有mouseDownB作为布尔值=False
Private newLevel为布尔值=True
私有随机颜色作为新的随机颜色
私有随机疗法作为新的随机疗法
私有随机基因作为新的随机基因
私有randomeneyside作为新的Random
私人生活为整数=5
私有分数为字符串=0
专用playerX作为整数=403
作为整数的私有playerY=206
私有totaltEnemyCount作为整数=10
私有EnemCount作为整数=0
私有enemyX(0)作为整数
私有Enemy(0)作为整数
私有enemyID(0)为整数
私有EX作为整数=0
私有EY作为整数=0
私有ES作为整数=0
私有enemyMoved为整数
Private EneySpeed As Integer=1
私有密钥被攻击为整数=0
私有enemyActive作为整数=0
Private levelNumber的长度为0
作为整数的专用FPS=40
专用g1作为图形
Private enemycount增加为布尔值=True
Private EneySpeedIncrease为布尔值=False
显示的私有子表单1_(发送者作为对象,e作为事件参数)处理我。显示
g1=Me.CreateGraphics
g1.SmoothingMode=Drawing2D.SmoothingMode.AntiAlias
端接头
私有子表单1u MouseDown(发送方作为对象,e作为MouseEventArgs)处理我。MouseDown
mouseDownB=True
端接头
私有子表单1u MouseUp(发送方作为对象,e作为MouseEventArgs)处理Me.MouseUp
mouseDownB=False
端接头
私有子表单1u KeyDown(发送方作为对象,e作为KeyEventArgs)处理Me.KeyDown
如果e.KeyCode=Keys.Left,则
按键。添加(按键。左)
ElseIf e.KeyCode=Keys.Up然后
按键。添加(按键。向上)
ElseIf e.KeyCode=Keys.然后
按键。添加(按键。右侧)
ElseIf e.KeyCode=Keys.Down然后
按键。添加(按键。向下)
如果结束
端接头
私有子表单1u KeyUp(发送方作为对象,e作为KeyEventArgs)处理Me.KeyUp
按键。移除(例如,按键代码)
端接头
随机颜色发生器
私有函数R()作为字符串
返回随机颜色。下一步(0,255)
端函数
私有函数G()作为字符串
返回随机颜色。下一步(0,255)
端函数
私有函数B()作为字符串
返回随机颜色。下一步(0,255)
端函数
随机位置发生器
私有函数X()作为字符串
返回randomeneyx.Next(0494)
端函数
私有函数Y()作为字符串
返回randomeneyy.Next(24348)
端函数
主显示器和播放器生成
Private Sub mainPaint(发送者作为对象,e作为事件参数)处理Timer1。勾选
计时器1.间隔=每秒
新秒表
圣斯特朗
如果firstRun=True,则
levelNumber=levelNumber+1
g1.DrawString(“Level”和levelNumber,新字体(“DigifaceWide”,64,GraphicsUnit.Pixel),新的SolidBrush(Color.FromArgb(191,R,G,B)),X,Y)
g1.DrawRectangle(新笔(颜色为argb(128,R,G,B)),0,0,884,24)
g1.FillEllipse(新的SolidBrush(颜色为argb(128,R,G,B)),playerX,playerY,24,24)
g1.FillRectangle(新的SolidBrush(颜色为argb(128,R,G,B)),0,0,884,24)
g1.抽绳(“Life:5”,新字体(“DigifaceWide”,20,GraphicsUnit.Pixel),新的SolidBrush(颜色为Argb(191,R,G,B)),2,0)
g1.抽绳(“分数:0”,新字体(“数字字体宽”,20,GraphicsUnit.Pixel),新的SolidBrush(颜色为Argb(191,R,G,B)),100,0)
firstRun=False
如果结束
移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家移动玩家
如果按下键.Contains(键.Left),则
如果playerX>0,则
playerX=playerX-5
g1.FillEllipse(新的SolidBrush(颜色为argb(128,R,G,B)),playerX,playerY,24,24)
如果结束
ElseIf键按下。包含(键。向上)然后
如果playerY>24,则
playerY=playerY-5
g1.FillEllipse(新的SolidBrush(颜色为argb(128,R,G,B)),playerX,playerY,24,24)
如果结束
ElseIf键按下。包含(键。右)然后
如果playerX<860,则
playerX=playerX+5
g1.FillEllipse(新的SolidBrush(颜色为argb(128,R,G,B)),playerX,playerY,24,24)
如果结束
如果按下ElseIf键。包含(键。向下),则
如果playerY<388,则
playerY=playerY+5
g1.FillEllipse(新的SolidBrush(颜色为argb(128,R,G,B)),playerX,playerY,24,24)
如果结束
如果结束
激光发电
如果mouseDownB=True,则
g1.抽绳(新笔(颜色为argb(102,R,G,B)),playerX+12,playerY+12,Control.MousePosition.X-Me.Bounds.X,Control.MousePosition.Y-Me.Bounds.Y)
如果结束
敌一代-新水平
如果newLevel=True,则
levelNumber=levelNumber+1
当EnemicountPublic Class Form1

Private keysPressed As New HashSet(Of Keys)
Private firstRun As Boolean = True
Private mouseDownB As Boolean = False
Private newLevel As Boolean = True
Private randomColour As New Random
Private RandomEnemyX As New Random
Private RandomEnemyY As New Random
Private RandomEnemySide As New Random
Private life As Integer = 5
Private score As String = 0
Private playerX As Integer = 403
Private playerY As Integer = 206
Private totaltEnemyCount As Integer = 10
Private enemyCount As Integer = 0
Private enemyX(0) As Integer
Private enemyY(0) As Integer
Private enemyID(0) As Integer
Private EX As Integer = 0
Private EY As Integer = 0
Private ES As Integer = 0
Private enemyMoved As Integer
Private enemySpeed As Integer = 1
Private enemyAttacked As Integer = 0
Private enemyActive As Integer = 0
Private levelNumber As Long = 0
Private FPS As Integer = 40
Private g1 As Graphics
Private enemyCountIncrease As Boolean = True
Private enemySpeedIncrease As Boolean = False

Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    g1 = Me.CreateGraphics
    g1.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias                           
End Sub

Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
    mouseDownB = True
End Sub

Private Sub Form1_MouseUp(sender As Object, e As MouseEventArgs) Handles Me.MouseUp
    mouseDownB = False
End Sub

Private Sub Form1_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    If e.KeyCode = Keys.Left Then
        keysPressed.Add(Keys.Left)
    ElseIf e.KeyCode = Keys.Up Then
        keysPressed.Add(Keys.Up)
    ElseIf e.KeyCode = Keys.Right Then
        keysPressed.Add(Keys.Right)
    ElseIf e.KeyCode = Keys.Down Then
        keysPressed.Add(Keys.Down)
    End If
End Sub

Private Sub Form1_KeyUp(sender As Object, e As KeyEventArgs) Handles Me.KeyUp
    keysPressed.Remove(e.KeyCode)
End Sub
'''''''''''''''''''''''''Random colour generator''''''''''''''''''''''''''''
Private Function R() As String
    Return randomColour.Next(0, 255)
End Function

Private Function G() As String
    Return randomColour.Next(0, 255)
End Function

Private Function B() As String
    Return randomColour.Next(0, 255)
End Function
'''''''''''''''''''''''''Random location generator''''''''''''''''''''''''''''
Private Function X() As String
    Return RandomEnemyX.Next(0, 494)
End Function

Private Function Y() As String
    Return RandomEnemyY.Next(24, 348)
End Function
'''''''''''''''''''''''''Main display & player generation''''''''''''''''''''''''''''''''
Private Sub mainPaint(sender As Object, e As EventArgs) Handles Timer1.Tick
    Timer1.Interval = FPS
    Dim ST As New Stopwatch
    ST.Start()
    If firstRun = True Then
        levelNumber = levelNumber + 1
        g1.DrawString("Level " & levelNumber, New Font("DigifaceWide", 64, GraphicsUnit.Pixel), New SolidBrush(Color.FromArgb(191, R, G, B)), X, Y)
        g1.DrawRectangle(New Pen(Color.FromArgb(128, R, G, B)), 0, 0, 884, 24)
        g1.FillEllipse(New SolidBrush(Color.FromArgb(128, R, G, B)), playerX, playerY, 24, 24)
        g1.FillRectangle(New SolidBrush(Color.FromArgb(128, R, G, B)), 0, 0, 884, 24)
        g1.DrawString("Life: 5", New Font("DigifaceWide", 20, GraphicsUnit.Pixel), New SolidBrush(Color.FromArgb(191, R, G, B)), 2, 0)
        g1.DrawString("Score: 0", New Font("DigifaceWide", 20, GraphicsUnit.Pixel), New SolidBrush(Color.FromArgb(191, R, G, B)), 100, 0)
        firstRun = False
    End If
    '''''''''''''''''''''''''''''''Move player''''''''''''''''''''''''''''''
    If keysPressed.Contains(Keys.Left) Then
        If playerX > 0 Then
            playerX = playerX - 5
            g1.FillEllipse(New SolidBrush(Color.FromArgb(128, R, G, B)), playerX, playerY, 24, 24)
        End If
    ElseIf keysPressed.Contains(Keys.Up) Then
        If playerY > 24 Then
            playerY = playerY - 5
            g1.FillEllipse(New SolidBrush(Color.FromArgb(128, R, G, B)), playerX, playerY, 24, 24)
        End If
    ElseIf keysPressed.Contains(Keys.Right) Then
        If playerX < 860 Then
            playerX = playerX + 5
            g1.FillEllipse(New SolidBrush(Color.FromArgb(128, R, G, B)), playerX, playerY, 24, 24)
        End If
    ElseIf keysPressed.Contains(Keys.Down) Then
        If playerY < 388 Then
            playerY = playerY + 5
            g1.FillEllipse(New SolidBrush(Color.FromArgb(128, R, G, B)), playerX, playerY, 24, 24)
        End If
    End If
    '''''''''''''''''''''''''''''''Laser generation'''''''''''''''''''''''''''''''''''''
    If mouseDownB = True Then
        g1.DrawLine(New Pen(Color.FromArgb(102, R, G, B)), playerX + 12, playerY + 12, Control.MousePosition.X - Me.Bounds.X, Control.MousePosition.Y - Me.Bounds.Y)
    End If
    ''''''''''''''''''''''''''''''''Enemy generation - New level''''''''''''''''''''''''''''''''''''
    If newLevel = True Then
        levelNumber = levelNumber + 1
        Do While enemyCount < totaltEnemyCount
            Dim i As Integer = 0
            ReDim enemyID(0)
            Do While enemyID.Length <= totaltEnemyCount
                EX = RandomEnemyX.Next(0, 872)
                EY = RandomEnemyY.Next(24, 400)
                ES = RandomEnemySide.Next(0, 4)
                ReDim Preserve enemyID(i + 1)
                enemyID(i) = 1
                ReDim Preserve enemyX(i + 1)
                ReDim Preserve enemyY(i + 1)
                If ES = 0 Then 'Left side
                    enemyX(i) = 0
                    enemyY(i) = EY
                ElseIf ES = 1 Then 'Top side
                    enemyX(i) = EX
                    enemyY(i) = 24
                ElseIf ES = 2 Then 'Right side
                    enemyX(i) = 872
                    enemyY(i) = EY
                ElseIf ES = 3 Then 'Bottom side
                    enemyX(i) = EX
                    enemyY(i) = 400
                End If
                g1.FillEllipse(New SolidBrush(Color.FromArgb(128, Color.Red)), enemyX(i), enemyY(i), 12, 12)
                enemyCount = enemyID.Length
                enemyActive = enemyActive + 1
                i = i + 1
            Loop
        Loop
        newLevel = False
    End If
    ''''''''''''''''''''''''''''''''Enemy attacked''''''''''''''''''''''''''''''''''''''''
    Dim iii As Integer = 0
    Do While iii < totaltEnemyCount
        If (((Control.MousePosition.X - Me.Location.X) > enemyX(iii))) And ((Control.MousePosition.X - Me.Location.X) < (enemyX(iii) + 16)) And ((Control.MousePosition.Y - Me.Location.Y) > enemyY(iii)) And ((Control.MousePosition.Y - Me.Location.Y) < (enemyY(iii) + 16)) Then
            If mouseDownB = True Then
                enemyID(iii) = -1
                enemyX(iii) = -1
                enemyY(iii) = -1
                enemyActive = enemyActive - 1
                enemyCount = enemyCount - 1
            End If
        End If
        iii = iii + 1
    Loop
    ''''''''''''''''''''''''''''''''Move enemy'''''''''''''''''''''''''''''
    Dim ii As Integer = 0
    Do While enemyMoved < totaltEnemyCount
        If enemyActive < 1 Then
            enemyCount = 0
            newLevel = True
            If enemyCountIncrease = True Then
                totaltEnemyCount = totaltEnemyCount + 50
            ElseIf enemySpeedIncrease = True Then
                enemySpeed = enemySpeed + 1
            End If
            g1.DrawString("Level " & levelNumber, New Font("DigifaceWide", 64, GraphicsUnit.Pixel), New SolidBrush(Color.FromArgb(191, R, G, B)), X, Y)
            Exit Sub
        End If
        If enemyID(ii) = -1 Then
            GoTo skipMove
        End If
        If (enemyX(ii) - (playerX + 4)) < 0 Then 'Enemy on left
            enemyX(ii) = enemyX(ii) + enemySpeed
        End If
        If (enemyX(ii) - (playerX + 4)) > 0 Then 'Enemy on right
            enemyX(ii) = enemyX(ii) - enemySpeed
        End If
        If (enemyY(ii) - (playerY + 4)) < 0 Then 'Enemy above
            enemyY(ii) = enemyY(ii) + enemySpeed
        End If
        If (enemyY(ii) - (playerY + 4)) > 0 Then 'Enemy below
            enemyY(ii) = enemyY(ii) - enemySpeed
        End If
        g1.FillEllipse(New SolidBrush(Color.FromArgb(51, Color.Red)), enemyX(ii), enemyY(ii), 12, 12)
skipMove:
        enemyMoved = enemyMoved + 1
        ii = ii + 1
    Loop
    enemyMoved = 0
    ''''''''''''''''''''''QDSA - Quality Depentant Speed Adjustment''''''''''''''''''''
    ST.Stop()
        Dim elapTick As Decimal = ST.ElapsedTicks
        If elapTick < 5000 Then 'Slow down
            FPS = FPS + 1
            enemySpeedIncrease = False
            g1.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
            enemyCountIncrease = True
        ElseIf elapTick > 5000 Then 'Speed up
            If FPS > 1 Then
                FPS = FPS - 1
            End If
            g1.SmoothingMode = Drawing2D.SmoothingMode.None
            enemyCountIncrease = False
            If enemySpeed < 4 Then
                enemySpeedIncrease = True
            Else
                enemySpeedIncrease = False
            End If
        End If
End Sub
End Class
<Window x:Class="SamsGameSample.MainWindow"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:SamsGameSample"
        Title="SamsGameSample"
        PreviewKeyDown="Window_PreviewKeyDown"
        PreviewKeyUp="Window_PreviewKeyUp"
        SizeChanged="Window_SizeChanged"
        WindowState="Maximized">
    <Window.Resources>
        <DataTemplate DataType="{x:Type local:Player}">
            <Ellipse Fill="Green" Stroke="Black" Height="{Binding Size.Height}" Width="{Binding Size.Width}"/>
        </DataTemplate>

        <DataTemplate DataType="{x:Type local:Enemy}">
            <Ellipse Fill="Red" Stroke="Black" Height="{Binding Size.Height}" Width="{Binding Size.Width}"/>
        </DataTemplate>
    </Window.Resources>

    <DockPanel>
        <DockPanel.Background>
            <LinearGradientBrush StartPoint="0,0" EndPoint="1,0" Opacity=".6">
                <GradientStop Color="Blue" Offset="0"/>
                <GradientStop Color="Red" Offset=".5"/>
                <GradientStop Color="Green" Offset="1"/>
            </LinearGradientBrush>
        </DockPanel.Background>
        <StackPanel Orientation="Horizontal" Background="#70000000" DockPanel.Dock="Top">
            <TextBlock Text="{Binding Lives, StringFormat='Lives: {0}'}" Margin="10" Foreground="AliceBlue"/>
            <TextBlock Text="{Binding Score, StringFormat='Score: {0}'}" Margin="10" Foreground="AliceBlue"/>
        </StackPanel>
        <ItemsControl ItemsSource="{Binding GameObjects}" x:Name="GameArea">
            <ItemsControl.ItemContainerStyle>
                <Style TargetType="ContentPresenter">
                    <Setter Property="Canvas.Left" Value="{Binding Location.X}"/>
                    <Setter Property="Canvas.Top" Value="{Binding Location.Y}"/>
                </Style>
            </ItemsControl.ItemContainerStyle>
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <Canvas IsItemsHost="True"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>
    </DockPanel>
</Window>