SlimDX:限制帧速率以降低 CPU 使用率

Posted

技术标签:

【中文标题】SlimDX:限制帧速率以降低 CPU 使用率【英文标题】:SlimDX: limit the frame rate for lower cpu usage 【发布时间】:2017-07-23 15:10:57 【问题描述】:

我正在使用 SlimDX (DirectX 9) 制作 2D 游戏引擎,但是我面临两个相互关联的问题,即帧速率波动(尽管帧速率很高)和 CPU 使用率高。帧速率本质上是所有动画运行的游戏计时器。 CPU使用率也很高(20%),我想限制SlimDX绘制帧的速度以降低CPU使用率,并稳定动画和游戏速度,我该怎么做?

p.s 我确信有更好的方法来制作一个独立于帧速率的游戏“计时器”,任何信息都将不胜感激。

循环和初始化:

            var form = new RenderForm(World.WindowTitle);
        form.ClientSize = new Size(World.WindowWidth, World.WindowHeight);
        var device = new Device(new Direct3D(), 0, DeviceType.Hardware, form.Handle, CreateFlags.HardwareVertexProcessing, new PresentParameters()
        
            BackBufferWidth = form.ClientSize.Width,
            BackBufferHeight = form.ClientSize.Height
        );
        //Some stuff here, irrelevant to DirectX
        MessagePump.Run(form, () =>
        
            device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0);
            device.BeginScene();
            sprite.Begin(SlimDX.Direct3D9.SpriteFlags.AlphaBlend);
            //Stuff here
            sprite.End();
            device.EndScene();
            device.Present();
            //Thread.Sleep(1); <-- this didnt work using 0 or 1, it actually increased cpu ussage
        );

【问题讨论】:

【参考方案1】:

NVM 我有一个可行的想法,因为我想要 60 fps,这意味着每帧之间大约需要 16 毫秒,所以我测量渲染一帧所需的时间,然后 Thread.Sleep 16 - 渲染时间(如果高于 0) ,现在 CPU 使用率为零,如果引擎绘制一帧的时间超过 16 毫秒,那么它将直接绘制下一帧。

            var form = new RenderForm(World.WindowTitle);
    form.ClientSize = new Size(World.WindowWidth, World.WindowHeight);
    var device = new Device(new Direct3D(), 0, DeviceType.Hardware, form.Handle, CreateFlags.HardwareVertexProcessing, new PresentParameters()
    
        BackBufferWidth = form.ClientSize.Width,
        BackBufferHeight = form.ClientSize.Height
    );
    //Some stuff here, irrelevant to DirectX
    MessagePump.Run(form, () =>
    
        Stopwatch stopwatch = Stopwatch.StartNew();
        device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, Color.Black, 1.0f, 0);
        device.BeginScene();
        sprite.Begin(SlimDX.Direct3D9.SpriteFlags.AlphaBlend);
        //Stuff here
        sprite.End();
        device.EndScene();
        device.Present();
        stopwatch.Stop();
        int ms = 16 - (int)(stopwatch.ElapsedMilliseconds);
        if (ms > 0)
        
            Thread.Sleep(ms);
        
    );

【讨论】:

以上是关于SlimDX:限制帧速率以降低 CPU 使用率的主要内容,如果未能解决你的问题,请参考以下文章

C# 使用 SlimDX 获取窗口/桌面截图

在 Three.js 中限制帧速率以提高性能,requestAnimationFrame?

如何在 EaselJS / CreateJS 中实例化大型 MovieClip 而不会降低帧速率

SDL 帧速率上限实施

在 c++ 中以可变帧速率使用 FFmpeg 库(不是 libav 分支)以编程方式捕获视频

以恒定帧速率捕获网络摄像头视频的方法?