Skip to content

๐ŸŽฎ ๊ฐ„๋‹จํ•œ ๋ธ”๋Ÿญ ๋งž์ถ”๊ธฐ ํผ์ฆ ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ 3D๋ฅผ ๊ณ๋“œ๋ฆฐ..!

Notifications You must be signed in to change notification settings

HwanCh0i/polyomino-puzzle

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

68 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Netlify Status

polyomino Polyomino-Puzzle

์ฃผ์–ด์ง„ ๊ฒŒ์ž„ ๋ณด๋“œ์— ํด๋ฆฌ์˜ค๋ฏธ๋…ธ ๋„ํ˜•์„ ์ ์ ˆํžˆ ์ฑ„์›Œ ๋‚˜๊ฐ€๋Š” ํผ์ฆ ํ˜•์‹์˜ ์›น ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ 3D๋ฅผ ๊ณ๋“ค์ธ..!

  • Live: https://polyomino-puzzle.com

  • ํ•ด๋‹น ๊ฒŒ์ž„์€ ์ตœ์‹  ๋ฒ„์ „์˜ Chrome, Firefox, Safari์—์„œ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํด๋ฆฌ์˜ค๋ฏธ๋…ธ๋ž€ ํฌ๊ธฐ๊ฐ€ ๊ฐ™์€ ์ •์‚ฌ๊ฐํ˜•๋“ค์„ ๋ณ€์ด ๋งž๋‹ฟ๊ฒŒ ๋ถ™์—ฌ ํ•˜๋‚˜๋กœ ์ด์–ด ๋งŒ๋“  ํ‰๋ฉด ๋„ํ˜•์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.

    ํด๋ฆฌ์˜ค๋ฏธ๋…ธ ์ด๋ฏธ์ง€

๐Ÿ“Contents

๐ŸŽฎ Usage

git clone https://github.com/chlghks/polyomino-puzzle.git
cd polyomino-puzzle
npm install
npm run start

๐Ÿ’กMotivation

๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋ณด๋‹ค๋Š” ํ•˜๋‚˜์˜ ํ™•์‹คํ•œ ์ปจ์…‰์„ ์ค‘์‹ฌ์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.


3D! ๋ฉ‹์ง€์ง€ ์•Š๋‚˜์š”?

3์ฐจ์›์ด๋ผ๋Š” ์ž…์ฒด์ ์ธ ๊ณต๊ฐ„์„ ์ด์šฉํ•ด์„œ ๋ฌด์—‡์ธ๊ฐ€๋ฅผ ๋งŒ๋“ค์–ด ๋‚ด๋Š” ๊ฒƒ ์ž์ฒด์— ํฐ ๋งค๋ ฅ์„ ๋Š๊ผˆ๊ณ ,
ํ…ŒํŠธ๋ฆฌ์Šค์™€ ํผ์ฆ ๋ธ”๋Ÿญ ๋งž์ถ”๊ธฐ ๋†€์ด์—์„œ ์•„์ด๋””์–ด๋ฅผ ์–ป์–ด 3D ํด๋ฆฌ์˜ค๋ฏธ๋…ธ ํผ์ฆ ๊ฒŒ์ž„์„ ๊ธฐํšํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“† Schedule

๊ธฐํš ๋ฐ ๊ตฌ์ƒ [ 09. 27. ~ 10. 01. ]

๊ฐœ๋ฐœ [ 10. 04. ~ 15. ]

  • ๊ฒŒ์ž„ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • Netlify ๋ฐฐํฌ

๐Ÿ›  Tech Stack

  • ES6+
  • React
  • Three.js
  • React-Three-Fiber
  • React-Three/Drei
  • Prop-Types
  • Styled-Components
  • Zustand

Why React?

๋ฐ˜๋ณตํ•ด์„œ ๋งŒ๋“ค์–ด์ง€๋Š” ๋ธ”๋Ÿญ๋“ค๊ณผ Three.js ๋ Œ๋”๋ง์„ ์œ„ํ•œ ๊ตฌ์„ฑ ์š”์†Œ(scene, light, camera, audio)๋“ค์„ React์˜ Component๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๊ด€๋ฆฌํ•จ์œผ๋กœ์จ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ ์ž ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”ฅ Challenges

# 3D

์ฒ˜์Œ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐํšํ•  ๋•Œ๋Š”, 2D์—์„œ ๋ฒ—์–ด๋‚˜ 3D๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ์ต์ˆ™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๊ฒŒ์ž„์„ ํ”Œ๋ ˆ์ดํ•˜๋Š” ํŽ˜์ด์ง€๋งŒ <canvas>๋กœ ๊ตฌํ˜„ํ•˜๊ณ , ๊ทธ ์™ธ ๊ฒŒ์ž„ ์ผ์‹œ์ •์ง€, ๋žญํ‚น ํ™•์ธ ๋“ฑ์˜ ๋‚˜๋จธ์ง€ ํŽ˜์ด์ง€๋“ค์€ <button> ๋“ฑ์˜ Element๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ 3D๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์— ์ต์ˆ™ํ•ด์ง€๋‹ˆ ํŽ˜์ด์ง€๋กœ ๋‚˜๋ˆ ์•ผ ํ•  ์š”์†Œ๋“ค์„ ๊ฐ๊ฐ ๋‹ค๋ฅธ ์ขŒํ‘œ์— ์œ„์น˜์‹œํ‚ค๊ณ  ์นด๋ฉ”๋ผ๋ฅผ ์ปจํŠธ๋กคํ•ด์„œ ์žฅ๋ฉด์ด ์ „ํ™˜๋˜๋Š” ๋“ฏํ•œ ํšจ๊ณผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋– ์˜ฌ๋ž์Šต๋‹ˆ๋‹ค.

