C# SlimDX:限制帧速率以降低cpu使用率
我正在使用SlimDX(DirectX 9)制作一个2D游戏引擎,但是我面临着两个相互关联的问题:帧速率波动(虽然帧速率很高)和cpu使用率高。帧速率本质上是所有动画运行的游戏计时器。CPU使用率也很高(20%),我想限制SlimDX绘制帧的速度以降低CPU使用率,并且为了稳定动画和游戏速度,我该怎么做 p、 s我相信有更好的方法来制作一个游戏“计时器”,它与帧速率分开,任何信息都将受到欢迎 循环和序列化:C# SlimDX:限制帧速率以降低cpu使用率,c#,directx-9,slimdx,C#,Directx 9,Slimdx,我正在使用SlimDX(DirectX 9)制作一个2D游戏引擎,但是我面临着两个相互关联的问题:帧速率波动(虽然帧速率很高)和cpu使用率高。帧速率本质上是所有动画运行的游戏计时器。CPU使用率也很高(20%),我想限制SlimDX绘制帧的速度以降低CPU使用率,并且为了稳定动画和游戏速度,我该怎么做 p、 s我相信有更好的方法来制作一个游戏“计时器”,它与帧速率分开,任何信息都将受到欢迎 循环和序列化: var form = new RenderForm(World.
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
});
var form=newrenderform(World.WindowTitle);
form.ClientSize=新大小(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
});
//这里有些东西,与DirectX无关
MessagePump.Run(表单,()=>
{
设备。清除(ClearFlags.Target | ClearFlags.ZBuffer,彩色。黑色,1.0f,0);
device.BeginScene();
sprite.Begin(SlimDX.Direct3D9.SpriteFlags.AlphaBlend);
//这里的东西
sprite.End();
device.EndScene();
device.Present();
//Thread.Sleep(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);
}
});