llmemoryview.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:8k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llmemoryview.cpp
  3.  * @brief LLMemoryView class implementation
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #include "llviewerprecompiledheaders.h"
  33. #include "llmemoryview.h"
  34. #include "llappviewer.h"
  35. #include "llallocator_heap_profile.h"
  36. #include "llgl.h" // LLGLSUIDefault
  37. #include "llviewerwindow.h"
  38. #include "llviewercontrol.h"
  39. #include <sstream>
  40. #include <boost/algorithm/string/split.hpp>
  41. LLMemoryView::LLMemoryView(const LLMemoryView::Params& p)
  42. : LLView(p),
  43. //mDelay(120),
  44.     mAlloc(NULL)
  45. {
  46. }
  47. LLMemoryView::~LLMemoryView()
  48. {
  49. }
  50. BOOL LLMemoryView::handleMouseDown(S32 x, S32 y, MASK mask)
  51. {
  52. if (mask & MASK_SHIFT)
  53. {
  54. }
  55. else if (mask & MASK_CONTROL)
  56. {
  57. }
  58. else
  59. {
  60. }
  61. return TRUE;
  62. }
  63. BOOL LLMemoryView::handleMouseUp(S32 x, S32 y, MASK mask)
  64. {
  65. return TRUE;
  66. }
  67. BOOL LLMemoryView::handleHover(S32 x, S32 y, MASK mask)
  68. {
  69. return FALSE;
  70. }
  71. void LLMemoryView::refreshProfile()
  72. {
  73. /*
  74.     LLAllocator & alloc = LLAppViewer::instance()->getAllocator();
  75.     if(alloc.isProfiling()) {
  76.         std::string profile_text = alloc.getRawProfile();
  77.         boost::algorithm::split(mLines, profile_text, boost::bind(std::equal_to<llwchar>(), 'n', _1));
  78.     } else {
  79.         mLines.clear();
  80.     }
  81. */
  82.     if (mAlloc == NULL) {
  83.         mAlloc = &LLAppViewer::instance()->getAllocator();
  84.     }
  85. mLines.clear();
  86.   if(mAlloc->isProfiling()) 
  87. {
  88. const LLAllocatorHeapProfile &prof = mAlloc->getProfile();
  89. for(size_t i = 0; i < prof.mLines.size(); ++i)
  90. {
  91. std::stringstream ss;
  92. ss << "Unfreed Mem: " << (prof.mLines[i].mLiveSize >> 20) << " M     Trace: ";
  93. for(size_t k = 0; k < prof.mLines[i].mTrace.size(); ++k)
  94. {
  95. ss << LLMemType::getNameFromID(prof.mLines[i].mTrace[k]) << "  ";
  96. }
  97. mLines.push_back(utf8string_to_wstring(ss.str()));
  98. }
  99. }
  100. }
  101. void LLMemoryView::draw()
  102. {
  103. const S32 UPDATE_INTERVAL = 60;
  104. const S32 MARGIN_AMT = 10; 
  105. static S32 curUpdate = UPDATE_INTERVAL;
  106.     static LLUIColor s_console_color = LLUIColorTable::instance().getColor("ConsoleBackground", LLColor4U::black);
  107. // setup update interval
  108. if (curUpdate >= UPDATE_INTERVAL)
  109. {
  110. refreshProfile();
  111. curUpdate = 0;
  112. }
  113. curUpdate++;
  114. // setup window properly
  115. S32 height = (S32) (gViewerWindow->getWindowRectScaled().getHeight()*0.75f);
  116. S32 width = (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.9f);
  117. setRect(LLRect().setLeftTopAndSize(getRect().mLeft, getRect().mTop, width, height));
  118. // setup window color
  119. F32 console_opacity = llclamp(gSavedSettings.getF32("ConsoleBackgroundOpacity"), 0.f, 1.f);
  120. LLColor4 color = s_console_color;
  121. color.mV[VALPHA] *= console_opacity;
  122. LLGLSUIDefault gls_ui;
  123. gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
  124. gl_rect_2d(0, height, width, 0, color);
  125.     LLFontGL * font = LLFontGL::getFontSansSerifSmall(); 
  126. // draw remaining lines
  127. F32 y_pos = 0.f;
  128.     F32 y_off = 0.f;
  129. F32 line_height = font->getLineHeight();
  130.     S32 target_width = width - 2 * MARGIN_AMT;
  131. // cut off lines on bottom
  132. U32 max_lines = U32((height - 2 * line_height) / line_height);
  133.     std::vector<LLWString>::const_iterator end = mLines.end();
  134.     if(mLines.size() > max_lines) {
  135.         end = mLines.begin() + max_lines;
  136.     }
  137. y_pos = height - MARGIN_AMT - line_height;
  138.     y_off = 0.f;
  139.     for (std::vector<LLWString>::const_iterator i = mLines.begin(); i != end; ++i)
  140. {
  141. font->render(*i, 0, MARGIN_AMT, y_pos -  y_off,
  142.             LLColor4::white,
  143. LLFontGL::LEFT, 
  144. LLFontGL::BASELINE,
  145.             LLFontGL::NORMAL,
  146. LLFontGL::DROP_SHADOW,
  147. S32_MAX,
  148. target_width
  149. );
  150. y_off += line_height;
  151. }
  152. #if MEM_TRACK_TYPE
  153. S32 left, top, right, bottom;
  154. S32 x, y;
  155. S32 margin = 10;
  156. S32 texth = (S32)LLFontGL::getFontMonospace()->getLineHeight();
  157. S32 xleft = margin;
  158. S32 ytop = height - margin;
  159. S32 labelwidth = 0;
  160. S32 maxmaxbytes = 1;
  161. // Make sure all timers are accounted for
  162. // Set 'MT_OTHER' to unaccounted ticks last frame
  163. {
  164. S32 display_memtypes[LLMemType::MTYPE_NUM_TYPES];
  165. for (S32 i=0; i < LLMemType::MTYPE_NUM_TYPES; i++)
  166. {
  167. display_memtypes[i] = 0;
  168. }
  169. for (S32 i=0; i < MTV_DISPLAY_NUM; i++)
  170. {
  171. S32 tidx = mtv_display_table[i].memtype;
  172. display_memtypes[tidx]++;
  173. }
  174. LLMemType::sMemCount[LLMemType::MTYPE_OTHER] = 0;
  175. LLMemType::sMaxMemCount[LLMemType::MTYPE_OTHER] = 0;
  176. for (S32 tidx = 0; tidx < LLMemType::MTYPE_NUM_TYPES; tidx++)
  177. {
  178. if (display_memtypes[tidx] == 0)
  179. {
  180. LLMemType::sMemCount[LLMemType::MTYPE_OTHER] += LLMemType::sMemCount[tidx];
  181. LLMemType::sMaxMemCount[LLMemType::MTYPE_OTHER] += LLMemType::sMaxMemCount[tidx];
  182. }
  183. }
  184. }
  185. // Labels
  186. {
  187. y = ytop;
  188. S32 peak = 0;
  189. for (S32 i=0; i<MTV_DISPLAY_NUM; i++)
  190. {
  191. x = xleft;
  192. int tidx = mtv_display_table[i].memtype;
  193. S32 bytes = LLMemType::sMemCount[tidx];
  194. S32 maxbytes = LLMemType::sMaxMemCount[tidx];
  195. maxmaxbytes = llmax(maxbytes, maxmaxbytes);
  196. peak += maxbytes;
  197. S32 mbytes = bytes >> 20;
  198. tdesc = llformat("%s [%4d MB] in %06d NEWS",mtv_display_table[i].desc,mbytes, LLMemType::sNewCount[tidx]);
  199. LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
  200. y -= (texth + 2);
  201. S32 textw = LLFontGL::getFontMonospace()->getWidth(tdesc);
  202. if (textw > labelwidth)
  203. labelwidth = textw;
  204. }
  205. S32 num_avatars = 0;
  206. S32 num_motions = 0;
  207. S32 num_loading_motions = 0;
  208. S32 num_loaded_motions = 0;
  209. S32 num_active_motions = 0;
  210. S32 num_deprecated_motions = 0;
  211. for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
  212.  iter != LLCharacter::sInstances.end(); ++iter)
  213. {
  214. num_avatars++;
  215. (*iter)->getMotionController().incMotionCounts(num_motions, num_loading_motions, num_loaded_motions, num_active_motions, num_deprecated_motions);
  216. }
  217. x = xleft;
  218. tdesc = llformat("Total Bytes: %d MB Overhead: %d KB Avs %d Motions:%d Loading:%d Loaded:%d Active:%d Dep:%d",
  219.  LLMemType::sTotalMem >> 20, LLMemType::sOverheadMem >> 10,
  220.  num_avatars, num_motions, num_loading_motions, num_loaded_motions, num_active_motions, num_deprecated_motions);
  221. LLFontGL::getFontMonospace()->renderUTF8(tdesc, 0, x, y, LLColor4::white, LLFontGL::LEFT, LLFontGL::TOP);
  222. }
  223. // Bars
  224. y = ytop;
  225. labelwidth += 8;
  226. S32 barw = width - labelwidth - xleft - margin;
  227. for (S32 i=0; i<MTV_DISPLAY_NUM; i++)
  228. {
  229. x = xleft + labelwidth;
  230. int tidx = mtv_display_table[i].memtype;
  231. S32 bytes = LLMemType::sMemCount[tidx];
  232. F32 frac = (F32)bytes / (F32)maxmaxbytes;
  233. S32 w = (S32)(frac * (F32)barw);
  234. left = x; right = x + w;
  235. top = y; bottom = y - texth;
  236. gl_rect_2d(left, top, right, bottom, *mtv_display_table[i].color);
  237. S32 maxbytes = LLMemType::sMaxMemCount[tidx];
  238. F32 frac2 = (F32)maxbytes / (F32)maxmaxbytes;
  239. S32 w2 = (S32)(frac2 * (F32)barw);
  240. left = x + w + 1; right = x + w2;
  241. top = y; bottom = y - texth;
  242. LLColor4 tcolor = *mtv_display_table[i].color;
  243. tcolor.setAlpha(.5f);
  244. gl_rect_2d(left, top, right, bottom, tcolor);
  245. y -= (texth + 2);
  246. }
  247. dumpData();
  248. #endif
  249. LLView::draw();
  250. }