2017-08-27 20 views
0

私はタイマーを使用してデスクトップの背景をアニメーション化するコードを作成しています。これは以下のコードを使用して実現しましたが、ランダム壁紙、ここで私の問題は、私はGIFイメージからすべてのフレームを抽出するコマンドラインを使用している(ffmpeg)、私はすべてのフレームをループし、変更するために、低い間隔(100)でタイマーを実行している背景にはUser32.dll APIを使用していますが、ブラウザで開いたようにアニメーションがあまり滑らかではなく、アニメーション中にプログラムが非常に遅くなるため、別の方法があるかどうかわかりませんラグのないバックグラウンドは、ここまで私が行ったことです:VBのタイマーを使用してWindowsデスクトップの背景をアニメ化する

Imports System.IO 

Public Class Form1 
    Private Declare Auto Function SystemParametersInfo Lib "user32.dll" (ByVal X As Integer, ByVal Y As Integer, ByVal Z As String, ByVal W As Integer) As Integer 
    Dim FrameX As Integer 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Timer1.Start() 
    End Sub 

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 
     'If the frame is not exist then loop from the begenning with the frame 0. 
     If Not File.Exists(Application.StartupPath & "\Frames\animation" & FrameX & ".png") Then 
      FrameX = 0 
     End If 
     Try 
      SystemParametersInfo(20, 0, Application.StartupPath & "\Frames\animation" & FrameX & ".png", 1 Or 2) 
     Catch ex As Exception : End Try 

     FrameX += 1 
     Timer1.Start() 
    End Sub 
End Class 
+0

あなたは**スムーズ**、あなたはそれが高速ではありません意味だとはどういう意味ですか? また、なぜTimer1.Stop()をTimer1_Tickの最初に、Timer1.Start()を最後に配置するのか分かりませんでした。 Timer1.Stop()を削除してみます。また、間隔を短くすることもできます。 – Youssef13

+0

@ Youssef13はい、非常に遅いだけでなく、1秒間フリーズして2〜3フレームスキップしてもかまいません。 –

+0

**キャッチ**の部分を空にしないことをお勧めします。たぶん、いくつかのフレームがスキップされるという例外が発生します。 – Youssef13

答えて

1

私はファイルUser32.dllファイルを使用して機能SystemParametersInfoはそう多くの処理がバックグラウンドであり、タイマーがその関数の非常に高速に実行されている、とWindowsがしたので、問題はメモリやCPUからであることがわかりました同じ理由でWindows XPの後にこの機能を削除すると、RAMはすべてを乱しているので、私はこのコードを使用して、私のプログラムの使用方法からRAMをリリースしました。これはバックグラウンドを更新しても本当に違います。

最初に、この関数を宣言する:

Private Declare Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal hProcess As IntPtr, ByVal dwMinimumWorkingSetSize As Int32, ByVal dwMaximumWorkingSetSize As Int32) As Int32 

第二に、使用:

Sub ReleaseRAM() 
    Try 
     GC.Collect() 
     GC.WaitForPendingFinalizers() 
     If Environment.OSVersion.Platform = PlatformID.Win32NT Then 
      SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1) 
     End If 
    Catch ex As Exception 
     MsgBox(ex.ToString()) 
    End Try 
End Sub 

またあなたは非常に多くのフレームを持っている場合は、タイマーの間隔やフレーム数で動作するはずですアニメーションを作成するには、間隔を長くして、適切なバランスを見つける必要があります。

プログラムを管理者として実行し、優先度を高くすることも役立ちます。


最後に、ホープ誰かがこの便利なか面白いでしょう:)

関連する問題