[英]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.