Member 14868736 Ответов: 1

Ускоренный вариант метода setpixel


Это моя функция, но она работает слишком медленно. Может ли кто-нибудь помочь мне ускорить его?

void LayerShow(Color[,] layer)// показывает слой на панели.
{
for (int y = 0; y < CanvasDimY; y++)
{
для (int x = 0; x < CanvasDimX; x++)
{
изображение.Методом setpixel(X, у, слой[х, г]);
}
}
Панельканвас.BackgroundImage = изображение;
Панельканвас.Освежить();
}

Что я уже пробовал:

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

1 Ответов

Рейтинг:
8

Luc Pattyn

Вы можете получить значительные улучшения скорости с помощью unsafe код; на самом деле небезопасная альтернатива SetPixel является ярким примером LockBits и тому подобное.

Кстати гуглить faster SetPixel выйдет много статей, объясняющих все это...

:)


Member 14868736

Как я уже писал, я уже искал все эти ключевые слова. Я не могу заставить его работать. Мне нужно переписать мой крошечный пример кода.

Luc Pattyn

И в чем же проблема? Компилируется ли ваш код без ошибок? Она вообще работает? Будьте конкретны, если вам что-то нужно. При необходимости покажите нам соответствующий код.

Да, чтобы сделать его намного быстрее, потребуется некоторое переписывание, волшебной пули нет...

Официальная документация в MSDN дает вам все, что вам может понадобиться, например https://docs.microsoft.com/en-us/dotnet/api/system.drawing.bitmap.lockbits?view=netframework-4.0

И этот сайт предлагает некоторые статьи, которые объясняют это больше и хорошо используют его. Это может вас заинтересовать: https://www.codeproject.com/Articles/38619/Finding-a-Bitmap-contained-inside-another-Bitmap

:)

Member 14868736

Я рассказал вам, в чем именно заключается проблема, показал свой код и попросил более быстрый способ сделать именно то, что делает мой код. Здесь нет никакой другой проблемы. Никаких ошибок, тогда я бы, конечно, упомянул об этом.

0x01AA

И он сказал вам точно - дал вам соответствующие ссылки - как это сделать ;)

Member 14868736

Извините, но эта ссылка так же бесполезна для меня, как и ваш комментарий. Мне нужно при переписывании моего кода или близко к нему, так как я очень новичок в кодировании C#.