我正在使用SharpDX制作GUI界面和相关代码,以控制鼠标光标/模拟键的按下,但是即使在空闲时,我的应用程序也会使用15%+ cpu,这会导致CPU温度+ 10C升高,应用正在运行,这是控制器更新循环在其自己的线程中运行:
private void CallToChildThread()
{
Program.stateOld = controller.GetState();
while (controller.IsConnected)
{
Program.stateNew = controller.GetState();
CheckButtons();
Point cursor;
GetCursorPos(out cursor);
short tx;
short ty;
tx = Program.stateNew.Gamepad.LeftThumbX;
ty = Program.stateNew.Gamepad.LeftThumbY;
float x = cursor.X + _xRest;
float y = cursor.Y + _yRest;
float dx = 0;
float dy = 0;
// Handle dead zone
float lengthsq = tx * tx + ty * ty;
if (lengthsq > DEAD_ZONE * DEAD_ZONE)
{
float mult = speed * getMult(lengthsq, DEAD_ZONE, acceleration_factor);
dx = getDelta(tx) * mult;
dy = getDelta(ty) * mult;
}
x += dx;
_xRest = x - (int)x;
y -= dy;
_yRest = y - (int)y;
SetCursorPos((int)x, (int)y);
Program.stateOld = Program.stateNew;
}
}
CheckButtons只是我用来检查按下了哪些按钮的功能,我试图在控制器更新线程中运行此按钮,但是我无法使按钮按预期执行。
while()和GetCursorPos对CPU总使用量的贡献最大。我试图比较数据包编号,以便在不使用控制器时我的应用程序处于空闲状态,但这会导致处理光标位置的主要问题(这非常缓慢且断断续续)
编辑:我将线程设置为后台,并将其优先级设置为UnderNormal,但这并不能大大提高CPU使用率
答案 0 :(得分:2)
这是一个紧密的循环,因此它将完全使用CPU内核。只需在每次迭代的末尾添加一个Thread.Sleep(10)
。如果响应时间不够快,请调整延迟,但是如果延迟10毫秒,它将每秒轮询控制器状态100次,这已经很多。
private void CallToChildThread()
{
Program.stateOld = controller.GetState();
while (controller.IsConnected)
{
// Your update logic
Thread.Sleep(10); // Adjust the delay as needed
}
}
此外,请注意降低线程优先级不会降低CPU使用率。它只是告诉您如果没有足够的CPU供每个人使用,则该线程会屈服于另一个线程,显然不是这种情况。