C#,WinForms图形数据存储在ArrayList中。这是个好主意吗?

C#,WinForms图形数据存储在ArrayList中。这是个好主意吗?,c#,arrays,winforms,list,arraylist,C#,Arrays,Winforms,List,Arraylist,在我的例子中,2D ArrayList中充满了对象,这些对象具有在绘制水平线、垂直线和填充矩形时使用的数据。在不同的情况下,对象的数量不同,并且图像具有不同数量的绘制线和矩形。但有时图像需要重新绘制。需要重画的内容越多,屏幕上的闪烁就越强烈(我希望你能理解我所说的“闪烁”是什么意思) 我已经尝试过双缓冲,但我认为我做得不对-闪烁的类型只会改变。。。但目前的情况并非如此 我曾读到,在ArrayList的任何位置添加和删除元素(无论类型)都很容易,但访问它们却很困难。我还读到列表的性能比ArrayL

在我的例子中,2D ArrayList中充满了对象,这些对象具有在绘制水平线、垂直线和填充矩形时使用的数据。在不同的情况下,对象的数量不同,并且图像具有不同数量的绘制线和矩形。但有时图像需要重新绘制。需要重画的内容越多,屏幕上的闪烁就越强烈(我希望你能理解我所说的“闪烁”是什么意思)

我已经尝试过双缓冲,但我认为我做得不对-闪烁的类型只会改变。。。但目前的情况并非如此

我曾读到,在ArrayList的任何位置添加和删除元素(无论类型)都很容易,但访问它们却很困难。我还读到列表的性能比ArrayList更好(这是否意味着程序需要更少的计算机资源?),但从末尾添加和删除元素很容易。但我不确定阵列的性能是否最快。这让我觉得,如果我用数组或列表更改ArrayList,闪烁会变弱

在我的例子中,这不会是一个问题,因为我存储在ArrayList中的所有元素都构成同一个类

我的问题是:如果我用数组或列表替换ArrayList,是否可以减弱闪烁?

要修复“闪烁”,需要启用双缓冲

您不应该使用ArrayList,因为它会导致错误和/或糟糕的设计。
您不应该有包含多种类型对象的列表

相反,您应该使用
列表
,可能使用多态基类。

要修复“闪烁”,您需要启用双缓冲

您不应该使用ArrayList,因为它会导致错误和/或糟糕的设计。
您不应该有包含多种类型对象的列表


相反,您应该使用
列表
,可能使用多态基类。

将绘图性能与从ArrayList读取性能进行比较,您无法通过使用其他数据容器解决闪烁问题。因此,ArrayList的替代容器不是答案。你需要使用一些其他的方法,比如

  • 像图形库一样使用
    SDL
    DirectX
    OpenGL
  • 绘制到位图缓冲区并在完成后显示位图(类似于双缓冲,但有时效果更好)
  • 子类化某些组件并重写某些方法,如背景绘图

有更多的方法,但您的问题的答案肯定与ArrayList没有多大关系。

将绘图性能与从ArrayList读取性能进行比较,您无法通过使用其他数据容器来解决闪烁问题。因此,ArrayList的替代容器不是答案。你需要使用一些其他的方法,比如

  • 像图形库一样使用
    SDL
    DirectX
    OpenGL
  • 绘制到位图缓冲区并在完成后显示位图(类似于双缓冲,但有时效果更好)
  • 子类化某些组件并重写某些方法,如背景绘图

有更多的方法,但你的问题的答案与ArrayList肯定没有多大关系。

你应该使用
列表而不是
ArrayList
,只是为了避免从列表中读取对象时不必要的强制转换。但是,与绘制图形相比,这样做的性能增益非常小,因此不会对更新问题产生任何明显的影响

<>你可以考虑将你的图形绘制成位图,然后在需要更新屏幕时绘制位图。


列表
数组列表
在添加和删除元素时表现相同;在列表末尾添加或删除元素的成本很低,但在列表开头插入或删除元素的成本更高


数组是列表中速度最快的,并且
List
ArrayList
都使用数组在内部存储其元素。但是,您无法调整数组的大小,因此您可能仍然希望使用
列表
,因为它可以根据需要分配数组,并跟踪数组的使用量。

您应该使用
列表
而不是
数组列表
,以避免从列表中读取对象时不必要的强制转换。但是,与绘制图形相比,这样做的性能增益非常小,因此不会对更新问题产生任何明显的影响

<>你可以考虑将你的图形绘制成位图,然后在需要更新屏幕时绘制位图。


列表
数组列表
在添加和删除元素时表现相同;在列表末尾添加或删除元素的成本很低,但在列表开头插入或删除元素的成本更高


数组是列表中速度最快的,并且
List
ArrayList
都使用数组在内部存储其元素。但是,您无法调整数组的大小,因此您可能仍然希望使用
列表,因为它可以根据需要分配数组,并跟踪使用了多少数组。

好的,这里有两个问题。ArrayList vs.List问题对“闪烁”没有影响,因为性能差异很小。如果列表项都是相同的类型,或者它们都是从除
对象
之外的公共基类型派生的,或者它们都实现了一个公共接口,那么
列表
是更好的选择。这是因为所涉及的铸件或装箱/拆箱较少。此外,它将更容易访问您的项目

闪烁:在绘制事件方法中绘制所有图形(f