Фон
Я работаю над приложением, которое должно работать на любой платформе Windows начиная с XP и далее одинаково.Через .NET Framework это было очень просто, по большей части.Приложение работает на различных сенсорных поверхностях.Приложение предназначено для .Net 3.0, но если по какой-то причине мне следует перейти на .Net 3.5, я могу это сделать.Я не могу использовать 4.0.
Приложение интенсивно использует GDI + через пространство имен System.Drawing.Теперь я понимаю, что GDI + либо вовсе не аппаратно ускоряется, либо ускоряется только в очень небольшом количестве видеокарт, поэтому я ожидаю проблем с производительностью.Однако эта проблема является явной и значительно снижает удобство использования приложения.Я бы не стал переписывать все приложение для DirectX или OpenGL, если этого можно избежать с помощью простого исправления.
Проблема
Мы недавно установили Windows 7 64-немного на одной из сенсорных таблиц.Это был первый раз, когда приложение запускалось на 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-битной Windows и 64-битной Windows?Если я не смогу найти решение, мне придется потратить немного времени на то, чтобы все рисовать с аппаратным ускорением.Я хотел бы избежать этого, если это вообще возможно.
Спасибо всем!
РЕДАКТИРОВАТЬ: Запрошенный фрагмент кода
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, либо использовать старые драйверы.Кто-нибудь знает наверняка, это лучший курс действий?