Недавно я столкнулся с ситуацией, когда компьютеры с Вистой страшно висли при запуске нашего проекта, переписанного на WPF. Все бы ничего, но один — мой — компьютер работал нормально.

После некоторых исследований оказалось, что проблема в видеокарточках с чипсетом от ATI. Основной симптом — миллионы Memory Page Faults в спсике процессов.

Это было вызвано отрисовкой простого прямоугольника с использованием DrawingImage в качестве фона и размерами около… 200 000 на 200 200 000 ;)

Если у вас есть Виста с видеокартой ATI то можно легко воспроизвести этот эффект этим XAML кодом:

<Page
xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”
xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”>
<Page.Resources>
   <!– Define DrawingBrush with red circle –>
 <DrawingBrush x:Key=”Background”
Stretch=”None” TileMode=”Tile”
Viewbox=”0,0,128,128″ ViewboxUnits=”Absolute”
Viewport=”0,0,128,128″ ViewportUnits=”Absolute”>
<DrawingBrush.Drawing>
<GeometryDrawing Brush=”Red”>
<GeometryDrawing.Geometry>
<EllipseGeometry Center=”64,64″ RadiusX=”16″ RadiusY=”16″/>
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingBrush.Drawing>
</DrawingBrush>
</Page.Resources>
<Grid>
<Canvas>
   <!– Define rectangle «rect» filled with drawing brush –>
 <Rectangle Name=”rect”
Width=”300″ Height=”300″
Canvas.Left=”0″ Canvas.Top=”0″
Fill=”{StaticResource Background}”>
<Rectangle.Triggers>
   <!– When rectangle loads –>
 <EventTrigger RoutedEvent=”Rectangle.Loaded”>
<BeginStoryboard>
<Storyboard>
   <!– Start animation that scales rectangle to 200 000 –>
           <DoubleAnimation Duration=”0:1:0″
Storyboard.TargetName=”rect”
Storyboard.TargetProperty=”Width”
To=”200000″/>                         
<DoubleAnimation Duration=”0:1:0″
Storyboard.TargetName=”rect”
Storyboard.TargetProperty=”Height”
To=”200000″/>
  <!– And add some dynamics ;) –>
               <DoubleAnimation Duration=”0:1:0″
Storyboard.TargetName=”rect”
Storyboard.TargetProperty=”(Canvas.Left)”
To=”-200000″/>                         
<DoubleAnimation Duration=”0:1:0″
Storyboard.TargetName=”rect”
Storyboard.TargetProperty=”(Canvas.Top)”
To=”-200000″/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
</Canvas>
   <!– TextBlock to display current rectangle width –>
      <StackPanel Orientation=”Horizontal”>
<TextBlock Text=”Width: “/>
<TextBlock Text=”{Binding Path=Width, ElementName=rect}”/>
</StackPanel>
</Grid>
</Page> 

Наши компьютеры висли при размере прямоугольника порядка 100 000.

В ATI написали – ждем ответа.

Ответить