2017-08-27 51 views
0

我正在研究應該使用計時器來動畫桌面背景的代碼,並且我使用下面的代碼實現了該操作,但是我不打算將它隨機更改爲隨機壁紙,所以這裏是我的問題,我使用(ffmpeg)命令行從一個GIF圖像中提取所有幀,然後我運行一個具有較低間隔(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,是的,它非常「緩慢」,不僅速度慢,它可能會凍結一秒鐘,然後跳過2-3幀。 –

+0

我建議你不要讓** Catch **部分變空。也許有一個例外發生,使一些幀被跳過。 – Youssef13

回答

1

我發現這個問題是從內存或CPU,因爲使用的文件User32.dll文件所以在後臺進行大量的處理和定時器運行速度非常快該功能,並Windows做了功能SystemParametersInfoWindows 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 

此外,您應在計時器的間隔和幀數工作,如果你有這麼多幀要生成動畫,間隔應該很高,所以你必須找到合適的平衡點。

以管理員身份運行程序並給予其高優先級也有幫助。


最後,希望有人會覺得這有用或有趣的:)