まず前回のメモリリークの原因から。
--- cross.c- 2018-06-08 23:53:48.000000000 +0900 +++ cross.c 2018-06-08 23:54:19.000000000 +0900 @@ -456,6 +456,7 @@ n = cross_cross_one( d->kind, &d->l2g, prev_idx == j, l_g, &ret_ ); if( n == 0 && ( is_pl || !d->not ) ){ + my_area_free(&area, NULL); return 0; } ret_.idx = j;
ここでした。 見事にfree抜けてました。
v47で、この修正だけ入れてみて無事20秒の動画を生成できました。
$ ./skill.sh $ make $ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=and.yaml data_name=all name=out_v47/and : wh : 293787/307200(95.6%) : total 9.49s : rest 0.41s : 2018/06/08 11:31:06 wh : 307200/307200(100.0%) : fin 9.10s frm : 600/600(100.0%) : fin 1h 51m 59.51s $ ls -lt out_v47/ | head -rw-r--r-- 1 kondoh staff 1416918 6 8 11:33 and_2.mp4 -rw-r--r-- 1 kondoh staff 3139752 6 8 11:33 and_1.mp4 -rw-r--r-- 1 kondoh staff 4862955 6 8 11:31 and.mp4 :
では本題。
v47のコードを整理しつつ、 物体のAND演算の箇所でOR演算でもXOR演算でも指定できるように作り変えてみました。
物体といっても対応してるのは未だ「球」と「立方体」だけです。
物体のOR演算は、素の状態で普通にORになってるはずです。 ですが、あえてOR演算として指定すると、OR演算した結果のNOTが取れたりできるので、 複雑な演算の指定をするときは便利かと。
(OR結果のNOTなら、ドモルガンの定理で展開して 個別にNOTしてANDすれば良いのでは? などと突っ込んではいけません)
視線で串刺しにして領域の演算をするときに使う area.[ch]は、 できるだけシンプルにまとめなおしてみました。
それを使う側の cross.c 。 「とっちらかり」を押さえ込んでシンプルに。 まとめなおしてふと気づくと、 先のv47のメモリリークの対応箇所は、原因の箇所自体が消えてしまいました。
サンプルデータは op.yaml を追加してます。
前回同様ワイヤーフレーム側の処理は、物体の演算には対応してません。 というか、しません。
$ mv rt_v47 rt_v48 $ cat v48.patch | ( cd rt_v48 ; patch -p1 ) $ cd rt_v48 $ make clean $ make
では、いつもの速度確認。
$ ./cg.py eyep=[0,0,0],200,10 sec=10 data_name=objs name=out_v48/objs_1_2_sc n=1 init_sec=5 div=2 : wh : 76800/76800(100.0%) : fin 3.11s
以前の v47 wh : 76800/76800(100.0%) : fin 3.04s v45 wh : 76800/76800(100.0%) : fin 3.00s v43 wh : 76800/76800(100.0%) : fin 2.96s v42 wh : 76800/76800(100.0%) : fin 3.16s v39 wh : 76800/76800(100.0%) : fin 15.37s v38 wh : 76800/76800(100.0%) : fin 15.09s v37 wh : 76800/76800(100.0%) : fin 15.49s v36 wh : 76800/76800(100.0%) : fin 15.13s v35 wh : 76800/76800(100.0%) : fin 16.16s v34 wh : 76800/76800(100.0%) : fin 38.47s v32 wh : 76800/76800(100.0%) : fin 26.84s v31 wh : 76800/76800(100.0%) : fin 40.50s v30 wh : 76800/76800(100.0%) : fin 38.39s v29 wh : 76800/76800(100.0%) : fin 1m 44.72s v28 wh : 76800/76800(100.0%) : fin 1m 18.06s v27 wh : 76800/76800(100.0%) : fin 1m 8.39s v26 wh : 76800/76800(100.0%) : fin 1m 6.02sそれでは op.yaml で試してみます。
$ cat op.yaml defs: rtd_A: { base: 0.1, diff: 0, reflect: 0.5, reflact: 0.5, density: 2 } mov4: IMG_3999_4.mov big_ball: - kind: ball rtd: { diff: 0.3 } maps: - fn: '*mov4' fn_r: '*mov4' t2m: [ ax.zoom_all(2), ax.rot_x(90) ] - fn: '*mov4' fn_r: '*mov4' t2m: [ ax.zoom_all(2), ax.rot_x(90), ax.rot_z(180) ] m2g: [ ax.zoom_all(1000) ] all: - kind: export export: big_ball - kind: or args: - kind: ball rtd: '*rtd_A' - kind: cube rtd: '*rtd_A' m2g: [ 'ax.zoom_all(0.8)' ] m2g: [ 'ax.slide([-1,-1,0])', 'ax.zoom_all(20)' ] - kind: and args: - kind: cube rtd: '*rtd_A' m2g: [ 'ax.zoom_all(0.8)' ] - kind: ball not: True rtd: '*rtd_A' m2g: [ 'ax.slide([1,-1,0])', 'ax.zoom_all(20)' ] - kind: and args: - kind: ball rtd: '*rtd_A' - kind: cube not: True rtd: '*rtd_A' m2g: [ 'ax.zoom_all(0.8)' ] m2g: [ 'ax.slide([-1,1,0])', 'ax.zoom_all(20)' ] - kind: and args: - kind: ball rtd: '*rtd_A' - kind: cube rtd: '*rtd_A' m2g: [ 'ax.zoom_all(0.8)' ] m2g: [ 'ax.slide([1,1,0])', 'ax.zoom_all(20)' ] # EOF
になってます。
$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=op.yaml data_name=all name=out_v48/op_tst div=4 fps=15 : wh : 19200/19200(100.0%) : fin 0.83s frm : 300/300(100.0%) : fin 6m 57.12s estimated 3.71 hour at 640*480 30fps
$ ./cg.py eyep=[0,0,0],[300,300,100],10 sec=20 yaml=op.yaml data_name=all name=out_v48/op : wh : 260050/307200(84.7%) : total 20.16s : rest 3.09s : 2018/06/09 04:46:31 wh : 307200/307200(100.0%) : fin 17.19s frm : 600/600(100.0%) : fin 4h 10m 41.01s $ ls -lt out_v48/ | head -rw-r--r-- 1 kondoh staff 3098316 6 9 04:48 op_2.mp4 -rw-r--r-- 1 kondoh staff 3142561 6 9 04:48 op_1.mp4 -rw-r--r-- 1 kondoh staff 6684097 6 9 04:46 op.mp4 :