์ดํ›„ ํ•ด๋‹น ์•„์ด๋””์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชจ๋“  ์š”์†Œ๋ฅผ <canvas> ๋‚ด์—์„œ 3D ์š”์†Œ๋กœ ๊ตฌํ˜„ํ•˜์˜€๊ณ , ์ด ๊ฒฝํ—˜์„ ํ†ตํ•ด ์ž‘์€ ์ƒ๊ฐ์˜ ์ „ํ™˜์ด ํ”„๋กœ์ ํŠธ์˜ ์ „์ฒด์ ์ธ ํ๋ฆ„์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.

# ํผ์ฆ ๋ธ”๋Ÿญ ์ปจํ…Œ์ด๋„ˆ

์ฒ˜์Œ Mockup์œผ๋กœ ๊ตฌ์ƒํ•  ๋•Œ๋Š” ๊ฒŒ์ž„ ์•ฑ๊ณผ ๊ฐ™์€ ๋Š๋‚Œ์„ ์ฃผ๊ธฐ ์œ„ํ•ด Carousel ๋ฐฉ์‹์„ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
๋ง‰์ƒ Carousel ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•ด ๋ณด๋‹ˆ ์ƒ์„ฑ๋œ ๋ธ”๋Ÿญ์ด ํ•œ ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š์•„ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ๋ถˆํŽธํ•จ์„ ๋Š๋‚„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์ด์–ผ์„ ๋Œ๋ฆฌ๋Š” ๋ฐฉ์‹์—์„œ ์•„์ด๋””์–ด๋ฅผ ์–ป์–ด, ํผ์ฆ ๋ธ”๋Ÿญ๋“ค์ด ๋‹ค์ด์–ผ์„ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํšŒ์ „๋˜๊ฒŒ ํ•˜์—ฌ 2D ๊ฐ™์€ ๋Š๋‚Œ๊ณผ ๋ธ”๋Ÿญ์ด ํ•œ ๋ˆˆ์— ๋ณด์ด์ง€ ์•Š์•˜๋˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

# ํผ์ฆ ๋ธ”๋Ÿญ ๋žœ๋ค ์ƒ์„ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ฒŒ์ž„ ํ”Œ๋ ˆ์ด์— ์‚ฌ์šฉ๋˜๋Š” ๋ธ”๋Ÿญ๋“ค์€ ์Šคํ…Œ์ด์ง€๋ณ„๋กœ ๊ณ ์ •๋œ ์ข…๋ฅ˜์˜ ๋ธ”๋Ÿญ์„ ๋ฐฉํ–ฅ๋งŒ ๋ฌด์ž‘์œ„๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉฐ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ณ„์†ํ•ด์„œ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๋ธ”๋Ÿญ์ด ์ƒ์„ฑ๋˜๋ฉด ์ผ์ •ํ•œ ํŒจํ„ด์ด ๋ฐ˜๋ณต๋˜์–ด ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ์ง€๋ฃจํ•จ์„ ๋Š๋‚„ ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๊ณ , ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ์Šคํ…Œ์ด์ง€๊ฐ€ ์‹œ์ž‘๋  ๋•Œ๋งˆ๋‹ค ํผ์ฆ ๋ธ”๋Ÿญ ์ž์ฒด๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋ถˆ๊ทœ์น™์„ฑ์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒŒ์ž„ ๋ณด๋“œ์˜ ์ขŒํ‘œ(์…€) ์ •๋ณด๊ฐ€ ๋‹ด๊ธด 2์ฐจ์› ๋ฐฐ์—ด์„ DFS ๋ฐฉ์‹์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ ํ˜„์žฌ ์„ ํƒ๋œ ์…€์„ ์ค‘์‹ฌ์œผ๋กœ ์ธ์ ‘ํ•œ ์…€ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์„ ํƒํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜์—ฌ ๋žœ๋ค ๋ธ”๋Ÿญ์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ธ์ ‘ํ•œ ์…€์„ ๋ฌด์ž‘์œ„๋กœ ์„ ํƒํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ณ ๋ฆฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์…€์„ ์šฐ์„ ์œผ๋กœ ์„ ํƒ๋˜๊ฒŒ ํ•˜์—ฌ 1๊ฐœ์˜ ์…€๋กœ ์ด๋ฃจ์–ด์ง„ ๋ธ”๋Ÿญ์ด ์ƒ๊ธฐ๋Š” ์˜ˆ์™ธ ์ผ€์ด์Šค๋ฅผ ๋ฐฉ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค.

