ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
๐Ÿš€ Harbeth: High-Performance Swift Image Processing Library
Dev.toDev.to
Mobile

iOS/macOS ๊ฐœ๋ฐœ์ž๊ฐ€ Metal ๊ธฐ๋ฐ˜์˜ Swift ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Harbeth๋ฅผ ๊ฐœ๋ฐœํ•ด GPU ๊ฐ€์† ๋ Œ๋”๋ง๊ณผ ์ง๊ด€์  API๋กœ ์‹ค์‹œ๊ฐ„ ์ฒ˜๋ฆฌ ๊ตฌํ˜„

๐Ÿš€ Harbeth: High-Performance Swift Image Processing Library

Condy2026๋…„ 3์›” 28์ผ7๋ถ„intermediate

Context

๊ธฐ์กด ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์†”๋ฃจ์…˜๋“ค์€ ์„ฑ๋Šฅ ๋ถ€์กฑ์ด๊ฑฐ๋‚˜ ๋ณต์žกํ•œ API๋ฅผ ์ œ๊ณตํ–ˆ์œผ๋ฉฐ, Metal์˜ ๊ฐ•๋ ฅํ•จ์„ ํ™œ์šฉํ•˜๋ฉด์„œ๋„ iOS/macOS/tvOS/watchOS ๊ฐ„ ์ผ๊ด€๋œ ๋™์ž‘์„ ๋ณด์žฅํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค. ์‹ค์‹œ๊ฐ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์ŠคํŒŒ์ดํฌ์™€ ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ ๋ณต์žก์„ฑ์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.

Technical Solution

  • Metal ๊ธฐ๋ฐ˜ ๊ณ„์ธตํ™” ์•„ํ‚คํ…์ฒ˜ ๊ตฌํ˜„: C7RenderPipeline ํด๋ž˜์Šค๋กœ ๋ Œ๋” ํŒจ์Šค ๋””์Šคํฌ๋ฆฝํ„ฐ, ์ปค๋งจ๋“œ ๋ฒ„ํผ, ๋ Œ๋” ์ปค๋งจ๋“œ ์ธ์ฝ”๋”ฉ์„ ํ†ตํ•ฉ ๊ด€๋ฆฌ
  • ํ…์Šค์ฒ˜ ํ’€ ์‹œ์Šคํ…œ ๋„์ž…: TexturePool ํด๋ž˜์Šค๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๊ณ  ํ…์Šค์ฒ˜๋ฅผ ์บ์‹œํ•˜์—ฌ ์žฌ์‚ฌ์šฉ
  • ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๋‚ด์žฅ: Device.setEnablePerformanceMonitor()๋กœ ์ด ์ฒ˜๋ฆฌ ์‹œ๊ฐ„๊ณผ GPU ์‹œ๊ฐ„์„ ์‹ค์‹œ๊ฐ„ ์ถ”์ 
  • ์ปค์Šคํ…€ ํ•„ํ„ฐ ์ƒ์„ฑ ์ง€์›: C7FilterProtocol๊ณผ Metal ์…ฐ์ด๋”๋ฅผ ์กฐํ•ฉํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์ปค๋„ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
  • 3๊ฐ€์ง€ API ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต: HarbethIO ์ธ์Šคํ„ด์Šค ๋ฐฉ์‹, ์ง์ ‘ ํ™•์žฅ ๋ฉ”์„œ๋“œ, ์—ฐ์‚ฐ์ž ์ฒด์ด๋‹(>>)์œผ๋กœ ์œ ์—ฐํ•œ ํ•„ํ„ฐ ์ ์šฉ
  • ์‹ค์‹œ๊ฐ„ ์นด๋ฉ”๋ผ ์ฒ˜๋ฆฌ: C7CollectorCamera๋กœ 1280x720 ํ•ด์ƒ๋„์—์„œ 60 FPS ์นด๋ฉ”๋ผ ํ”ผ๋“œ์— ํ•„ํ„ฐ ์ ์šฉ
  • ๋ณตํ•ฉ ํ•„ํ„ฐ ์ฒด์ธ ๊ตฌ์„ฑ: ์—ฌ๋Ÿฌ ํ•„ํ„ฐ(C7Brightness, C7Contrast, C7Saturation ๋“ฑ)๋ฅผ ๋ฐฐ์—ด๋กœ ์กฐํ•ฉํ•˜์—ฌ ๋ณต์žกํ•œ ์ด๋ฏธ์ง€ ํšจ๊ณผ ์ƒ์„ฑ

Impact

์•„ํ‹ฐํด์— ์ •๋Ÿ‰์  ์„ฑ๋Šฅ ์ˆ˜์น˜๊ฐ€ ๋ช…์‹œ๋˜์ง€ ์•Š์•˜๋‹ค.

Key Takeaway

Metal์˜ ์ €์ˆ˜์ค€ ๋ณต์žก์„ฑ์„ Swift ๋ž˜ํผ๋กœ ์ถ”์ƒํ™”ํ•˜๋ฉด์„œ ํ…์Šค์ฒ˜ ํ’€๋ง๊ณผ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ•ต์‹ฌ ์ธํ”„๋ผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์‹ค์‹œ๊ฐ„ GPU ์ž‘์—…์˜ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ •์„ฑ๊ณผ ๊ฐœ๋ฐœ์ž ์ƒ์‚ฐ์„ฑ์„ ๋™์‹œ์— ํ™•๋ณดํ•˜๋Š” ์—ด์‡ ์ด๋‹ค.


Swift ๊ธฐ๋ฐ˜ iOS/macOS ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํŒ€์—์„œ TexturePool์„ ํ†ตํ•œ ๋ฉ”๋ชจ๋ฆฌ ์žฌ์‚ฌ์šฉ๊ณผ PerformanceMonitor๋ฅผ ํ†ตํ•œ ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์ ์šฉํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์ŠคํŒŒ์ดํฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  60 FPS ์นด๋ฉ”๋ผ ์ฒ˜๋ฆฌ ๊ฐ™์€ ๊ณ ์„ฑ๋Šฅ ์‹ค์‹œ๊ฐ„ ์ž‘์—…์„ ์•ˆ์ •์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์›๋ฌธ ์ฝ๊ธฐ