ATI, Vista и WPF
17.04.08
Недавно я столкнулся с ситуацией, когда компьютеры с Вистой страшно висли при запуске нашего проекта, переписанного на 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 написали – ждем ответа.
Ответить