# Frame Drop

๊ฒŒ์ž„์˜ ๊ธฐ๋ณธ์ ์ธ ์š”์†Œ๋“ค์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜๊ณ  ๋‚˜์„œ Netlify๋กœ ๋ฐฐํฌํ•˜์ž ๋ Œ๋”๋ง ์†๋„๊ฐ€ ๋Š๋ ค์ง€๊ณ  ๋ฒ„๋ฒ…๊ฑฐ๋ฆฌ๋Š” ํ˜„์ƒ์ด ํ™•์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ๋Š” 60FPS์œผ๋กœ ์œ ์ง€๋˜๋˜ ๊ฐ’์ด ๋ฐฐํฌ ์ดํ›„์— 25FPS๊นŒ์ง€ ๋–จ์–ด์ง€๋Š” Frame Drop์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ ํ”„๋กœํŒŒ์ผ๋ง ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด์„œ ํ™•์ธํ•ด ๋ณธ ๊ฒฐ๊ณผ, ํŠน์ • Hook(useFrame)์ด ์‹คํ–‰๋˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ๋กœ์ปฌ์—์„œ๋Š” 0.92ms, ๋ฐฐํฌ ํ›„์—๋Š” 10.96ms๋กœ ์•ฝ 10๋ฐฐ ์ด์ƒ์˜ ์ฐจ์ด๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋กœ์ปฌ ํ™˜๊ฒฝ ํ”„๋กœํŒŒ์ผ๋ง ๊ฒฐ๊ณผ ๋ฐฐํฌ ํ›„ ํ”„๋กœํŒŒ์ผ๋ง ๊ฒฐ๊ณผ

๋ฆฌ์„œ์น˜ ๊ฒฐ๊ณผ, ํ˜ธํ™˜์„ฑ ๋ชฉ์ ์œผ๋กœ ์‹œ์žฅ ์ ์œ ์œจ์ด 0.2% ์ด์ƒ์ธ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €๋“ค์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋„ˆ๋ฌด ๋งŽ์€ ๋ฒˆ๋“ค์ด ์ƒ์„ฑ๋˜๊ณ  ์žˆ์—ˆ๊ณ , ์ด๊ฒƒ์ด ๋นŒ๋“œ๋œ ์ดํ›„ Frame Drop์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์›์ธ์ž„์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

์ดํ›„ Chrome, Safari, Firefox์˜ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €๋งŒ ์ง€์›ํ•˜๋„๋ก ์ˆ˜์ •ํ•˜์—ฌ ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋˜ Hook์ด 3D ํ…์ŠคํŠธ๋ฅผ ์ •๋ ฌ์‹œํ‚ค๋Š” ๋ฐ ๊ณผ๋„ํ•œ ๋ Œ๋”๋ง์„ ์ผ์œผํ‚ค๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๊ณ , ํ•ด๋‹น Hook ์—†์ด ์ •๋ ฌ๋˜๋„๋ก ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ ์ตœ์ ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

Feature

  • ๊ฒŒ์ž„์ด ์‹œ์ž‘๋˜๋ฉด ๊ฒŒ์ž„ ๋ณด๋“œ์™€ ํผ์ฆ ๋ธ”๋Ÿญ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฒŒ์ž„ ๋ณด๋“œ๋ฅผ ํšŒ์ „์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํผ์ฆ ๋ธ”๋Ÿญ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํšŒ์ „์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Drag and Drop ๋ฐฉ์‹์œผ๋กœ ๊ฒŒ์ž„ ๋ณด๋“œ์— ํผ์ฆ ๋ธ”๋Ÿญ์„ ๋†“์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฒŒ์ž„ ๋ณด๋“œ์— ๋†“์€ ํผ์ฆ ๋ธ”๋Ÿญ์„ ํด๋ฆญํ•˜๋ฉด ๊ฒŒ์ž„ ๋ณด๋“œ์—์„œ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฃผ์–ด์ง„ ํผ์ฆ ๋ธ”๋Ÿญ์œผ๋กœ ๊ฒŒ์ž„ ๋ณด๋“œ๋ฅผ ์ฑ„์šฐ๋ฉด ๋‹ค์Œ ์Šคํ…Œ์ด์ง€๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

  • ์ฃผ์–ด์ง„ ์‹œ๊ฐ„ ์•ˆ์— ๊ฒŒ์ž„ ๋ณด๋“œ๋ฅผ ์ฑ„์šฐ์ง€ ๋ชป ํ•˜๋ฉด ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋˜๋ฉด ์ ์ˆ˜๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ  ๋žญํ‚น ๋“ฑ๋ก์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

About

๐ŸŽฎ ๊ฐ„๋‹จํ•œ ๋ธ”๋Ÿญ ๋งž์ถ”๊ธฐ ํผ์ฆ ๊ฒŒ์ž„์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ 3D๋ฅผ ๊ณ๋“œ๋ฆฐ..!

Topics

Resources

Stars

Watchers

Forks

Languages