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 使用率的主要内容,如果未能解决你的问题,请参考以下文章
在 Three.js 中限制帧速率以提高性能,requestAnimationFrame?
如何在 EaselJS / CreateJS 中实例化大型 MovieClip 而不会降低帧速率