Мне нужен супер-быстрый способ проверить, пересекает ли данное Path
данное Rectangle
.
Для этой цели я разработал этот метод, который «обрезает» Path
на данном прямоугольнике и проверяет, было ли что-либо нарисовано в этой области.
public static readonly CanvasDevice CanvasDev = CanvasDevice.GetSharedDevice();
private static readonly CanvasRenderTarget s_offScreen = new CanvasRenderTarget(CanvasDev, 10, 10, 96);
public static bool IsPathDrawnInsideRect(this CanvasGeometry geom, Vector2 offset, byte alphaThreshold)
{
if (geom == null)
return false;
using (CanvasDrawingSession ds = s_offScreen.CreateDrawingSession())
{
// do not forget clear buffer
ds.Clear(Colors.Transparent);
ds.DrawGeometry(geom, offset, Colors.Black);
}
byte[] bytes = s_offScreen.GetPixelBytes();
return bytes.Any(c => c > alphaThreshold);
}
Метод работает, и он довольно точен (по крайней мере, достаточно точен для моих целей), но, к сожалению, для выполнения оператора s_offScreen.GetPixelBytes();
иногда требуется до 10 мс, и мне нужен полный метод, чтобы остаться в пределах 1 мс.
Есть ли более быстрый способ проверить, содержит ли данный CanvasRenderTarget
какой-либо пиксель с каналом ALPHA выше указанного порога?
Или, альтернативно, как я могу настроить CanvasRenderTarget
(в терминах DirectXPixelFormat
и CanvasAlphaMode
), чтобы получить максимальную производительность для этого сценария?
Спасибо !!