gpt4 book ai didi

c# - 动画 GIF 帧速率似乎低于预期

转载 作者:太空宇宙 更新时间:2023-11-03 19:55:21 25 4
gpt4 key购买 nike

我有一个 winforms 应用程序,上面有一个 gif 图像,让用户了解停滞进程。

问题是它的播放速度比在其他应用程序(chrome、Internet Explorer)上看起来慢得多。

我已经在 PictureBoxLabel 上尝试了 gif,但结果速度是一样的。然后经过一些研究,我遇到了 this传奇人物@Hans Passant 的问题和答案,但不幸的是,应用他建议的样板代码没有任何区别。

下面是简单的重现代码:

public partial class Form1 : Form
{
public Form1 ()
{
InitializeComponent();
timeBeginPeriod(timerAccuracy);
}

protected override void OnFormClosed ( FormClosedEventArgs e )
{
timeEndPeriod(timerAccuracy);
base.OnFormClosed(e);
}

// Pinvoke:
private const int timerAccuracy = 10;
[System.Runtime.InteropServices.DllImport("winmm.dll")]
private static extern int timeBeginPeriod ( int msec );
[System.Runtime.InteropServices.DllImport("winmm.dll")]
public static extern int timeEndPeriod ( int msec );
}

如果需要,还有设计器代码:

partial class Form1
{
private System.ComponentModel.IContainer components = null;

protected override void Dispose ( bool disposing )
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region Windows Form Designer generated code

private void InitializeComponent ()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.label1 = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// pictureBox1
//
this.pictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.pictureBox1.Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
this.pictureBox1.Location = new System.Drawing.Point(8, 9);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(166, 119);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
this.pictureBox1.TabIndex = 0;
this.pictureBox1.TabStop = false;
//
// label1
//
this.label1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.label1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.label1.Image = ((System.Drawing.Image)(resources.GetObject("label1.Image")));
this.label1.Location = new System.Drawing.Point(180, 9);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(158, 119);
this.label1.TabIndex = 1;
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(346, 134);
this.Controls.Add(this.label1);
this.Controls.Add(this.pictureBox1);
this.Name = "Form1";
this.Text = "Form1";
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);

}

#endregion

private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Label label1;
}

两个 gif 的播放速度相同,但低于实际的 gif。应用此代码时还有其他需要注意的地方吗?

最佳答案

你只能猜测,我怀疑任何人都不会很幸运地得到一个重现:

  • timeBeginPeriod() 在技术上可能会失败,尽管当您要求 10 毫秒时这是非常不寻常的,请验证它是否返回 0。
  • 如果图像很大,那么它可能无法足够快地更新。或者您的 UI 线程被其他职责占用太多。 gif 的像素格式与现代机器上视频适配器的像素格式不匹配。每次更新帧时都会进行转换。这是相当昂贵的,尤其是如果您还强制重新缩放图像(即 PictureBox.SizeMode != Normal)。使用任务管理器验证您的 UI 线程未消耗 100% 核心。
  • 您可以通过在提升的命令提示符下运行 powercfg/energy 来获得关于有效计时器周期的第二个意见。在您的应用程序运行时执行此操作。它将滚动一分钟,然后生成一个 HTML 文件,您可以使用浏览器查看该文件。在“平台计时器解析:计时器请求堆栈”标题下报告,请求的周期值应为 10000。请注意其他进程或驱动程序可能也已发出请求。

关于c# - 动画 GIF 帧速率似乎低于预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34224074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com