Фон
Я работаю над приложением, которое должно одинаково работать на каждой платформе Windows, начиная с XP. Благодаря платформе .NET это по большей части было очень просто. Приложение работает на различных сенсорных поверхностях. Приложение нацелено на .Net 3.0, но если по какой-то причине мне нужно перейти на .Net 3.5, я могу это сделать. Я не могу использовать 4.0.
Приложение активно использует GDI+ через пространство имен System.Drawing. Теперь я понимаю, что GDI+ либо вообще не имеет аппаратного ускорения, либо ускоряется только на очень небольшом количестве видеокарт, поэтому я ожидаю некоторых проблем с производительностью. Однако эта проблема является серьезной и значительно снижает удобство использования приложения. Я бы предпочел не переписывать все приложение целиком для DirectX или OpenGL, если этого можно избежать с помощью простого исправления.
Проблема
Недавно мы установили 64-разрядную версию Windows 7 на один из сенсорных столов. Это был первый раз, когда приложение запускалось на 64-битной машине с Windows 7. В любом случае, любое рисование (в частности, DrawLine) более чем одним пальцем на устройстве одновременно вызывает смехотворное отставание. Это отставание не проявляется в 32-битной Windows XP или 32-битной Windows 7, поэтому я думаю, что это может быть характерно для 64-битной Windows 7 (у меня нет 64-битной машины XP для тестирования).
Приложение также было вынуждено работать как 32-разрядное приложение из-за того, что один из файлов .dll имеет только 32-разрядные библиотеки, доступные для его компиляции. Я где-то читал, что перевод процесса в 32-битный режим в 64-битной системе может вызвать проблемы с производительностью, но когда я обновил SDK, который мы использовали, и создал 64-битную .dll и приложение, проблема осталась.
Я прочитал в этом другом потоке StackOverflow, что не должно быть различий между 32-битным и 64-битным приложением в отношении GDI+. Кажется, это не тот случай.
Итак, к чему это сводится: кто-нибудь из вас знает, почему может быть такая огромная разница в производительности между 32-битной и 64-битной Windows? Если я не смогу найти решение, мне придется потратить немного времени на то, чтобы все использовало аппаратное ускорение рисования. Я хотел бы избежать этого, если это вообще возможно.
Всем спасибо!
EDIT: запрошенный фрагмент кода
public delegate void drawLineDelegate(Color color, float width, int x1, int y1, int x2, int y2);
public void drawLine(Color color, float width, int x1, int y1, int x2, int y2)
{
if (InvokeRequired)
{
Invoke(new drawLineDelegate(drawLine), new object[] { color, width, x1, y1, x2, y2 });
}
else
{
try
{
lock (drawLock)
{
pen.Width = width;
pen.Color = color;
scaledPen.Width = width * this.Width / Canvas.Width;
scaledPen.Color = color;
Point p1 = scalePointToScreen(new Point(x1, y1));
Point p2 = scalePointToScreen(new Point(x2, y2));
graphics.DrawLine(pen, x1, y1, x2, y2);
scaledGraphics.DrawLine(scaledPen, p1.X, p1.Y, p2.X, p2.Y);
this.Invalidate(new Rectangle(Math.Min(p1.X, p2.X) - (int)scaledPen.Width, Math.Min(p1.Y, p2.Y) - (int)scaledPen.Width,
Math.Abs(p2.X - p1.X) + 2 * (int)scaledPen.Width, Math.Abs(p2.Y - p1.Y) + 2 * (int)scaledPen.Width));
}
}
catch (Exception ex)
{
if (Scribbler.Properties.Settings.Default.LogLevel >= 2)
{
Scribbler.ScribblerForm.WriteLogMessage(ex.ToString());
}
}
}
Правка: дополнительные исследования Я еще раз прошерстил Интернет в отношении карт NVidia, которые мы используем на наших машинах. Это привело меня к нескольким сообщениям на форумах разработчиков NVidia о людях с такой же проблемой. Распространенный ответ заключается в том, что GDI устарел в Windows 7, а более новые графические драйверы NVidia (начиная с версии 182.5) страдают от проблем с производительностью GDI. Решения заключались либо в обновлении до Direct3D, либо в использовании старых драйверов. Кто-нибудь знает наверняка, является ли это лучшим курсом действий?