【发布时间】:2015-06-13 16:33:41
【问题描述】:
目前,我的代码占用了我大约 10% 的 CPU 功率。我怎样才能使它更高效,更少闪烁? 代码:
private void timer1_Tick(object sender, EventArgs e)
{
DrawLocal();
Thread.Sleep(17);
pictureBox1.Invalidate();
}
private void DrawLocal()
{
int localReadX = ReadAddress("hl2", "client.dll+0xBFFF00 364 0");
int localReadY = ReadAddress("hl2", "client.dll+0xBFFF00 368 0");
byte[] bytesOflocalX = BitConverter.GetBytes(localReadX);//converts to float
byte[] bytesOflocalY = BitConverter.GetBytes(localReadY);//converts to float
float localX = BitConverter.ToSingle(bytesOflocalX, 0)/10;//converts to float
float localY = BitConverter.ToSingle(bytesOflocalY, 0)/10;//converts to float
Graphics localP = pictureBox1.CreateGraphics();
localP.FillRectangle(new SolidBrush(Color.Red), localX, localY, 5, 5);
Graphics localName = pictureBox1.CreateGraphics();
localName.DrawString(" local", new Font("Arial", 7), new SolidBrush(Color.Red), localX, localY);
}
【问题讨论】:
-
由于我们不知道其中 90% 的作用是什么,因此我们无法解释 10%。
ReadAddress是什么?看起来像内存偏移...您还创建了两次picturebox1图形对象,并且您从未处理过它,因此这是内存泄漏(与solidbrushes 相同)。要停止闪烁,您应该进行回缓冲,或者您可以尝试在表单上设置双缓冲选项...另外,为什么您在计时器刻度内有一个Thread.Sleep?它是什么样的计时器?为什么在抽奖后使图片框无效?这会擦除你在其中绘制的内容。计时器的运行频率是多少? -
实际上,您永远不应该创建 Graphics,而是使用 Paint 事件的 e.Graphics。只需调用 Invalidate 即可触发它! PictureBox 已经双缓冲了,给它一个工作的机会! Sleeps 在 Timer 中看起来很奇怪,如果你使用 Red 笔刷,请使用 Brushes.Red,不要总是创建相同的字体,将其存储在安全的地方.. 你能估计 ReadAddress 调用的速度有多快或有多慢吗?
-
ReadAddress 读取存储在内存地址 client.dll+.. 中的值。 PictureBox1 是我想在其中绘制矩形和字符串的区域。我叫'pictureBox1.Invalidate();'删除之前在定时器tick中绘制的旧图形(localX和localY的值不时变化)。计时器以 100 毫秒计时。