UWP Win2D: как проверить, пересекает ли путь прямоугольник - PullRequest
0 голосов
/ 24 мая 2019

Мне нужен супер-быстрый способ проверить, пересекает ли данное 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), чтобы получить максимальную производительность для этого сценария?

Спасибо !!

...