重新计算'WRriteBitmap'时的性能问题

时间:2014-09-16 14:27:00

标签: c# wpf object writablebitmap

由于我的问题相当罕见,而且我没有一个线索可能导致它,我将尝试包含可能与它有关的每个代码,剥离到基本要素以避免不必要的混乱。 / p>

基本上,我有一个TabControl,其TabItemsContent个人UserControl是自定义的<UserControl> <Grid> <Grid.RowDefinitions> <RowDefinition /> <RowDefinition /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition /> <ColumnDefinition /> </Grid.ColumnDefinition> <ScrollViewer Height="Auto" HorizontalAlignment="Stretch" Margin="0" Name="scrollViewer11" VerticalAlignment="Stretch" Width="Auto" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"></ScrollViewer> <ScrollViewer Grid.Column="1" Height="Auto" Name="scrollViewer12" Width="Auto" Margin="0" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"></ScrollViewer> <ScrollViewer Grid.Row="1" Height="Auto" Name="scrollViewer21" Width="Auto" Margin="0" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"></ScrollViewer> <ScrollViewer Grid.Row="1" Grid.Column="1" Height="Auto" Name="scrollViewer22" Width="Auto" Margin="0" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"></ScrollViewer> </Grid> </UserControl> 。 这些控件具有以下形式:

ScrollViewer

行数和列数取决于所使用的控件,范围从1x1网格中的单个单元格到3x2网格中的6个单元格(每个网格都与WriteableBitmap相对应)。

现在我的实际C#代码。对于每个单元格,用户可以添加public partial class MainWindow : Window { List<WorkSpace> WorkSpaceList = new List<WorkSpace>(); private WorkSpace currentSpace = null; //one of the methods that adds to the TabControl, here a 2x2 grid: private void NewWorkspaceFour(WorkSpace ws) { WorkSpaceFour workSpaceFour = new WorkSpaceFour(); for (int i = 0; i < 4; i++) { WorkPlace wp = new WorkPlace(); ws.workPlaceList.Add(wp); switch (i) { case 0: workSpaceFour.scrollViewer11.Content = wp.grid; break; case 1: workSpaceFour.scrollViewer12.Content = wp.grid; break; case 2: workSpaceFour.scrollViewer21.Content = wp.grid; break; case 3: workSpaceFour.scrollViewer22.Content = wp.grid; break; } } ws.tabItem.Content = workSpace; tabControlImages.Items.Add(ws.tabItem); } //triggered in UI e.g. by moving a Slider private void NewSettings(object sender, RoutedPropertyChangedEventArgs<double> e) { currentSpace.NewSettings((float)(e.NewValue)); } } internal class WorkSpace { internal delegate void NewSettingHandler(float e); internal List<WorkPlace> workPlaceList = new List<WorkPlace>(); internal TabItem tabItem = new TabItem(); internal WorkPlace currentPlace = null; internal NewSettingsHandler NewSettings; internal WorkSpace() { NewSettings += ChangeSettings; } internal void ChangeSettings(float newValue) { //do something small with newValue currentPlace.RecalculateImage(); } //...more methods that would use "newValue" in a different way, thus the delegate } internal class WorkPlace { internal WriteableBitmap bitmap; internal Image image = new Image {//settings}; internal Grid grid = new Grid {//settings}; internal Grid gridImage = new Grid {//settings}; internal WorkPlace() { grid.Children.Add(gridImage); gridImage.Children.Add(image); } internal void RecalculateImage() { //some rather long calculations... bitmap.WritePixels(...,...,...,...); image.Source = bitmap; } } ,其中代码的组织如下:

currentSpace

通过该程序,用户可以更改标签以更改currentPlace并单击单元格以更改相应的currentSpace = space,只需更改引用即space,其中{{1} }}指的是包含新选定WorkSpace的{​​{1}}。

现在问题如下。当一个选项卡包含一个带有图像的简单1x1网格并移动滑块时,它会非常流畅地运行。当标签包含3x2网格且此网格中只有一个单元格包含TabItemWorkPlace不是bitmap时,它的工作方式相同。但是,当3x2网格完全被“绘制”null填充并且移动滑块时,即使只重新计算了重绘的6个图像中的一个,也会出现明显的延迟。我不明白为什么会这样。它可能与渲染或对象引用有关,但我不知道C#是否足以在此处查看和发布。

希望代码不会太长(我已经尽可能地删除它)并且足够清楚。如果没有,请说出来,我会更新/添加它。在该程序的先前版本中,UI基本相同,但重新计算的图像却完全不同,但我永远无法观察到这个问题。

0 个答案:

没有答案