如何更快地使屏幕无效?
|
在我当前的项目(生活游戏)中,我需要重新绘制屏幕,因为大约有200个对象正在移动。我可以想到两种方法,但不知道会更快些:
我可以:
1)为整个屏幕调用Invalidate(),并且在Paint处理程序中具有以下内容:
void Paint(object sender, PaintEventArgs e)
{
foreach(Cell c in ListOfCells)
{
e.DrawImage(c,c.x,c.y);
}
}
2)或者我可以使每个单元格的屏幕各部分无效:
public void MyInvalidate()
{
foreach(Cell c in ListOfCells)
{
Invalidate(c.X,c.Y,c.Width,c.Height);
}
}
并具有与上述相同的处理程序
没有找到相关结果
已邀请:
2 个回复
稼悸
请注意,我假设您记得在绘制单元格之前要做一个清晰的屏幕,否则在上一个循环中曾经“处于活动状态”的单元格将保留在屏幕上。因此,这假设您正在整个屏幕上绘制活动单元格或空白单元格。 执行方法2的“费用”:
其中v =发生变化的单元数(请参见下面的注意事项)。 因此,在以下情况下,方法1比方法2更快。
换句话说,已更改单元格的数量必须大于1减去(RectVisible成本/重绘成本)的比率。现在,与在屏幕上绘制位图相比,
通常相当快,尤其是在单元格为高分辨率的情况下。因此,Rectvisible / redraw通常是很小的数字,只有当同时有超过99%的电路板更换时,方法1才比方法2更快。 换句话说,您会发现方法2通常会产生更高的性能,因为如果要在剪切区域之外(即不在更新区域之内)绘制图像,ѭ7通常会跳过整个操作。 CAVEAT-无法使用您的代码 但是,您在方法2中的代码将无法正常工作。您必须记住要“清空”以前在最后一个循环中具有“活动”单元格的“死”单元格。换句话说,您使“更改”的单元无效,而不仅仅是使“活动”的单元无效。多个周期处于“活动状态”的单元格不需要无效。因此,您的
方法中的逻辑是有缺陷的。
济畦刨