繁体   English   中英

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

[英]SlimDX: limit the frame rate for lower cpu usage

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

ps我确定有一种更好的方法可以使游戏“计时器”与帧速率分开,任何信息都将不胜感激。

循环和初始化:

            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
        });

NVM我有一个可行的想法,因为我想要60 fps,这意味着每帧之间约16ms,所以我测量渲染一帧的时间,然后测量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);
        }
    });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM