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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lltextureinfo.cpp
  3.  * @brief Object which handles local texture info
  4.  *
  5.  * $LicenseInfo:firstyear=2000&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2000-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 "lltextureinfo.h"
  34. #include "lltexturestats.h"
  35. #include "llviewercontrol.h"
  36. LLTextureInfo::LLTextureInfo() : 
  37. mLogTextureDownloadsToViewerLog(false),
  38. mLogTextureDownloadsToSimulator(false),
  39. mTotalBytes(0),
  40. mTotalMilliseconds(0),
  41. mTextureDownloadsStarted(0),
  42. mTextureDownloadsCompleted(0),
  43. mTextureDownloadProtocol("NONE"),
  44. mTextureLogThreshold(100 * 1024),
  45. mCurrentStatsBundleStartTime(0)
  46. {
  47. mTextures.clear();
  48. }
  49. void LLTextureInfo::setUpLogging(bool writeToViewerLog, bool sendToSim, U32 textureLogThreshold)
  50. {
  51. mLogTextureDownloadsToViewerLog = writeToViewerLog;
  52. mLogTextureDownloadsToSimulator = sendToSim;
  53. mTextureLogThreshold = textureLogThreshold;
  54. }
  55. LLTextureInfo::~LLTextureInfo()
  56. {
  57. std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator;
  58. for (iterator = mTextures.begin(); iterator != mTextures.end(); iterator++)
  59. {
  60. LLTextureInfoDetails *info = (*iterator).second;
  61. delete info;
  62. }
  63. mTextures.clear();
  64. }
  65. void LLTextureInfo::addRequest(const LLUUID& id)
  66. {
  67. LLTextureInfoDetails *info = new LLTextureInfoDetails();
  68. mTextures[id] = info;
  69. }
  70. U32 LLTextureInfo::getTextureInfoMapSize()
  71. {
  72. return mTextures.size();
  73. }
  74. bool LLTextureInfo::has(const LLUUID& id)
  75. {
  76. std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id);
  77. if (iterator == mTextures.end())
  78. {
  79. return false;
  80. }
  81. else
  82. {
  83. return true;
  84. }
  85. }
  86. void LLTextureInfo::setRequestStartTime(const LLUUID& id, U64 startTime)
  87. {
  88. if (!has(id))
  89. {
  90. addRequest(id);
  91. }
  92. mTextures[id]->mStartTime = startTime;
  93. mTextureDownloadsStarted++;
  94. }
  95. void LLTextureInfo::setRequestSize(const LLUUID& id, U32 size)
  96. {
  97. if (!has(id))
  98. {
  99. addRequest(id);
  100. }
  101. mTextures[id]->mSize = size;
  102. }
  103. void LLTextureInfo::setRequestOffset(const LLUUID& id, U32 offset)
  104. {
  105. if (!has(id))
  106. {
  107. addRequest(id);
  108. }
  109. mTextures[id]->mOffset = offset;
  110. }
  111. void LLTextureInfo::setRequestType(const LLUUID& id, LLTextureInfoDetails::LLRequestType type)
  112. {
  113. if (!has(id))
  114. {
  115. addRequest(id);
  116. }
  117. mTextures[id]->mType = type;
  118. }
  119. void LLTextureInfo::setRequestCompleteTimeAndLog(const LLUUID& id, U64 completeTime)
  120. {
  121. if (!has(id))
  122. {
  123. addRequest(id);
  124. }
  125. mTextures[id]->mCompleteTime = completeTime;
  126. std::string protocol = "NONE";
  127. switch(mTextures[id]->mType)
  128. {
  129. case LLTextureInfoDetails::REQUEST_TYPE_HTTP:
  130. protocol = "HTTP";
  131. break;
  132. case LLTextureInfoDetails::REQUEST_TYPE_UDP:
  133. protocol = "UDP";
  134. break;
  135. case LLTextureInfoDetails::REQUEST_TYPE_NONE:
  136. default:
  137. break;
  138. }
  139. if (mLogTextureDownloadsToViewerLog)
  140. {
  141. llinfos << "texture=" << id 
  142. << " start=" << mTextures[id]->mStartTime 
  143. << " end=" << mTextures[id]->mCompleteTime
  144. << " size=" << mTextures[id]->mSize
  145. << " offset=" << mTextures[id]->mOffset
  146. << " length_in_ms=" << (mTextures[id]->mCompleteTime - mTextures[id]->mStartTime) / 1000
  147. << " protocol=" << protocol
  148. << llendl;
  149. }
  150. if(mLogTextureDownloadsToSimulator)
  151. {
  152. S32 texture_stats_upload_threshold = mTextureLogThreshold;
  153. mTotalBytes += mTextures[id]->mSize;
  154. mTotalMilliseconds += mTextures[id]->mCompleteTime - mTextures[id]->mStartTime;
  155. mTextureDownloadsCompleted++;
  156. mTextureDownloadProtocol = protocol;
  157. if (mTotalBytes >= texture_stats_upload_threshold)
  158. {
  159. LLSD texture_data;
  160. std::stringstream startTime;
  161. startTime << mCurrentStatsBundleStartTime;
  162. texture_data["start_time"] = startTime.str();
  163. std::stringstream endTime;
  164. endTime << completeTime;
  165. texture_data["end_time"] = endTime.str();
  166. texture_data["averages"] = getAverages();
  167. send_texture_stats_to_sim(texture_data);
  168. resetTextureStatistics();
  169. }
  170. }
  171. mTextures.erase(id);
  172. }
  173. LLSD LLTextureInfo::getAverages()
  174. {
  175. LLSD averagedTextureData;
  176. S32 averageDownloadRate;
  177. if(mTotalMilliseconds == 0)
  178. {
  179. averageDownloadRate = 0;
  180. }
  181. else
  182. {
  183. averageDownloadRate = (mTotalBytes * 8) / mTotalMilliseconds;
  184. }
  185. averagedTextureData["bits_per_second"] = averageDownloadRate;
  186. averagedTextureData["bytes_downloaded"] = mTotalBytes;
  187. averagedTextureData["texture_downloads_started"] = mTextureDownloadsStarted;
  188. averagedTextureData["texture_downloads_completed"] = mTextureDownloadsCompleted;
  189. averagedTextureData["transport"] = mTextureDownloadProtocol;
  190. return averagedTextureData;
  191. }
  192. void LLTextureInfo::resetTextureStatistics()
  193. {
  194. mTotalMilliseconds = 0;
  195. mTotalBytes = 0;
  196. mTextureDownloadsStarted = 0;
  197. mTextureDownloadsCompleted = 0;
  198. mTextureDownloadProtocol = "NONE";
  199. mCurrentStatsBundleStartTime = LLTimer::getTotalTime();
  200. }
  201. U32 LLTextureInfo::getRequestStartTime(const LLUUID& id)
  202. {
  203. if (!has(id))
  204. {
  205. return 0;
  206. }
  207. else
  208. {
  209. std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id);
  210. return (*iterator).second->mStartTime;
  211. }
  212. }
  213. U32 LLTextureInfo::getRequestSize(const LLUUID& id)
  214. {
  215. if (!has(id))
  216. {
  217. return 0;
  218. }
  219. else
  220. {
  221. std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id);
  222. return (*iterator).second->mSize;
  223. }
  224. }
  225. U32 LLTextureInfo::getRequestOffset(const LLUUID& id)
  226. {
  227. if (!has(id))
  228. {
  229. return 0;
  230. }
  231. else
  232. {
  233. std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id);
  234. return (*iterator).second->mOffset;
  235. }
  236. }
  237. LLTextureInfoDetails::LLRequestType LLTextureInfo::getRequestType(const LLUUID& id)
  238. {
  239. if (!has(id))
  240. {
  241. return LLTextureInfoDetails::REQUEST_TYPE_NONE;
  242. }
  243. else
  244. {
  245. std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id);
  246. return (*iterator).second->mType;
  247. }
  248. }
  249. U32 LLTextureInfo::getRequestCompleteTime(const LLUUID& id)
  250. {
  251. if (!has(id))
  252. {
  253. return 0;
  254. }
  255. else
  256. {
  257. std::map<LLUUID, LLTextureInfoDetails *>::iterator iterator = mTextures.find(id);
  258. return (*iterator).second->mCompleteTime;
  259. }
  260. }