Azure Function Service Bus Queue Trigger ํ๊ฒฝ์์ SkiaSharp์ ์ด์ฉ ์ค์ AccessViolationException์ด ๋ฐ์ํ์์ต๋๋ค.
๊ด๋ จํ์ฌ Github์ ์ฌ๋ ธ๋ ์ง๋ฌธ๊ณผ @evan-choi ๋๊ป์ ์ ๊ณตํด์ฃผ์ ํด๊ฒฐ์ฑ
์ ๊ณต์ ํฉ๋๋ค.
์ค๋ฅ ๋ฐ์
์ค๋ฅ ํด๊ฒฐ
SkiaSharp์ ์ฌ์ฉํ์๋ ๋ถ๋ค๊ป ๋์์ด ๋๋ฉด ์ข๊ฒ ์ต๋๋ค.
5 Likes
์๊ฑฐ ๊ฐ์ธ์ ์ผ๋ก ๊ถ๊ธํ ๋ถ๋ถ์ธ๋ฐ, ManagedStream ์ฌ์ฉ์ด ํต์ฌ์ธ ๊ฑด๊ฐ์โฆ?
2 Likes
๊ทธ๋ฐ ๊ฒ ๊ฐ์ต๋๋ค. ์ ๋ ์ ๊ทธ๋ฐ์ง๋ ํ์
ํ์ง ๋ชปํ๊ณ ์๋ ค์ฃผ์ ๋๋ก ์ํํ ๋ถ๋ถ์ด๋ผโฆ
๊ธฐ์ต์ ์ ์๋์ง๋ง ์ด๋ ๊ธ์์ ๊ฐ SkManagedStream์ ์ฐ์ง ์์๋ ๋๋ค๊ณ SkiaSharp ๊ฐ๋ฐ์๊ฐ ์ผ๋ ํฌ์คํธ๋ฅผ ๋ดค๋ ๊ฒ ๊ฐ์์ ๊ทธ๋์ SkManagedStream ์์ด ์ฌ์ฉํ์๋๋ฐ @evan-choi ๋๊ป์ ๋ง์ํด์ฃผ์ ๊ฑดโฆimagebytes ์คํ์ด ํด์ ๋๋ฉด์ unsafe memory์ ์ํฅ์ด ์๊ธด ๊ฒ ๊ฐ์ผ๋ SkMangedStream์ ์จ๋ณด๋ผ๊ณ ํ์
จ์ต๋๋ค.
SKBitmap.Decode์์๋ ์ค์์ ReadOnlySpan๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ ๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ์ ์ฝ๋์ ์๋ฅผ ์ฐพ์์ ๋ณด์ฌ์ฃผ์
จ๋๋ฐ ์๋์ ๊ฐ์ต๋๋ค. Decode์์ฒด ์ฝ๋๊ฐ ์ํํ๊ฒ ์๊ธฐ๊ธด ํ์
จ๋ค๊ณ ํ์
์ SKManagedStream์ ์ถ์ฒํ์
จ์ต๋๋ค.
public static unsafe SKBitmap Decode(ReadOnlySpan<byte> buffer)
{
fixed (byte* numPtr = &buffer.GetPinnableReference())
{
using (SKData data = SKData.Create((IntPtr) (void*) numPtr, buffer.Length))
{
using (SKCodec codec = SKCodec.Create(data))
{
return SKBitmap.Decode(codec);
}
}
}
}
2 Likes
์ค๋ SkiaSharp์ ๋ํด ๋ AccessViolationException์ด ๋ฐ์ํ๊ณ , ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์์ต๋๋ค.
SkBitmap.GetPixel();
์ ํธ์ถํ๋ฉด์ Skia ๋ด๋ถ์ API๋ฅผ ํธ์ถํ๋ ๊ณผ์ ์์ AccessViolationException์ด ๋ฐ์ํ์ต๋๋ค. ๋ฐ์ดํฐ ์์ฒด๊ฐ ์๋ชป๋ ๊ฒ์ด ๋ค์ด์์ ๋ฐ์ํ ์ค๋ฅ์์ง๋ง ํ๋ก์ธ์ค๋ ์ข
๋ฃ๊ฐ ๋์ง ์๊ณ ๋์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋ ๋ฐฉ๋ฒ์์ ๋์์ ๋ฐ์์ต๋๋ค.
https://jacking.tistory.com/1411
@jacking75 ๊ฐ์ฌํฉ๋๋ค!!
4 Likes
์ค๋์ ๊ธ์ธ๋ฐ ๋์ ๋์๋ค๋ ๋ฟ๋ฏํฉ๋๋ค^^
๊ณ ๋ง์ต๋๋ค~
4 Likes
๋จผ์ ๋ฌธ์ ํด๊ฒฐํ ๋ด์ฉ์ ๊ณต์ ํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
๋์ผํ ์ด์๋ฅผ ๊ฒช๋ ๋ฏํ์ฌ ์ฐธ๊ณ ํ๊ณ ์ ํ์๋๋ฐ, @jacking75 ๋ ๋ธ๋ก๊ทธ ๊ธ ๋งํฌ๊ฐ ์ ์์ด ์๋ฉ๋๋ค.
ํน์ ๋ธ๋ก๊ทธ๊ฐ ๋ ์ด์ ์ด์๋์ง ์๋ ๊ฑธ๊น์?
2 Likes
ํน์ ํฐ์คํ ๋ฆฌ ๋ธ๋ก๊ทธ๋ผ๋ฉด ํฐ์คํ ๋ฆฌ๊ฐ ๋ธ๋ก๊ทธ๋ฅผ ์ ๋ฆฌํด์ ๋ค ์ฌ๋ผ์ก์ต๋๋ค ;;;
ํ์ฌ๋ https://jacking75.github.io/ ์ฌ๊ธฐ์ ๋ธ๋ก๊น
ํ๊ณ ์์ต๋๋ค.
4 Likes