From 6928e09f362aa4ba1d335e6f060dda72b1476941 Mon Sep 17 00:00:00 2001 From: Alessio Quaglino Date: Mon, 29 Jul 2024 09:31:54 -0700 Subject: [PATCH] Small performance improvement: Parse body once during replicate. PiperOrigin-RevId: 657227162 Change-Id: I5b60c25ab4634a44ed0474fdbf22e676bcb8f6d7 --- src/xml/xml_native_reader.cc | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/xml/xml_native_reader.cc b/src/xml/xml_native_reader.cc index 2dc7138b..4e16d79b 100644 --- a/src/xml/xml_native_reader.cc +++ b/src/xml/xml_native_reader.cc @@ -3497,12 +3497,16 @@ void mjXReader::Body(XMLElement* section, mjsBody* pbody, mjsFrame* frame, double pos[3] = {0, 0, 0}; double quat[4] = {1, 0, 0, 0}; - for (int i = 0; i < count; i++) { - // create parent frame - mjsFrame* pframe = mjs_addFrame(subtree, frame); - mjs_setString(pframe->info, ("line = " + std::to_string(elem->GetLineNum())).c_str()); - mjs_setDefault(pframe->element, childdef ? childdef : def); + // parent frame that will be used to attach the subtree + mjsFrame* pframe = mjs_addFrame(subtree, frame); + mjs_setDefault(pframe->element, childdef ? childdef : def); + mjs_setString(pframe->info, ("line = " + std::to_string(elem->GetLineNum())).c_str()); + // parse subtree + Body(elem, subtree, pframe, vfs); + + // update pframe and attach + for (int i = 0; i < count; i++) { // accumulate rotation mjuu_setvec(pframe->pos, pos[0], pos[1], pos[2]); mjuu_frameaccum(pos, quat, offset, rotation); @@ -3518,9 +3522,6 @@ void mjXReader::Body(XMLElement* section, mjsBody* pbody, mjsFrame* frame, std::string suffix = separator; UpdateString(suffix, count, i); - // process subtree - Body(elem, subtree, pframe, vfs); - // attach to parent if (mjs_attachFrame(pbody, pframe, /*prefix=*/"", suffix.c_str()) != 0) { throw mjXError(elem, mjs_getError(spec));