์ค์ค๋ก ํด๊ฒฐํ ์ ์๋ makecene ๋ช ๋ น์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
Ubuntu 16.04 64๋นํธ์์ Readme.md์ ์ง์นจ์ ๋ฐ๋ผ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ๋ณต์ ํ๊ณ ๋น๋ํ์ต๋๋ค. ๋น๋๊ฐ ์ค๋ฅ ์์ด ์ปดํ์ผ๋๊ณ ๋ชจ๋ ์ฑ์ด ์์ต๋๋ค.
๊ทธ๋ฌ๋ -i ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ makecene ๋ช
๋ น์ ์คํํ๋ฉด
๋ช ๋ น์ด ์ผ๋ง๋ ๋ฉ๋ฆฌ ์คํ๋๋์ง ํ์ธํ๊ธฐ ์ํด ์ฝ๋์ ์ถ๋ ฅ ๋ฉ์์ง๋ฅผ ์ถ๊ฐํ์ผ๋ฉฐ ๋ถ๋ช ํ ์ถฉ๋์ด image_io.cc ํ์ผ, load_png_file ํจ์์์ ํฌ์ธํฐ๊ฐ ์ค์ ๋๋ 311-314 ํ ์ฃผ๋ณ์์ ๋ฐ์ํฉ๋๋ค.
์ด๋ป๊ฒ ๊ณ ์ณ์ผ ํ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. headers.height ๋ฐ headers.channels์ ๊ฐ์ ์๋ฏธ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
image_io
์ ์ถฉ๋์ ์๋์ ์ผ๋ก ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ต๋๋ค. ํ
์คํธ ํ๋ก๊ทธ๋จ์ ์์ฑํ๊ณ ์ด๋ฏธ์ง๋ฅผ ์๋์ผ๋ก ๋ก๋ํ ์ ์์ต๋๊น?
#include "mve/image_io.h"
int main() {
mve::image::load_png_file("your path");
return 0;
}
์ด๋ฏธ์ง์ ๋ค๋ฅธ ํน๋ณํ ๊ฒ์ด ์์ต๋๊น? 8๋นํธ ๋๋ 16๋นํธ PNG์ ๋๊น?
์, ํ ์คํธ ํ๋ก๊ทธ๋จ์ ์ปดํ์ผํ๊ณ ํ ์คํธ ์ฑ๊ณผ ๊ฐ์ ํด๋์ ์๋ PNG๋ฅผ ๋ก๋ํ๋ ค๊ณ ํฉ๋๋ค. ๋๋ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์๊ณ ํ๋ก๊ทธ๋จ์ "Ungรผltiger Maschinenbefehl (Speicherabzug geschrieben)"๊ณผ ์ถฉ๋ํฉ๋๋ค.
๊ทธ๋ฌ๋ ํจ์ ํธ์ถ์ "load_tiff_file"๋ก ๋ณ๊ฒฝํ๊ณ ๋์ TIFF ํ์ผ์ ๋ก๋ํ๋ฉด ์ ์์ ์ผ๋ก ์คํ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. load_png_file ํจ์๊ฐ ๊ตฌ์ฒด์ ์ผ๋ก ์์๋์์ ์ ์์ต๋๊น?
์ด๊ฒ์ด ๋์์ด ๋ ์ง ํ์คํ์ง ์์ง๋ง ์ฝ๋๋ฅผ load_png_file๋ก ๋ค์ ๋ณ๊ฒฝํ๊ณ strace๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์ฑ๊ณผ ๊ด๋ จ๋ ์์คํ ๋ก๊ทธ๋ฅผ ๊ฐ์ ธ์์ต๋๋ค. ๋ค์์ ์ถฉ๋ํ๊ธฐ ์ ์ ํด๋น ๋ก๊ทธ์ ๋ง์ง๋ง ๋ช ์ค์ ๋๋ค.
14:00:46.197536 open("./frame_0001.png", O_RDONLY) = 3
14:00:46.197561 fstat(3, {st_mode=S_IFREG|0664, st_size=407653, ...}) = 0
14:00:46.197582 ์ฝ๊ธฐ(3, "\211PNG\r\n\32\n\0\0\0\rIHDR\0\0\5\0\0\0\2\320\10\2\0 \0\0@\37J"..., 4096) = 4096
14:00:46.197651 mmap(NULL, 2768896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fcadc163000
14:00:46.198666 --- SIGILL {si_signo=SIGILL, si_code=ILL_ILLOPN, si_addr=0x40b69d} ---
14:00:46.337334 +++ SIGILL์ ์ํด ์ฃฝ์(์ฝ์ด ๋คํ) +++
๊ทธ ์ด๋ฏธ์ง์ ๋ํ ๋งํฌ๋ฅผ ๋ณด๋ด์ฃผ์๊ฒ ์ต๋๊น?
๋ด ์๊ฐ์๋ ์ด๋ฏธ์ง์ png ํ์ฅ์๊ฐ ์์ง๋ง ์ค์ ๋ก๋ png๊ฐ ์๋๋๋ค... ".png" ํ์ผ์ด ์ค์ ๋ก jpeg๋ก ์ธ์ฝ๋ฉ๋ ์ ์ฌํ ๋ฌธ์ ๋ฅผ ๋ณธ ์ ์ด ์์ต๋๋ค.
http://maxdid.it/gamejam/img/frame_0001.png
ffmpeg๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋์ค ํ๋ ์์ ์ด๋ฏธ์ง ํ์ผ๋ก ๋ด๋ณด๋์ต๋๋ค.
์๋ชป๋ ํ์ผ ํ์์ผ ์๋ ์๋ค๊ณ ์๊ฐํ์ง๋ง ๋ณํ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ png์์ tiff๋ก ๋ณํํ๋ค๊ฐ ๋ค์ ๋ณํํ์ง๋ง ์๋ฌด๋ฐ ํจ๊ณผ๊ฐ ์์์ต๋๋ค.
ํ์ผ์ ์ฌ๊ธฐ์์ ์ ๋ก๋๋ฉ๋๋ค.
open("frame_0001.png", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0640, st_size=691915, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5395d8a000
read(3, "\211PNG\r\n\32\n\0\0\0\rIHDR\0\0\5\0\0\0\2\320\10\2\0\0\0@\37J"..., 4096) = 4096
mmap(NULL, 2768896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5393b87000
read(3, "\7\0?)\363\207i\27\30x'\356\330\214Xg\7\260\334W\23G\371\323\31 \323\2S\273\353\\"..., 4096) = 4096
...
strace
์ ๋ฐ๋ฅด๋ฉด ํ๋ก๊ทธ๋จ์ SIGILL(KILL ์๋)์ ์ํด ์ข
๋ฃ๋ฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ๊ทํ์ ํ๋ก์ธ์ ๋๋ OS๊ฐ ์๋ชป๋ ๋ช
๋ น์ ์คํํ๋ ค๊ณ ์๋ํ๊ณ ์์์ ์๋ฏธํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์ด๊ฒ์ ์ด๋ป๊ฒ ํด์ผํ ์ง ๋ชจ๋ฅด๊ฒ ์ผ๋ ๋น์ ์ ์์คํ
์ด๋ ๋น์ ์ libpng ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ง์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. libpng๋ฅผ ๋ค์ ์ค์น/์
๊ทธ๋ ์ด๋ํ ์ ์์ต๋๊น?
๊ทธ๋์ apt-get install์ ํตํด ์ค์นํ libpng ๋ฒ์ ์ ์ ๊ฑฐํ๊ณ ๋์ libpng ์ ์ฅ์๋ฅผ ์ง์ ๋ค์ด๋ก๋ํ์ฌ ์ค์นํ์ต๋๋ค.
๋ถํํ๋ ๋์ผํ ํจ๊ณผ๊ฐ ์์ต๋๋ค. ์ด์ฉ๋ฉด ์ ๋ง ๋ด ํ๋ก์ธ์์ ๋๊น? ํ์ฌ ์ต์ ๋ชจ๋ธ์ด ์๋ AMD Phenom II X4 965 ํ๋ก์ธ์๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ทธ๋๋ ์ด์ ์ ๋น์ทํ ๋ฌธ์ ๊ฐ ์์๋ ์ ์ ์์๋ ๊ฒ ๊ฐ์์.
์ด์จ๋ ๋ฌธ์ ๋ฅผ ์ฌํ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๋ฅผ ๋ซ์ ๊ฒ ๊ฐ์ต๋๋ค.
์ฌ์ ํ ์๋ํ์ง ์๋๋ค๋ ์์์ ๋ฃ๊ฒ ๋์ด ์ ๊ฐ์ ๋๋ค. ๋๋ ๊ทธ๊ฒ์ด ๋น์ ์ ํ๋์จ์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ์์ด๋์ด๊ฐ ์์ต๋๋ค. libpng์ ๋ํ ํน์ ๊ฐ์ ๊ธฐ๋ฅ์ ๋นํ์ฑํํ๋ ์ปดํ์ผ ํ์ ํ๋๊ทธ๊ฐ ์์ต๋๊น? ์ด ์์ ์์ ๋๋ ๋ฌธ์ ์ ์์ธ์ด ๋ฌด์์ธ์ง ์ ๋ง๋ก ์์ง ๋ชปํ ์ฑ ์ถ์ธกํ๊ณ ์์ต๋๋ค.
๋ง์ ์คํ ํ์ ์ด๋ฏธ์ง ํ์ผ์ ๊ฐ์ ธ์ฌ ๋ makecene์ด ์ถฉ๋ํ๋ ์ด์ ๋ฅผ ์๊ณ ์์ต๋๋ค. libjpeg๋ libpng ๋๋ฌธ์ด ์๋๋ผ, ์ค์ ์ด์ ๋ openMP ๋๋ฌธ์
๋๋ค. makecene.cc์์ ๋ค์ ์ฝ๋๋ก ์ด ๋ฒ๊ทธ๋ฅผ ๊ณ ์น ์ ์์ต๋๋ค.
845 ๋ผ์ธ
mve::ImageBase::Ptr ์ด๋ฏธ์ง;
for (std::size_t i = 0; i < dir.size(); ++i)
....
ํ์ค::๋ฌธ์์ด exif;
image = load_any_image(afname, &exif);
...
๊ทธ๋ฌ๋ ๊ทธ ๋ณํ๋ ๋ณ๋ก ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ชจ๋ ์ฐ๋ ๋์์ ๊ณต์ ๋๋ image
๋ณ์์ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ๊ณ ์๋๋ฐ, ์ง๊ธ์ ์ด๋ฏธ์ง ๋ก๋ฉ์ด ์ง๋ ฌํ ๋์์ง๋ง, ๊ฒฝ์ ์ํฉ์ผ๋ก ์ธํด ์ด๋ฏธ์ง๋ฅผ ๋ฎ์ด์ฐ๊ฒ ๋๊ณ ์ด๋ฏธ์ง ๋ก๋ฉ ํ ์๋ชป๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ..
์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๊ธฐ ์ ์ #pragma omp critical์ ๋ฃ์ด ๋ณด์ จ์ต๋๊น?
@timlgy , ๊ทํ์ ์์คํ ์ ๋ํด ์ข ๋ ์๋ ค์ฃผ์๊ฒ ์ต๋๊น? ์ด๋ค CPU, ์ด์ ์ฒด์ ๋ฐ ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
Ubuntu 14.04.5 LTS, 16U32G์์ ์๋ํ๊ณ ์ปดํ์ผ๋ฌ๋ gcc 4.8.4(Ubuntu 4.8.4-2ubuntu1~14.04.3) PS '์๋ชป๋ ๋ฐ์ดํฐ'๊ฐ ๋ฌด์์ธ๊ฐ์? prebundle.sfm?
์ด ๊ธฐ์ฌ์ ๋ฐ๋ฅด๋ฉด #pragma omp critical
omp critical ์ง์๋ฌธ์ ํ ๋ฒ์ ๋จ์ผ ์ค๋ ๋์์ ์คํํด์ผ ํ๋ ์ฝ๋ ์น์
์ ์๋ณํฉ๋๋ค.
๊ทธ๋์ mve::ImageBase::Ptr imagel=oad_any_image(afname, &exif);
์์ ์ด ์ฝ๋๋ฅผ ๋ฃ์ ๋ 'load_any_image'๊ฐ ์ํํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
load_any_image
๋ ์ ์ ํ๊ฒ ์ฌ์ฉ๋ ๋ ์ค๋ ๋๋ก๋ถํฐ ์์ ํ ๋ฐฑ๊ทธ๋ผ์ด๋์์ libpng
๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ ๊ฒ ํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. "์๋ชป๋ ๋ฐ์ดํฐ"๋ผ๋ ๋ง์ ์์ ์ฝ๋์์ ์ด๋ฏธ์ง๊ฐ ์ฌ์ฉ๋๊ธฐ ์ ์ ๋ค๋ฅธ ์ด๋ฏธ์ง๋ก ๋ฎ์ด์ธ ์ ์๊ณ ๋ฐ๋ผ์ ๋ณด๊ธฐ์ ์๋ชป๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๊ฐ ํ์๋ ์ ์์์ ์๋ฏธํฉ๋๋ค.
์ด์ ์ด ๋ฌธ์ ์ ๋ํ ๋๋์ ์ป์ผ๋ ค๋ฉด ์ด๋ฌํ ์ถฉ๋๋ก ์ธํด ์ค์ ๋ก ์ํฅ์ ๋ฐ๋ ์ฌ๋์ ๋๊ตฌ์ ๋๊น?
ํ๋์ ์ด๋ฏธ์ง(๋ชจ๋ ์ ํ์ jpg tif ๋๋ png)๋ง ๋ก๋ํ๋ฉด ๊ด์ฐฎ์ง๋ง ๋ ๊ฐ์ ์ด๋ฏธ์ง(๋ชจ๋ ์ ํ)๋ฅผ ๋ก๋ํ๋ฉด ๋์ ํ๋ฅ ๋ก ์ถฉ๋ํฉ๋๋ค.
๋ฌธ์ ์ ์์ธ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ด๋ฏธ์ง ๋ก๋๊ฐ ๋ณ๋ ฌ๋ก ๊ฐ๋ฅํด์ผ ํ๋ฉฐ ๋ฌธ์ ๋ฅผ ๋ณธ ์ ์ด ์์ต๋๋ค. ์ ๋ง ํฐ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๋ ๊ฒฝ์ฐ ์ด ์ถฉ๋์ด ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ์ ๊ด๋ จ์ด ์์ต๋๊น? 2GB RAM ์์คํ ์์ 32๊ฐ์ ์ด๋ฏธ์ง(์ฝ์ด๊ฐ ๋ง์ ๊ฒฝ์ฐ)๋ฅผ ๋ณ๋ ฌ๋ก ๋ก๋ํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ผ๊ณ ์์ํ ์ ์์ต๋๋ค.
๊ทธ๋์ load_any_image
#pragma omp critical
ํ์ ๋ฃ์ผ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
@timlgy , ์ถฉ๋์ ์ญ์ถ์ ์ ๊ฒ์ํ ์ ์์ต๋๊น?
๋ํ "16U32G"๋ ๋ฌด์์ ์๋ฏธํฉ๋๊น?
@andre-schulz 16U32G๋ CPU 16 ๋ค์ค ์ค๋ ๋ ๋ฐ 32GB ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค.
๋ช ๋ น์ ์ํ ์ต์ mve ๋น๋๋ฅผ ์ฌ์ฉํ์ฌ Windows 7 64x์์ ๋์ผํ ์ถฉ๋์ ๊ด์ฐฐํ์ต๋๋ค.
load_any_image ์์ #pragma omp critical ํ์ ๋ฃ์ผ๋ ค๊ณ ํ์ง๋ง ๋์์ด ๋์ง ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋น๋ํ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์์ต๋๊น? ์ฌ๊ธฐ์ OpenMP๋ฅผ ์ฌ์ฉํ๋ ๋ชฉ์ ์ ๋ฌด์์ ๋๊น?
ํ๋์ ์ด๋ฏธ์ง๋ง ๊ฐ์ ธ์ค๋ ค๊ณ ํ์ต๋๋ค. ๋์ผํ ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค.
์๋
ํ์ธ์ @stiv-yakovenko
์ ๋ณด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ png ํ์ผ์ ๊ฒ์ํ ์ ์์ต๋๊น?
๋ํ ์ด๋ค CPU๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๊น?
๋ฌธ์ ๋ makescene
๊ฐ ๋๋ฒ๊ทธ ๋ชจ๋์์ ์ปดํ์ผ๋์์ง๋ง ๋ฆด๋ฆฌ์ค ๋ชจ๋์์ libpng์ ์ฐ๊ฒฐ๋์๋ค๋ ๊ฒ์
๋๋ค. ๋ค๋ฅธ ๋ฐํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(/MD ๋ /MDd)์ ๋ํ ๋งํฌ ๋ฌธ์ ์ผ ์ ์์ต๋๋ค. ์ด๊ฒ์ ํ์ฌ ๋น๋ ์์คํ
์ด ์๋ํ๋ ๋ฐฉ์์ ๋ฌธ์ ์
๋๋ค. ๋๋ ์ด๊ฒ์ ๋ ์กฐ์ฌํด์ผ ํ๋ค.
makescene
๊ฐ RelWithDebInfo ๋ชจ๋์์ ์๋ํ๋์ง ํ์ธํ ์ ์์ต๋๊น?
๋๋ฒ๊ทธ ๋ชจ๋์์ makescene
๋ฅผ ์คํํด์ผ ํ๋ ๊ฒฝ์ฐ ํ์ฌ CMakeLists.txt
์ Debug
์ CMAKE_CONFIGURATION_TYPES
๋ฅผ ์ถ๊ฐํ์ฌ ๋๋ฒ๊ทธ ๋ชจ๋์์ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ปดํ์ผํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ฒ๊ทธ ๋ฒ์ ์ ๋ค์ ์ปดํ์ผํ๊ณ makescene
์ ๋๋ฒ๊ทธ ๋ฒ์ ์์น์ ์ง์ ๋ณต์ฌํฉ๋๋ค. ์ด๋ป๊ฒ๋ ์ด๊ฒ์ ์์ /์๋ํํ ์ ์๋์ง ์์๋ด๋ ค๊ณ ๋
ธ๋ ฅํ ๊ฒ์
๋๋ค.
ReleaseWithDeb ๋ฒ์ ์ด ์๋ํ๋์ง ํ์ธํฉ๋๋ค.
@andre-schulz ์๋ ํ์ธ์, ๋๋ฒ๊ทธ ๋ชจ๋์ ๋ํ ๋ถ์์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋๋ฒ๊ทธ ๋ชจ๋์์ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ ์ปดํ์ผํ๊ณ makecene์ ๋๋ฒ๊ทธ ๋ฒ์ ์ tiffd.dll, zlibd.dll์ ์ถ๊ฐํ์ต๋๋ค. ํ๋ก๊ทธ๋จ์ด ์ฌ์ ํ ์ถฉ๋ํ์ต๋๋ค.
png_read_image(png, &row_pointers[0]);
@andre-schulz ์ด์ ๊ด์ฐฎ์! ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ CMakeLists.txt์์ CMAKE_CONFIGURATION_TYPES๋ฅผ ์์ ํ๊ณ MVE.sln์ ์ ๋ ฅ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌ์ฑ์ ์์ ํ ํ ๋๋ฒ๊ทธ๋ฅผ ์์ ํ ์ปดํ์ผํ ํ jpg ๋ก๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.