Сверхбыстрое рисование в DotNET - PullRequest
4 голосов
/ 27 июня 2009

Начальные тесты показывают, что GDI + (запись в VB.NET) недостаточно быстр для моих целей. Мое приложение должно иметь возможность рисовать десятки тысяч частиц (цветные круги, очень желательно сглаженные) с полным разрешением экрана со скоростью 20+ кадров в секунду.

Я не решаюсь отойти от GDI +, поскольку мне также требуются многие другие расширенные функции рисования (штриховые рисунки, изображения, текст, контуры, заливки) в GDI +.

Нужны полезные советы по использованию OpenGL, DirectX или других платформ для ускорения рендеринга частиц из VB.NET. Мое приложение строго 2D.

Goodwill, David

Ответы [ 7 ]

4 голосов
/ 28 июня 2009

Если вы хотите использовать VB.NET, вы можете использовать XNA или SlimDX.

У меня есть некоторый опыт в создании игр с GDI + и XNA, и я могу понять, что GDI + доставляет вам неприятности. Если бы я был там, я бы посмотрел XNA, он намного быстрее, чем GDI +, потому что он фактически использует вашу видеокарту для рисования, и у него есть много хорошей документации и примеров в Интернете.

SlimDX также выглядит хорошо, но у меня нет опыта работы с ним. SlimDX - это API DirectX для .NET.

3 голосов
/ 27 июня 2009

Единственный способ получить необходимую вам скорость - это перейти от программного рендеринга к аппаратному рендерингу ... и, к сожалению, это означает переход на OpenGL или DirectX.

Альтернатива состоит в том, чтобы попытаться оптимизировать графические процедуры так, чтобы они рисовали только те частицы, которые нужно нарисовать, а не весь экран / окно.

Я бы согласился с JaredPar, что вам лучше сначала профилировать, чтобы определить, можно ли улучшить существующую кодовую базу, прежде чем переходить на новую инфраструктуру. DirectX - не самый простой фреймворк, если вы с ним не знакомы.

2 голосов
/ 29 июня 2009

Как сказал Джаред, может случиться так, что значительная часть ваших циклов не входит в GDI, и вы можете уменьшить их.

Простой способ найти их - это несколько раз остановить их случайным образом и проверить стек. Вероятность того, что вы поймаете его в процессе напрасной траты времени, равна потере времени.

Любая инструкция или инструкция вызова, которые появляются в более чем одном таком образце, - это то, что, если бы вы могли заменить их, вы бы увидели ускорение.

В общем, метод такой.

2 голосов
/ 28 июня 2009

Самым значительным приростом скорости, который я обнаружил при написании игры для GDI +, было преобразование моих растровых изображений в Format32bppPArgb; -

SuperFastBitmap = ConvertImagePixelFormat (SlowBitmap, Imaging.PixelFormat.Format32bppPArgb)

Если они не в этом формате, вы сразу увидите разницу при конвертации.

2 голосов
/ 27 июня 2009

Возможно, проблема в вашем алгоритме, а не в GDI +. Профилирование - единственный способ узнать наверняка. Без профиля очень возможно, что вы переключитесь на новую структуру GUI и столкнетесь с точно такими же проблемами.

Если вы создали профиль, какая часть GDI + вызывала проблему?

1 голос
/ 27 июня 2009

Когда вы работаете в VB.net, вы пытались использовать WPF (часть .net начиная с 3.0)? Поскольку WPF основан на DirectX, а не на GDI +, это должно дать вам необходимую скорость, хотя разработка WPF совсем не прямолинейна.

0 голосов
/ 12 февраля 2014

Поскольку GDI + не перемещается графической картой, рендеринг выполняется медленно, поскольку он использует процессор для рендеринга. По крайней мере, вы можете использовать DirectX или SlimDX.

(извините за плохой английский)


См. Это: http://msdn.microsoft.com/en-us/library/windows/desktop/ff729480%28v=vs.85%29.aspx http://www.codeproject.com/Articles/159586/Starting-DirectX-with-Visual-Basic-NET

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...