From e26888572ff1e298de8caa3b155b1fd214571143 Mon Sep 17 00:00:00 2001 From: Taylor Howell Date: Tue, 12 May 2026 15:11:47 +0100 Subject: [PATCH] benchmark render flex --- benchmarks/cloth/README.md | 16 ++++++++++++++++ benchmarks/cloth/__init__.py | 13 ++++++++++++- benchmarks/cloth/mannequin.xml | 4 +--- benchmarks/cloth/rollout_cloth_render.webp | Bin 0 -> 21066 bytes 4 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 benchmarks/cloth/rollout_cloth_render.webp diff --git a/benchmarks/cloth/README.md b/benchmarks/cloth/README.md index a150f4b9b..5444a8bd7 100644 --- a/benchmarks/cloth/README.md +++ b/benchmarks/cloth/README.md @@ -20,3 +20,19 @@ A soft-body simulation benchmark featuring a cloth draped over the MuJoCo humano ![cloth](rollout.webp) +### cloth_render + +This benchmark measures rendering performance of deformable meshes and soft-body grids on the GPU. + +| Property | Value | +|----------|-------| +| Bodies | 918 | +| DoFs | 2706 | +| Actuators | 0 | +| Geoms | 21 | +| Cameras | 1 | +| Resolution | 64×64 | +| Worlds | 2048 | + +![cloth_render](rollout_cloth_render.webp) + diff --git a/benchmarks/cloth/__init__.py b/benchmarks/cloth/__init__.py index 3c4f475d5..a0cbfe114 100644 --- a/benchmarks/cloth/__init__.py +++ b/benchmarks/cloth/__init__.py @@ -5,5 +5,16 @@ "nworld": 32, "nconmax": 4000, "njmax": 32000, - } + }, + { + "name": "cloth_render", + "mjcf": "scene.xml", + "function": "render", + "nworld": 32, + "nconmax": 4000, + "njmax": 32000, + "nstep": 200, + "render_width": 64, + "render_height": 64, + }, ] diff --git a/benchmarks/cloth/mannequin.xml b/benchmarks/cloth/mannequin.xml index 9237b9430..ac8c338cd 100644 --- a/benchmarks/cloth/mannequin.xml +++ b/benchmarks/cloth/mannequin.xml @@ -107,14 +107,12 @@ - - + - diff --git a/benchmarks/cloth/rollout_cloth_render.webp b/benchmarks/cloth/rollout_cloth_render.webp new file mode 100644 index 0000000000000000000000000000000000000000..3c70fa72e20eb56ef04a2c39065885cf839f9f06 GIT binary patch literal 21066 zcmZ^~1yodR*9JV4C=ycAT>{c6H3-tuA|Tx$NJ&TzDk3QY(k{ttPC41piWi{1(p&9 zDT4^8#}HjzaxTQ@upoHO`A{C$14KF^ar{A51nZ621#~KP3Y>q_Vc#j_D*&hi8IAoe zptm3&kUispAH?}|p`UPIF%29Hupw417bGk-@iQ9dHim4r(cp`>DrZeD19p!g0-yyD zTvG0>!TVCZMK;345H0PlSn1`EdAOkv1CaK#%pNnf(5p6oZjiu~t|^F5b+I7f#3@ba#P zueY#F_~b`u!1c$1y%^onwoyoU==IZ*nwQ#g47dhuEu28 z6iV@+h4fIFj(!U)7H*1>u|+vw_r*}6hi;s|tQ5R0!AWX9_mVR-${cRS3reEJgRdI90QB&ieL($zrOGUy!2B-UM>UZSbIt9BO@D zpcD*_)Xm?2De^YCywR#uH-a5uD!^RNd{>?;#V>c84rN*I7N2^^u(x!zO7nxaRLA6p zQogV|HSgX}dk?RrpW7bi_~oN?pi#H)7{D_p9`FmTOsVX!r~h zF8W7bgzQVrLf#dA$oYNvRM4i;nvUITrzm%~&j{Y)USg)HXWNqKVa(unS5=orsSLfW z5AJ-0lO^#3Z!bcKMzk2h5VWlV1o!q9W=uxn)SvZTiQhEJdT$r)u2))6Vit1)Y@l8P zR)au^$&5O*9cCHYl8d|Ua&*3)z@h}yPwMjQL-&&9 zES5~~kG^hrQ9jHfR&v!jYb6I_MKn=OUt=vb9CwdjctTL7$Cd5&r!GBj1V8f3pQY z=pINSULrvr4aKhogu)%e{a_eHlsC*rI#)Rgt$J@(w*`bauT35O_{RR4y%gewZh=bu zoM`KiVK~Jm{SMdS%!p;;p<~?A)OWVdXO= zG0H`>*K;Kc{vnI6>h~uj0+fGcgyg*cWOR$nX#C#aj4+V=CzYV^$!`LLA{=A(4mD}0 z5Pcp;T0R0i`p^+?0}?^lsr$i$E_EAI^%_s+fbkk~b5eukqdhht9R>itHW?>dR))qe zU+ZlFh?!;EkPMVT%guP0aa!7A76mzA40Z?6h~u4k!*gC%GnbkB>BeI{zj4r)FzLAl z0*zx*&_EXYOm$n>fxhCF^=-b)ohZ4OjaM6~l_-J3dKb)V6N(^p3b{KLz_~~dOpOZy z;VfO04R^b&N(Ddk_O1?hO^9I772 zkg-9R2b`vUC;n$;W|8mzbFY!2@t>7xL&k|P{;murNFqWaULFmS?*~GmjZu4uw}eoE zs4qPN1(1FCPF((tcq_XZ?IH4iB5wCe2yTCy}g-r~b=Rgin^l=K3OS zVvnb?Sk&}yhUfpz5c9to&LiV4|73XoxAw)$fBu7J;TYOp$;ZotmQsQ$s@(S{n2r-5 zs793lv9pT-AS`UgWD^KkK~?Ilwh`*ST&)}&`GOp92M~PEQ|!R3eMT* z{`_Y7CaAxEpO`N6-<_NMx0~s z{><_D1)zDAPAZZ}^ybU*mvM=!%(r3*NusywF5lkSMhsHb&Gx%~tR|p9P5F2~aV~)& zk*R2$tBuscLzLo}XmjBC>?HmvhSZa$esPKzW!bBZYon%PBE#UHJw0@<9tPy6IxGD= zxr&FGQ(rlK@C_mKN#P&^*67Laa1@zqzhi%oVpoNJ`t-7%2UFWOl%5w$PtwVXYwCvU zw$sdeh1-_DNCETY=WZgFj+rV^%DBIX!CQ^|nO_2(b2LN!a;oiL&d}+J?mdl%ZijMR zDHz-zH)s85%=khR9h#;bZvVWdpT(B%yK6NMwOrSz_O`rOwbdq9{CR<7?{}S@sC~Il zk2({owHsr|mJp`Ax%_La&bbnoNFR`j^Z{zX!{qG+L^GMt}Nk%>0Bs@jzkI_2Kq!~4EUT|>{x})4zfAQ*Bov5^cMtnnl<*1%GFbj5< zN-G={?7He}fe@&yWbI6s_;ht~Wi@@tPz1$+hN9)sue$2%>wmoUb4;xntaRSe)N(>! z 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