改进线程 CPU 在 C# 中的使用
Improving threading CPU usage in C#
我正在使用 SharpDX 制作 GUI 界面和相关代码以允许控制鼠标 cursor/emulate 按键,但即使在闲置时我的应用程序也会使用 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 使用贡献最大。我已经尝试比较数据包编号,因此当控制器未被使用时我的应用程序处于空闲状态,但这会导致处理光标位置的主要问题(它非常缓慢且间歇性)
编辑:我已将线程设置为后台并将其优先级设置为 BelowNormal,但这并没有显着提高CPU使用率
这是一个紧凑的循环,因此它将完全使用 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 可供所有人使用,它只是告诉您的线程让步给另一个线程,显然情况并非如此。
我正在使用 SharpDX 制作 GUI 界面和相关代码以允许控制鼠标 cursor/emulate 按键,但即使在闲置时我的应用程序也会使用 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 使用贡献最大。我已经尝试比较数据包编号,因此当控制器未被使用时我的应用程序处于空闲状态,但这会导致处理光标位置的主要问题(它非常缓慢且间歇性)
编辑:我已将线程设置为后台并将其优先级设置为 BelowNormal,但这并没有显着提高CPU使用率
这是一个紧凑的循环,因此它将完全使用 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 可供所有人使用,它只是告诉您的线程让步给另一个线程,显然情况并非如此。