我目前遇到了 GDI 和计时器的一个非常奇怪的问题。
首先是代码:
class Graph : UserControl {
private System.Threading.Timer timer;
private int refreshRate = 25; //Hz (redrawings per second)
private float offsetX = 0; //X offset for moving graph
public Graph() {
timer = new System.Threading.Timer(timerTick);
}
private void timerTick(object data) {
offsetX -= 1 / refreshRate;
this.Invalidate();
}
public void timerStart() {
timer.Change(0, 1000 / refreshRate);
}
private void onPaint(object sender, PaintEventArgs e) {
//350 lines of code for drawing the graph
//Here the offsetX will be used to move the graph
}
}
我在这里尝试将绘制的图形在特定时间移动到左侧的 1 个“图形单元”。所以我使用了一个计时器,它会以小步骤改变偏移量,所以这将是一个平滑的移动(这就是 refreshRate )。
在第一个视图中,此代码有效,但后来我发现以下问题:如果我使用 1 (1Hz) 的刷新率,它将以 1 步 1(图形单元)向左移动我的图形。如果我增加刷新率,我的动作会变慢。在 20 FPS 时它有点慢,在 200 FPS 时它真的很慢..
所以这是我尝试的:
我使用了 Refresh 或 Update 而不是 Invalidate
我使用普通线程(带睡眠)而不是计时器
两个代码更改都没有改变结果..
除了用定时器移动之外,我还可以用鼠标移动图形,如果定时器正在运行,我仍然可以用鼠标平滑地移动图形。所以这不是性能问题..
想到画队列有问题,因为我刷新比画完还快?(但为什么我可以用鼠标平滑地移动图形?!)
所以我需要一点帮助。谢谢