<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>内存 归档 - 初晴神社</title>
	<atom:link href="https://vki.cc/tag/%e5%86%85%e5%ad%98/feed/" rel="self" type="application/rss+xml" />
	<link>https://vki.cc/tag/内存/</link>
	<description>白露的博客</description>
	<lastBuildDate>Fri, 02 Apr 2021 06:36:21 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>

<image>
	<url>https://cdn.vki.cc/wp-content/uploads/2018/03/cropped-icemaplen-1-32x32.png</url>
	<title>内存 归档 - 初晴神社</title>
	<link>https://vki.cc/tag/内存/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Unity 内存管理</title>
		<link>https://vki.cc/greattruth/engine/731/</link>
					<comments>https://vki.cc/greattruth/engine/731/#respond</comments>
		
		<dc:creator><![CDATA[白露]]></dc:creator>
		<pubDate>Wed, 22 Jul 2020 12:10:38 +0000</pubDate>
				<category><![CDATA[引擎相关]]></category>
		<category><![CDATA[Unity]]></category>
		<category><![CDATA[Unity 3D]]></category>
		<category><![CDATA[优化]]></category>
		<category><![CDATA[内存]]></category>
		<category><![CDATA[原创]]></category>
		<guid isPermaLink="false">https://bye6.cc/?p=731</guid>

					<description><![CDATA[<p>我胡汉三又回来啦！~ 内存交换 标准交换在内存与备份存储之间移动进程，备份存储通常是快速磁盘，它应足够大，以容纳所有用户的所有内存映像的副本，并且它应提供对这些存储器映像的直接访问。 移动设备不支&#8230;</p>
<p><a href="https://vki.cc/greattruth/engine/731/">Unity 内存管理</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></description>
										<content:encoded><![CDATA[
<pre class="wp-block-preformatted">我胡汉三又回来啦！~</pre>



<h4 class="wp-block-heading" id="o8CfU"><span id="%e5%86%85%e5%ad%98%e4%ba%a4%e6%8d%a2">内存交换</span></h4>



<p class="has-text-align-left has-black-color has-text-color wp-block-paragraph">标准交换在内存与备份存储之间移动进程，备份存储通常是快速磁盘，它应足够大，以容纳所有用户的所有内存映像的副本，并且它应提供对这些存储器映像的直接访问。</p>



<p class="has-black-color has-text-color wp-block-paragraph"><strong>移动设备不支持任何形式的内存交换。</strong></p>



<ul class="wp-block-list"><li>移动设备通常采用闪存，而不是空间更大的硬盘作为它的永久存储。导致的空间约束是移动操作系统设计者避免交换的原因之一；</li><li>闪存写入次数的限制；</li><li>内存与闪存之间的吞吐量差；</li></ul>



<p class="has-black-color has-text-color wp-block-paragraph">当空闲内存降低到一定阈值以下时：</p>



<ul class="wp-block-list"><li>iOS：不釆用交换，而是要求应用程序自愿放弃分配的内存。只读数据（如代码）可从系统中删除，以后如有必要再从闪存重新加载。已修改的数据（如堆栈）不会被删除。然而，操作系统可以终止任何未能释放足够内存的应用程序。</li><li>Android：不支持交换，釆用类似 iOS 使用的策略。如果没有足够可用的空闲内存，则它可以终止进程。然而，在终止进程之前，Android 将其应用程序状态写到闪存，以便它能快速重新启动。</li></ul>



<p class="has-black-color has-text-color wp-block-paragraph">iOS支持内存压缩，Android不可以。</p>



<p class="has-black-color has-text-color wp-block-paragraph">Android 内存单位为Page，大小一般为4k，以分配单位回收，分为用户态和内核态，不可越界访问。</p>



<p class="has-black-color has-text-color wp-block-paragraph">Low Memory Killier：内存杀手。</p>



<p class="has-black-color has-text-color wp-block-paragraph"><strong>Android服务优先级（从高到低），当内存不够时从优先级低的开始销毁</strong>：</p>



<ul class="wp-block-list"><li>Native</li><li>System 当杀到这一层级的时候手机重启</li><li>Persistent</li><li>Foreground 前台应用，具体表现为APP闪退</li><li>Perceptible</li><li>Service</li><li>Home 桌面</li><li>Previous 上一个使用的APP</li><li>Cached 后台APP</li></ul>



<h4 class="wp-block-heading" id="36R9c"><span id="unity%e5%86%85%e5%ad%98">Unity内存</span></h4>



<p class="has-black-color has-text-color wp-block-paragraph">按类型分为 <strong>Native Memory </strong>和<strong> Managed Memory</strong></p>



<p class="has-black-color has-text-color wp-block-paragraph">Editor与Runtime不同</p>



<ul class="has-cyan-bluish-gray-color has-text-color wp-block-list"><li data-lake-id="11ad0f3d261d1bdfaad1f6170d68b6da">Editor模式会尽可能的加载资源（启动较慢）</li><li data-lake-id="920753378d0cef5c0e9628ab6efaa826">Runtime按需加载</li></ul>



<p class="has-black-color has-text-color wp-block-paragraph">Unity封装了C++中与申请内存相关的函数，并添加了Label用于统计。</p>



<h4 class="wp-block-heading" id="FzmP4"><span id="audio">Audio</span></h4>



<p class="wp-block-paragraph"><strong>DSP Buffer</strong></p>



<ul class="wp-block-list"><li data-lake-id="b320a7254b16d587a6f73bceb02ab68b">过大会导致声音有延迟</li><li data-lake-id="988feb3af3915b96c8fd2c5133f0b1ab">过小会使CPU负担上升</li></ul>



<p class="wp-block-paragraph"><strong>Force to mono</strong></p>



<p class="wp-block-paragraph">双声道改单声道（尽量，绝大多数声音不需要双声道）</p>



<p class="wp-block-paragraph"><strong>Compress Format</strong></p>



<h4 class="wp-block-heading" id="e3S92"><span id="code-size">Code Size</span></h4>



<p class="wp-block-paragraph">慎用模板泛型，</p>



<h4 class="wp-block-heading" id="UfI9X"><span id="assetbundle">AssetBundle</span></h4>



<p class="wp-block-paragraph">Type Tree</p>



<p class="wp-block-paragraph">当Unity版本与APP版本一致时可以关掉</p>



<ul class="wp-block-list"><li style="list-style-type: none;">
<ul data-lake-id="3e53979f08d5f031e7fefefd919b79c4">
<li data-lake-id="6feee38208c0af4aca7e153e5c19465c">减小内存</li>
<li data-lake-id="2f7a8c2489975976f9ad934aa76d1b4b">减小包大小</li>
<li data-lake-id="47ac6b264aafb950d9d0f23e668ee5e0">Build和Runtime变快</li>
</ul>
</li></ul>



<p class="wp-block-paragraph"><strong>压缩方式</strong></p>



<p class="wp-block-paragraph">LZ4 推荐</p>



<p class="wp-block-paragraph">LZMA 弃用</p>



<p class="wp-block-paragraph"><strong>extra</strong></p>



<p class="wp-block-paragraph">不建议每个文件打一个AssetBundle包</p>



<p class="wp-block-paragraph">因为它们有相同的“头”，仅数据部分不同，容易浪费空间。</p>



<h4 class="wp-block-heading" id="dNP1Y"><span id="resources">Resources</span></h4>



<p class="wp-block-paragraph">通过红黑树进行索引，每次启动游戏都要分析加载红黑树，拖慢启动时间。其次整个游戏生命周期都会存在与内存中。</p>



<h4 class="wp-block-heading" id="KpCjw"><span id="texture">Texture</span></h4>



<p class="wp-block-paragraph"><strong>Upload Buffer</strong></p>



<p class="wp-block-paragraph"><strong>Read&amp;Write</strong></p>



<p class="wp-block-paragraph">没有特殊需求就关掉write</p>



<p class="wp-block-paragraph"><strong>Mipmap</strong></p>



<p class="wp-block-paragraph">同样没有特殊需求就关掉</p>



<h4 class="wp-block-heading" id="x73lJ"><span id="mesh">Mesh</span></h4>



<p class="wp-block-paragraph"><strong>Read&amp;Write</strong></p>



<p class="wp-block-paragraph"><strong>Compresssion</strong></p>



<h3 class="wp-block-heading" id="rbJ5r"><span id="managed%e5%86%85%e5%ad%98">Managed内存</span></h3>



<p class="has-black-color has-text-color wp-block-paragraph">VM内存池</p>



<p class="has-black-color has-text-color wp-block-paragraph">VM会返还内存给OS</p>



<p class="has-black-color has-text-color wp-block-paragraph">条件：一个block连续6次GC没被访问到</p>



<h4 class="wp-block-heading" id="epv2S"><span id="unity-gc-%e7%ae%97%e6%b3%95">Unity GC 算法</span></h4>



<pre class="wp-block-preformatted">貌似不采用CLR的GC机制_(:з」∠)_（参见另一篇文章，传送门）</pre>



<p class="has-black-color has-text-color wp-block-paragraph"><strong>Boehm GC</strong></p>



<p class="has-black-color has-text-color wp-block-paragraph">旧版垃圾回收方式，新版Unity已弃用。</p>



<p class="has-black-color has-text-color wp-block-paragraph"><strong>不分代</strong>（速度更快）</p>



<p class="has-black-color has-text-color wp-block-paragraph"><strong>不压缩</strong>（因为一些历史原因。。跟mono有关）</p>



<p class="has-black-color has-text-color wp-block-paragraph"><strong>Incremental GC（渐进式GC）</strong></p>



<p class="has-black-color has-text-color wp-block-paragraph">Unity2019.3之后使用，新一代垃圾回收算法。</p>



<p class="has-black-color has-text-color wp-block-paragraph">主要目的为了解决旧版GC导致主线程卡顿（旧版GC时会暂停主线程）的问题，<strong>分帧解决，且分代</strong></p>



<h4 class="wp-block-heading" id="4mYDq"><span id="gc%e6%9c%ba%e5%88%b6%e8%80%83%e9%87%8f">GC机制考量</span></h4>



<ul class="wp-block-list"><li data-lake-id="660957963fddbea01fd4ec0bcda75a61">回收能力</li><li data-lake-id="13580033e8e418799d5f260ba564a88d">暂停时长</li><li data-lake-id="522b2a4651dc451b9655e3c8fdf7d6cf">碎片化</li><li data-lake-id="2547a49c18f9244054ccb157d5bc822c">额外消耗</li><li data-lake-id="fdb31eab183fabe0398e946148dd5263">可扩展性</li><li data-lake-id="f3c2da301939823205f12211aedc759a">可移植性</li></ul>



<h4 class="wp-block-heading" id="J5Onq"><span id="%e5%86%85%e5%ad%98%e7%a2%8e%e7%89%87%e5%8c%96">内存碎片化</span></h4>



<p class="has-black-color has-text-color wp-block-paragraph">内存碎片通常分为内部碎片和外部碎片：</p>



<ol class="wp-block-list"><li>内部碎片是由于采用固定大小的内存分区，当一个进程不能完全使用分给它的固定内存区域时就产生了内部碎片，通常内部碎片难以完全避免；</li><li>外部碎片是由于某些未分配的连续内存区域太小，以至于不能满足任意进程的内存分配请求，从而不能被进程利用的内存区域。</li></ol>



<p class="has-black-color has-text-color wp-block-paragraph"><strong>先加载消耗大内存的资源，再加载小内存</strong></p>



<h4 class="wp-block-heading" id="FPdj0"><span id="%e5%83%b5%e5%b0%b8%e5%86%85%e5%ad%98">僵尸内存</span></h4>



<ul class="wp-block-list"><li data-lake-id="bc5462d9e5d49a7e6c32d79622a65214">无用内存</li><li data-lake-id="14915a15a5f640a5f8e01cbe11540cca">没有释放</li><li data-lake-id="796e8d72732ba18a118b944039f28f34">可通过代码管理和性能工具分析</li></ul>



<h4 class="wp-block-heading" id="7Bfhj"><span id="setactive">SetActive</span></h4>



<p class="wp-block-paragraph">TODO。。。</p>



<p class="wp-block-paragraph">都说要少用，但是不清楚机制，有机会看一下Unity源码 Orz</p>



<h3 class="wp-block-heading" id="QSWFN"><span id="%e4%bc%98%e5%8c%96%e5%bb%ba%e8%ae%ae">优化建议</span></h3>



<ul class="wp-block-list"><li data-lake-id="d69d8eee51298fd6887027e6e0e00d34"><strong>使用Destroy，别用null<br></strong></li><li data-lake-id="f2c16401a975b5ae82b4a625bbf6f445"><strong>Class/Struct</strong></li></ul>



<ul class="wp-block-list"><li data-lake-id="d566bb88ddc562cd4fa58dc8340331bf">少于8个字节的数据可用Struct代替Class（存疑）</li></ul>



<ul class="wp-block-list"><li data-lake-id="fdc6d72d868ae679fe6380d181f3b88d"><strong>池中池</strong></li><li data-lake-id="4334e0ca514037df778864799063153d"><strong>闭包和匿名函数</strong></li></ul>



<ul class="wp-block-list"><li data-lake-id="1250b809d7a3beea6d2bac105f387a0d">少用，在IL2CPP里这些都会new class</li><li data-lake-id="413a0dbfac105ff19edbffae41a3061e"><strong>协程</strong></li></ul>



<ul class="wp-block-list"><li data-lake-id="53c02b79234a6494d0ac6d3c4caf0935">用的时候再产生，不用的时候及时终止</li><li data-lake-id="c1e7ec9e3126fc936fc53cac7fa4b6bc">不要当线程使用</li><li data-lake-id="6d7ccc3bc281cf367da7a0f4e14430ad"><strong>配置表</strong></li></ul>



<ul class="wp-block-list"><li data-lake-id="f80c86b757dd40ebb7835f06cfb868b8">excel、json等，按需加载，不然会很占用内存空间</li><li data-lake-id="200224045513b88bcbc82c20699f1adb"><strong>单例模式 Singleton</strong></li></ul>



<ul class="wp-block-list"><li data-lake-id="82ebf0cbb49cdc3719ae3174695d3c4c">慎用，生命周期较长，占用内存</li></ul>
<p><a href="https://vki.cc/greattruth/engine/731/">Unity 内存管理</a>最先出现在<a href="https://vki.cc">初晴神社</a>。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://vki.cc/greattruth/engine/731/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
