{"id":481967,"date":"2026-06-01T15:42:21","date_gmt":"2026-06-01T15:42:21","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=481967"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=481967","title":{"rendered":"\u0423\u0431\u0435\u0439\u0442\u0435 GC-\u0441\u043f\u0430\u0439\u043a\u0438 \u0432 \u0438\u0433\u0440\u0430\u0445 \u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445: \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0431\u0435\u0437 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u043d\u0430 .NET"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430 .NET \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u0441 \u044d\u0442\u0438\u043c. \u0412\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e, \u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u0441\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u044b\u0439 \u0444\u0440\u0438\u0437. \u0418\u0433\u0440\u0430 \u043f\u0440\u043e\u0441\u0435\u0434\u0430\u0435\u0442 \u0441 60 \u0434\u043e 30 FPS \u043d\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u0443. \u0421\u0435\u0440\u0432\u0438\u0441 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 100 \u043c\u0441 \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0445 10. UI \u0434\u0451\u0440\u0433\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p><strong>\u0412\u0438\u043d\u043e\u0432\u043d\u0438\u043a \u2014 Garbage Collector.<\/strong><\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 GC \u0440\u0435\u0448\u0430\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u0443\u0441\u043e\u0440, \u043e\u043d \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (Stop-The-World). \u0414\u043b\u044f \u0438\u0433\u0440 \u0438 real-time \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u044d\u0442\u043e \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0430.<\/p>\n<p><strong>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 .NET \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043c\u0443\u0441\u043e\u0440 \u0432\u0435\u0437\u0434\u0435:<\/strong><\/p>\n<pre><code class=\"cs\">\/\/ \u041a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044cvar list = new List&lt;int&gt;();           \/\/ \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044flist.Add(42);                          \/\/ \u043c\u043e\u0436\u0435\u0442 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0440\u043e\u0441\u0442\u0435 capacityvar result = list.Where(x =&gt; x &gt; 10); \/\/ \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430var arr = list.ToArray();              \/\/ \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430list.Clear();                          \/\/ O(N) \u2014 \u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043d\u043e \u043d\u0435 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u043c \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u043a\u0430\u0434\u0440\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0442\u043d\u0438 \u0442\u0430\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041c\u0443\u0441\u043e\u0440 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f, GC \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 \u0441\u0430\u043c\u044b\u0439 \u043d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0431\u043e\u0441\u0441-\u0444\u0430\u0439\u0442\u0430.<\/p>\n<p><strong>\u0427\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u043b\u0430\u044e\u0442 \u043e\u0431\u044b\u0447\u043d\u043e<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041f\u043e\u0434\u0445\u043e\u0434<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e, \u043b\u0435\u0433\u043a\u043e \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>ArrayPool&lt;T&gt;<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435\u0443\u0434\u043e\u0431\u043d\u043e, \u043d\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 Dictionary\/HashSet, \u043d\u0443\u0436\u043d\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>struct<\/code> \u0438 <code>Span&lt;T&gt;<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 (\u0441\u043b\u043e\u0432\u0430\u0440\u0438, \u0445\u0435\u0448-\u0441\u0435\u0442\u044b)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Unity Collections + Burst<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 Unity, \u0441\u043b\u043e\u0436\u043d\u044b\u0439 API<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0421\u0432\u043e\u0438 \u043f\u0443\u043b\u044b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043e\u043b\u0433\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h3>\u0420\u0435\u0448\u0435\u043d\u0438\u0435: GC-free \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0441 \u043f\u0443\u043b\u0438\u043d\u0433\u043e\u043c \u0438 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c API<\/h3>\n<p><strong>GcFreeCollections<\/strong> \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f .NET 8.0+ \u0438 Unity, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043d\u0430 \u0438\u0445 GC-free \u0430\u043d\u0430\u043b\u043e\u0433\u0438.<\/p>\n<pre><code class=\"cs\">dotnet add package GcFreeCollections --version 1.0.0<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438:<\/strong><\/p>\n<ol>\n<li>\n<p><strong>PooledList&lt;T&gt;<\/strong> \u2014 \u0437\u0430\u043c\u0435\u043d\u0430 <code>List&lt;T&gt;<\/code> \u0431\u0435\u0437 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0432\u0430<\/p>\n<\/li>\n<li>\n<p><strong>PooledDictionary&lt;TKey,TValue&gt;<\/strong> \u2014 \u0437\u0430\u043c\u0435\u043d\u0430 <code>Dictionary&lt;K,V&gt;<\/code><\/p>\n<\/li>\n<li>\n<p><strong>PooledHashSet&lt;T&gt;<\/strong> \u2014 \u0437\u0430\u043c\u0435\u043d\u0430 <code>HashSet&lt;T&gt;<\/code><\/p>\n<\/li>\n<li>\n<p><strong>PooledQueue&lt;T&gt;<\/strong>, <strong>PooledStack&lt;T&gt;<\/strong>, <strong>PooledPriorityQueue&lt;T,P&gt;<\/strong><\/p>\n<\/li>\n<li>\n<p><strong>PooledMemoryStream<\/strong> \u2014 \u0437\u0430\u043c\u0435\u043d\u0430 <code>MemoryStream<\/code><\/p>\n<\/li>\n<li>\n<p><strong>PooledStringBuilder<\/strong> \u2014 \u0437\u0430\u043c\u0435\u043d\u0430 <code>StringBuilder<\/code> \u0441 \u043c\u0435\u043d\u044c\u0448\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439<\/p>\n<\/li>\n<li>\n<p><strong>PooledQuery<\/strong> \u2014 LINQ-\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0431\u0435\u0437 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439<\/p>\n<\/li>\n<li>\n<p><strong>HotPath.Enter()<\/strong> \u2014 \u043e\u0442\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0432 DEBUG<\/p>\n<\/li>\n<li>\n<p><strong>Leak tracking<\/strong> \u2014 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0443\u0442\u0435\u0447\u043a\u0438 \u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/p>\n<\/li>\n<li>\n<p><strong>Reference Quarantine<\/strong> \u2014 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 <code>Maintain()<\/code><\/p>\n<\/li>\n<\/ol>\n<h3>\u0427\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439<\/h3>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">List&lt;T&gt;<\/p>\n<\/th>\n<th>\n<p align=\"left\">PooledList&lt;T&gt;<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0410\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0415\u0441\u0442\u044c (new List&lt;T&gt;())<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435\u0442 (\u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 \u043f\u0443\u043b\u0430)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0410\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0415\u0441\u0442\u044c (\u043f\u0440\u0438 \u0440\u043e\u0441\u0442\u0435 capacity)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0432\u0430 (capacity \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d \u0438\u043b\u0438 \u043f\u0443\u043b \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0410\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u0438 Clear()<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435\u0442, \u043d\u043e O(N) \u043e\u0431\u0445\u043e\u0434<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435\u0442, O(1) (Hot-first Clear)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u043f\u0430\u043c\u044f\u0442\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 GC \u0441\u043e\u0431\u0435\u0440\u0451\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u042f\u0432\u043d\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0432 \u043f\u0443\u043b (Dispose)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0443\u0442\u0435\u0447\u0435\u043a<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0430 (LogLeaks)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0417\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u0432 hot path<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0430 (HotPath.Enter)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435:<\/strong> \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 &#171;\u0441\u043e\u0437\u0434\u0430\u043b-\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b-\u0437\u0430\u0431\u044b\u043b-\u043f\u0443\u0441\u0442\u044c-GC \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f&#187;. GcFreeCollections \u2014 &#171;\u0432\u0437\u044f\u043b-\u0438\u0437-\u043f\u0443\u043b\u0430-\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b-\u0432\u0435\u0440\u043d\u0443\u043b-\u0432-\u043f\u0443\u043b&#187;.<\/p>\n<h3>\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442<\/h3>\n<h4>\u0428\u0430\u0433 1. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438\u043c\u0451\u043d<\/h4>\n<pre><code class=\"cs\">using GcFreeCollections;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0428\u0430\u0433 2. PooledList \u2014 \u0437\u0430\u043c\u0435\u043d\u0430 List<\/h4>\n<pre><code class=\"cs\">\/\/ \u0412\u043c\u0435\u0441\u0442\u043e var list = new List&lt;int&gt;();using var list = PooledList&lt;int&gt;.Create();list.Add(42);list.Add(100);list.Add(73);foreach (var x in list) \/\/ struct enumerator, \u0431\u0435\u0437 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439{    Console.WriteLine(x);}list.Clear(); \/\/ O(1), \u0431\u0435\u0437 \u043e\u0431\u0445\u043e\u0434\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\/\/ \u0412 \u043a\u043e\u043d\u0446\u0435 using \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0435\u0440\u043d\u0451\u0442 list \u0432 \u043f\u0443\u043b<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><strong>\u0412\u0430\u0436\u043d\u043e:<\/strong> \u043f\u043e\u0441\u043b\u0435 <code>Clear()<\/code> \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0435 \u0437\u0430\u043d\u0443\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Reference Quarantine.<\/p>\n<h4>\u0428\u0430\u0433 3. Hot-first Clear \u0438 Maintain<\/h4>\n<pre><code class=\"cs\">\/\/ \u0412 \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u043a\u0430\u0434\u0440\u0435using var enemies = PooledList&lt;Enemy&gt;.Create();\/\/ ... \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0440\u0430\u0433\u043e\u0432, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c ...enemies.Clear(); \/\/ O(1) \u2014 \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0430\/\/ \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u0430\u0434\u0440\u0430 (\u0438\u043b\u0438 \u0440\u0430\u0437 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u0434\u0440\u043e\u0432)PooledGlobals.Maintain(); \/\/ \u041f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0447\u0438\u0441\u0442\u0438\u043c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 Enemy<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0428\u0430\u0433 4. PooledDictionary<\/h4>\n<pre><code class=\"cs\">using var dict = PooledDictionary&lt;string, int&gt;.Create();dict[\"health\"] = 100;dict.Add(\"mana\", 50);if (dict.TryGetValue(\"health\", out int health)){    Console.WriteLine($\"Health: {health}\");}foreach (var kv in dict) \/\/ struct enumerator{    Console.WriteLine($\"{kv.Key}: {kv.Value}\");}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0428\u0430\u0433 5. PooledHashSet<\/h4>\n<pre><code class=\"cs\">using var visited = PooledHashSet&lt;int&gt;.Create();visited.Add(42);visited.Add(100);if (visited.Contains(42)){    Console.WriteLine(\"Found\");}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0428\u0430\u0433 6. LINQ-\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0431\u0435\u0437 GC<\/h4>\n<pre><code class=\"cs\">using var numbers = PooledList&lt;int&gt;.Create(10000);for (int i = 0; i &lt; 10000; i++) numbers.Add(i);\/\/ \u0412\u043c\u0435\u0441\u0442\u043e numbers.Where(x =&gt; x &gt; 10).Select(x =&gt; x * 2).Take(256).ToList()using var result = numbers    .Where(x =&gt; x &gt; 10)    .Select(x =&gt; x * 2)    .Take(256)    .ToPooledList(capacityHint: 256);\/\/ \u041d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u043d\u0430 \u0432\u0441\u0451\u043c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0435<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0428\u0430\u0433 7. PooledStringBuilder<\/h4>\n<pre><code class=\"cs\">using var sb = PooledStringBuilder.CreatePooled(128);sb.Append(\"Player \");sb.Append(123);sb.Append(\" HP\");string text = sb.ToString(); \/\/ \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u2014 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0428\u0430\u0433 8. PooledMemoryStream<\/h4>\n<pre><code class=\"cs\">using var ms = PooledMemoryStream.Create();ms.Write(Encoding.UTF8.GetBytes(\"hello world\"));ms.Position = 0;using var reader = new StreamReader(ms);string content = reader.ReadToEnd();<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0432\u0440\u0430\u0433\u043e\u0432<\/h3>\n<pre><code class=\"cs\">using GcFreeCollections;public class EnemyManager{    private readonly PooledList&lt;Enemy&gt; _allEnemies;    private readonly PooledList&lt;Enemy&gt; _nearbyEnemies;    private readonly PooledHashSet&lt;int&gt; _deadEnemyIds;        public EnemyManager(int maxEnemies)    {        _allEnemies = PooledList&lt;Enemy&gt;.Create(maxEnemies);        _nearbyEnemies = PooledList&lt;Enemy&gt;.Create(64);        _deadEnemyIds = PooledHashSet&lt;int&gt;.Create();    }        public void SpawnEnemy(Enemy enemy)    {        _allEnemies.Add(enemy);    }        public void UpdateNearbyEnemies(Vector3 playerPosition, float radius)    {        \/\/ \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0430 (O(1))        _nearbyEnemies.Clear();                \/\/ \u041f\u043e\u0438\u0441\u043a \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0445 \u0432\u0440\u0430\u0433\u043e\u0432        foreach (var enemy in _allEnemies)        {            if (Vector3.Distance(enemy.Position, playerPosition) &lt; radius)            {                _nearbyEnemies.Add(enemy);            }        }    }        public void HandleDeaths()    {        \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f ID \u0443\u043c\u0435\u0440\u0448\u0438\u0445        using var toRemove = PooledList&lt;int&gt;.Create();                for (int i = 0; i &lt; _allEnemies.Count; i++)        {            if (_allEnemies[i].IsDead)            {                toRemove.Add(i);                _deadEnemyIds.Add(_allEnemies[i].Id);            }        }                \/\/ \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043c\u0451\u0440\u0442\u0432\u044b\u0445 (\u0441 \u043a\u043e\u043d\u0446\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u0431\u0438\u0432\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b)        for (int i = toRemove.Count - 1; i &gt;= 0; i--)        {            _allEnemies.RemoveAt(toRemove[i]);        }    }        public void Update()    {        \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c AI \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u0440\u0430\u0433\u043e\u0432        foreach (var enemy in _allEnemies)        {            enemy.Update();        }    }        public void EndOfFrame()    {        \/\/ \u041f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u0430\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u0441\u0441\u044b\u043b\u043e\u043a        PooledGlobals.Maintain();    }        public void Dispose()    {        _allEnemies.Dispose();        _nearbyEnemies.Dispose();        _deadEnemyIds.Dispose();    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h3>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/h3>\n<p>\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434: <strong>Intel Core i5-11400F, Windows 11, .NET 8, BenchmarkDotNet 0.15.8<\/strong><\/p>\n<h4>List \u2014 Add + \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044f<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">N<\/p>\n<\/th>\n<th>\n<p align=\"left\">List&lt;T&gt; Mean<\/p>\n<\/th>\n<th>\n<p align=\"left\">List&lt;T&gt; Alloc<\/p>\n<\/th>\n<th>\n<p align=\"left\">PooledList&lt;T&gt; Mean<\/p>\n<\/th>\n<th>\n<p align=\"left\">PooledList&lt;T&gt; Alloc<\/p>\n<\/th>\n<th>\n<p align=\"left\">Speedup<\/p>\n<\/th>\n<th>\n<p align=\"left\">Alloc gain<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1000<\/p>\n<\/td>\n<td>\n<p align=\"left\">1,665 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">4,056 B<\/p>\n<\/td>\n<td>\n<p align=\"left\">1,503 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">56 B<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>1.11\u00d7<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>72\u00d7<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">10000<\/p>\n<\/td>\n<td>\n<p align=\"left\">16,312 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">40,056 B<\/p>\n<\/td>\n<td>\n<p align=\"left\">14,319 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">56 B<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>1.14\u00d7<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>715\u00d7<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>Dictionary \u2014 Add + TryGetValue<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">N<\/p>\n<\/th>\n<th>\n<p align=\"left\">Dictionary Mean<\/p>\n<\/th>\n<th>\n<p align=\"left\">Dictionary Alloc<\/p>\n<\/th>\n<th>\n<p align=\"left\">PooledDictionary Mean<\/p>\n<\/th>\n<th>\n<p align=\"left\">PooledDictionary Alloc<\/p>\n<\/th>\n<th>\n<p align=\"left\">Speedup<\/p>\n<\/th>\n<th>\n<p align=\"left\">Alloc gain<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1000<\/p>\n<\/td>\n<td>\n<p align=\"left\">21,293 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">31,016 B<\/p>\n<\/td>\n<td>\n<p align=\"left\">25,407 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">88 B<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.84\u00d7<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>352\u00d7<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">10000<\/p>\n<\/td>\n<td>\n<p align=\"left\">348,706 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">283,042 B<\/p>\n<\/td>\n<td>\n<p align=\"left\">310,081 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">88 B<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>1.12\u00d7<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>3,216\u00d7<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><em>Note: Dictionary \u043d\u0430 1000 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u043d\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 352\u00d7 \u043f\u0430\u043c\u044f\u0442\u0438.<\/em><\/p>\n<h4>HashSet \u2014 Add + Contains<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">N<\/p>\n<\/th>\n<th>\n<p align=\"left\">HashSet Mean<\/p>\n<\/th>\n<th>\n<p align=\"left\">HashSet Alloc<\/p>\n<\/th>\n<th>\n<p align=\"left\">PooledHashSet Mean<\/p>\n<\/th>\n<th>\n<p align=\"left\">PooledHashSet Alloc<\/p>\n<\/th>\n<th>\n<p align=\"left\">Speedup<\/p>\n<\/th>\n<th>\n<p align=\"left\">Alloc gain<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1000<\/p>\n<\/td>\n<td>\n<p align=\"left\">12,518 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">58,664 B<\/p>\n<\/td>\n<td>\n<p align=\"left\">6,377 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">72 B<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>1.96\u00d7<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>815\u00d7<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">10000<\/p>\n<\/td>\n<td>\n<p align=\"left\">177,439 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">538,656 B<\/p>\n<\/td>\n<td>\n<p align=\"left\">55,427 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">72 B<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>3.20\u00d7<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>7,481\u00d7<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>LINQ \u2014 Where\/Select\/Take\/ToList<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">N<\/p>\n<\/th>\n<th>\n<p align=\"left\">LINQ Mean<\/p>\n<\/th>\n<th>\n<p align=\"left\">LINQ Alloc<\/p>\n<\/th>\n<th>\n<p align=\"left\">PooledQuery Mean<\/p>\n<\/th>\n<th>\n<p align=\"left\">PooledQuery Alloc<\/p>\n<\/th>\n<th>\n<p align=\"left\">Speedup<\/p>\n<\/th>\n<th>\n<p align=\"left\">Alloc gain<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1000<\/p>\n<\/td>\n<td>\n<p align=\"left\">2,367 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">6,496 B<\/p>\n<\/td>\n<td>\n<p align=\"left\">1,845 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">112 B<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>1.28\u00d7<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>58\u00d7<\/strong><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">10000<\/p>\n<\/td>\n<td>\n<p align=\"left\">12,522 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">42,496 B<\/p>\n<\/td>\n<td>\n<p align=\"left\">10,726 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">112 B<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>1.17\u00d7<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>379\u00d7<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h4>StringBuilder \/ PooledStringBuilder<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">N<\/p>\n<\/th>\n<th>\n<p align=\"left\">StringBuilder Mean<\/p>\n<\/th>\n<th>\n<p align=\"left\">StringBuilder Alloc<\/p>\n<\/th>\n<th>\n<p align=\"left\">PooledStringBuilder Mean<\/p>\n<\/th>\n<th>\n<p align=\"left\">PooledStringBuilder Alloc<\/p>\n<\/th>\n<th>\n<p align=\"left\">Speedup<\/p>\n<\/th>\n<th>\n<p align=\"left\">Alloc gain<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">1000<\/p>\n<\/td>\n<td>\n<p align=\"left\">37 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">408 B<\/p>\n<\/td>\n<td>\n<p align=\"left\">49 ns<\/p>\n<\/td>\n<td>\n<p align=\"left\">80 B<\/p>\n<\/td>\n<td>\n<p align=\"left\">0.75\u00d7<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>5.1\u00d7<\/strong><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><em>Note: PooledStringBuilder \u043f\u043e\u043a\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0434\u043b\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u043a, \u043d\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043f\u0430\u043c\u044f\u0442\u044c.<\/em><\/p>\n<h3>\u0413\u0434\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f<\/h3>\n<h4>1. \u0418\u0433\u0440\u043e\u0432\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 (Unity \/ Godot \/ Monogame)<\/h4>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430:<\/strong> GC-\u0441\u043f\u0430\u0439\u043a\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 frame hitches.<br \/><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435:<\/strong> Pooled-\u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0432 Update\/FixedUpdate.<\/p>\n<pre><code class=\"cs\">void Update(){    using var activeEnemies = PooledList&lt;Enemy&gt;.Create();    GetActiveEnemies(activeEnemies);        foreach (var enemy in activeEnemies)    {        enemy.UpdateAI();    }} \/\/ \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0432 \u043f\u0443\u043b<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>2. Real-time \u0441\u0435\u0440\u0432\u0438\u0441\u044b (FinTech \/ Trading)<\/h4>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430:<\/strong> GC-\u043f\u0430\u0443\u0437\u044b \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 latency-sensitive \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<br \/><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435:<\/strong> Zero-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0437\u0430\u044f\u0432\u043e\u043a.<\/p>\n<pre><code class=\"cs\">public void ProcessOrders(ReadOnlySpan&lt;Order&gt; orders){    using var buyOrders = PooledList&lt;Order&gt;.Create(orders.Length);    using var sellOrders = PooledList&lt;Order&gt;.Create(orders.Length);        foreach (var order in orders)    {        if (order.Type == OrderType.Buy)            buyOrders.Add(order);        else            sellOrders.Add(order);    }        MatchOrders(buyOrders.AsSpan(), sellOrders.AsSpan());}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>3. \u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044b (Multiplayer games)<\/h4>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430:<\/strong> \u0422\u044b\u0441\u044f\u0447\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439, \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043c\u0443\u0441\u043e\u0440.<br \/><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435:<\/strong> \u041f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430.<\/p>\n<pre><code class=\"cs\">public class GameRoom{    private readonly PooledList&lt;Player&gt; _players;    private readonly PooledList&lt;Message&gt; _pendingMessages;        public void Broadcast(Message msg)    {        for (int i = 0; i &lt; _players.Count; i++)        {            _players[i].Send(msg);        }    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>4. VR\/AR \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h4>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430:<\/strong> \u041b\u044e\u0431\u043e\u0439 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u0434\u0440 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0434\u0438\u0441\u043a\u043e\u043c\u0444\u043e\u0440\u0442.<br \/><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435:<\/strong> \u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 frame pacing \u0431\u0435\u0437 GC.<\/p>\n<h4>5. \u0410\u0443\u0434\u0438\u043e\/DSP \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/h4>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430:<\/strong> \u0410\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0432 \u0430\u0443\u0434\u0438\u043e-\u043f\u043e\u0442\u043e\u043a\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0449\u0435\u043b\u0447\u043a\u0438.<br \/><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435:<\/strong> Pooled-\u0431\u0443\u0444\u0435\u0440\u044b \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438.<\/p>\n<h4>6. Unity Editor \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/h4>\n<p><strong>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430:<\/strong> \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0432 Editor Tooling \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043c\u0443\u0441\u043e\u0440.<br \/><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435:<\/strong> GC-free \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432.<\/p>\n<h3>\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430\u043c\u0438<\/h3>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">GC-free<\/p>\n<\/th>\n<th>\n<p align=\"left\">Pooling<\/p>\n<\/th>\n<th>\n<p align=\"left\">Dictionary<\/p>\n<\/th>\n<th>\n<p align=\"left\">HashSet<\/p>\n<\/th>\n<th>\n<p align=\"left\">LINQ pipeline<\/p>\n<\/th>\n<th>\n<p align=\"left\">Hot Clear<\/p>\n<\/th>\n<th>\n<p align=\"left\">Quarantine<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0410\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">.NET Standart<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Unity Collections<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705 (Native)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">NativeHashMap<\/p>\n<\/td>\n<td>\n<p align=\"left\">NativeHashSet<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Roaring Bitmaps<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c (\u0442\u043e\u043b\u044c\u043a\u043e int)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">C5<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c (\u0443\u0441\u0442\u0430\u0440\u0435\u043b\u0430)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0421\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0439 \u043f\u0443\u043b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c (\u0441\u043b\u043e\u0436\u043d\u043e)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c (\u0441\u043b\u043e\u0436\u043d\u043e)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u274c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0417\u0430\u0432\u0438\u0441\u0438\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>GcFreeCollections<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2705<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>\u041a\u043e\u0433\u0434\u0430 GcFreeCollections \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442:<\/strong><\/p>\n<ul>\n<li>\n<p>\u041d\u0443\u0436\u043d\u044b \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0435 API (List\/Dictionary\/HashSet) \u0431\u0435\u0437 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u0447\u0438\u0441\u0442\u043e\u043c .NET (\u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e Unity)<\/p>\n<\/li>\n<li>\n<p>\u041d\u0443\u0436\u0435\u043d LINQ-\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0431\u0435\u0437 \u043c\u0443\u0441\u043e\u0440\u0430<\/p>\n<\/li>\n<li>\n<p>\u0412\u0430\u0436\u043d\u044b \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043e\u0442\u043b\u0430\u0434\u043a\u0438 (Leak tracking, HotPath guard)<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u0443\u043b\u044b \u0438 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0438\u0445<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u041a\u043e\u0433\u0434\u0430 \u0441\u0442\u043e\u0438\u0442 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0443:<\/strong><\/p>\n<ul>\n<li>\n<p><strong>Unity Collections + Burst<\/strong> \u2014 \u0435\u0441\u043b\u0438 \u0432\u044b \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 Job System \u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0437\u0430 \u0441\u0447\u0451\u0442 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438<\/strong> \u2014 \u0434\u043b\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0431\u0435\u0437 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439 \u043a GC<\/p>\n<\/li>\n<li>\n<p><strong>Roaring Bitmaps<\/strong> \u2014 \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432 \u0446\u0435\u043b\u044b\u0445 \u0447\u0438\u0441\u0435\u043b<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0439 \u043f\u0443\u043b<\/strong> \u2014 \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043e\u0447\u0435\u043d\u044c \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0435\u0441\u0442\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u043e\u0442\u043b\u0430\u0434\u043a\u0443<\/p>\n<\/li>\n<\/ul>\n<h3>\u041e\u0442\u043b\u0430\u0434\u043a\u0430 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/h3>\n<h4>\u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0443\u0442\u0435\u0447\u0435\u043a (DEBUG)<\/h4>\n<pre><code class=\"cs\">\/\/ \u0412 \u043a\u043e\u043d\u0446\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u0438\u043b\u0438 \u043f\u0440\u0438 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0435 \u0443\u0440\u043e\u0432\u043d\u044fPooledGlobals.LogLeaks(); \/\/ \u041b\u043e\u0433\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043d\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0451\u043d\u043d\u044b\u0435 \u0432 \u043f\u0443\u043bPooledGlobals.AssertClosedPool(); \/\/ \u0411\u0440\u043e\u0441\u0430\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0443\u0442\u0435\u0447\u043a\u0438<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>\u0417\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u0432 hot path (DEBUG)<\/h4>\n<pre><code class=\"cs\">void CriticalUpdate(){    using var hot = HotPath.Enter(); \/\/ \u041b\u044e\u0431\u0430\u044f \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u044b\u0431\u0440\u043e\u0441\u0438\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435        \/\/ \u0415\u0441\u043b\u0438 \u0437\u0434\u0435\u0441\u044c \u0441\u043b\u0443\u0447\u0438\u0442\u0441\u044f new List&lt;int&gt;() \u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u0430\u044f \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u2014 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435    using var list = PooledList&lt;int&gt;.Create(); \/\/ OK    list.Add(42); \/\/ OK}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>Leak tracking \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432<\/h4>\n<p>\u0412 DEBUG \u0440\u0435\u0436\u0438\u043c\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0432\u0437\u044f\u0442\u044b\u0439 \u0438\u0437 \u043f\u0443\u043b\u0430, \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u041f\u0440\u0438 \u0432\u044b\u0437\u043e\u0432\u0435 <code>LogLeaks()<\/code> \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435, \u0433\u0434\u0435 \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0432 \u043f\u0443\u043b.<\/p>\n<h3>Unity Integration<\/h3>\n<pre><code class=\"cs\">using UnityEngine;using GcFreeCollections;public class PooledGameManager : MonoBehaviour{    private PooledList&lt;GameObject&gt; _activeProjectiles;        void Start()    {        _activeProjectiles = PooledList&lt;GameObject&gt;.Create(256);    }        void Update()    {        _activeProjectiles.Clear(); \/\/ O(1) \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0430                foreach (var proj in FindObjectsOfType&lt;Projectile&gt;())        {            _activeProjectiles.Add(proj.gameObject);        }    }        void LateUpdate()    {        \/\/ \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u0430\u0434\u0440\u0430 \u2014 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u0430\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0430        PooledGlobals.Maintain();    }        void OnDestroy()    {        _activeProjectiles.Dispose();        PooledGlobals.AssertClosedPool(); \/\/ \u0423\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0432\u0441\u0451 \u0432\u0435\u0440\u043d\u0443\u043b\u0438    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0411\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 \u0431\u0435\u0437 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439. \u041a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.<\/p>\n<p><strong>NuGet:<\/strong> <a href=\"https:\/\/www.nuget.org\/packages\/GcFreeCollections\" rel=\"noopener noreferrer nofollow\">https:\/\/www.nuget.org\/packages\/GcFreeCollections<\/a><\/p>\n<p><strong>GitHub (\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438):<\/strong> <a href=\"https:\/\/github.com\/likeslines-maker\/GcFreeCollections\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/likeslines-maker\/GcFreeCollections<\/a><\/p>\n<p>GcFreeCollections \u2014 \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 GC-free \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439 \u0434\u043b\u044f .NET \u0438 Unity.<\/p>\n<p>\u041e\u043d\u0430 \u0440\u0435\u0448\u0430\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443: \u043d\u0435\u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u044b\u0435 \u043f\u0430\u0443\u0437\u044b \u0438\u0437-\u0437\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 \u043c\u0443\u0441\u043e\u0440\u0430 \u0432 real-time \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445.<\/p>\n<p><strong>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439:<\/strong><\/p>\n<ul>\n<li>\n<p>\u041d\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043c\u0443\u0441\u043e\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0432\u0430 (\u044d\u043a\u043e\u043d\u043e\u043c\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043e 7481\u00d7)<\/p>\n<\/li>\n<li>\n<p>Clear() \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0437\u0430 O(1) \u0432\u043c\u0435\u0441\u0442\u043e O(N)<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u0442\u044c \u043f\u0443\u043b\u0438\u043d\u0433 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 Unity Collections:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u043b\u044e\u0431\u043e\u043c .NET (\u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e Unity)<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 API (List\/Dictionary\/HashSet)<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u0442\u044c LINQ-\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0431\u0435\u0437 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439<\/p>\n<\/li>\n<\/ul>\n<p><strong>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0445 \u043f\u0443\u043b\u043e\u0432:<\/strong><\/p>\n<ul>\n<li>\n<p>\u0423\u0436\u0435 \u043e\u0442\u043b\u0430\u0436\u0435\u043d\u043e \u0438 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043e\u0442\u043b\u0430\u0434\u043a\u0438 (Leak tracking, HotPath guard)<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b (Dictionary, HashSet)<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u0442\u0440\u0430\u0434\u0430\u0435\u0442 \u043e\u0442 GC-\u0441\u043f\u0430\u0439\u043a\u043e\u0432 \u2014 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 GcFreeCollections. \u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 frame rate \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u0430\u044f \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u0433\u043e \u0441\u0442\u043e\u044f\u0442.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1042340\/\">https:\/\/habr.com\/ru\/articles\/1042340\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430 .NET \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u0441 \u044d\u0442\u0438\u043c. \u0412\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e, \u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u0441\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u044b\u0439 \u0444\u0440\u0438\u0437. \u0418\u0433\u0440\u0430 \u043f\u0440\u043e\u0441\u0435\u0434\u0430\u0435\u0442 \u0441 60 \u0434\u043e 30 FPS \u043d\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u0443. \u0421\u0435\u0440\u0432\u0438\u0441 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 100 \u043c\u0441 \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0445 10. UI \u0434\u0451\u0440\u0433\u0430\u0435\u0442\u0441\u044f.\u0412\u0438\u043d\u043e\u0432\u043d\u0438\u043a \u2014 Garbage Collector.\u041a\u043e\u0433\u0434\u0430 GC \u0440\u0435\u0448\u0430\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u0443\u0441\u043e\u0440, \u043e\u043d \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043f\u043e\u0442\u043e\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (Stop-The-World). \u0414\u043b\u044f \u0438\u0433\u0440 \u0438 real-time \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u044d\u0442\u043e \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0430.\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 .NET \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043c\u0443\u0441\u043e\u0440 \u0432\u0435\u0437\u0434\u0435:\/\/ \u041a\u0430\u0436\u0434\u0430\u044f \u0438\u0437 \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u0443\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044cvar list = new List&lt;int&gt;();           \/\/ \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044flist.Add(42);                          \/\/ \u043c\u043e\u0436\u0435\u0442 \u0430\u043b\u043b\u043e\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0440\u043e\u0441\u0442\u0435 capacityvar result = list.Where(x =&gt; x &gt; 10); \/\/ \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0430var arr = list.ToArray();              \/\/ \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u0430list.Clear();                          \/\/ O(N) \u2014 \u043e\u0431\u0445\u043e\u0434 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043d\u043e \u043d\u0435 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f\u0412 \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u043c \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u043a\u0430\u0434\u0440\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0442\u043d\u0438 \u0442\u0430\u043a\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041c\u0443\u0441\u043e\u0440 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f, GC \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0435\u0433\u043e \u0432 \u0441\u0430\u043c\u044b\u0439 \u043d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0431\u043e\u0441\u0441-\u0444\u0430\u0439\u0442\u0430.\u0427\u0442\u043e \u0441 \u044d\u0442\u0438\u043c \u0434\u0435\u043b\u0430\u044e\u0442 \u043e\u0431\u044b\u0447\u043d\u043e\u041f\u043e\u0434\u0445\u043e\u0434\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e\u041e\u0447\u0435\u043d\u044c \u0441\u043b\u043e\u0436\u043d\u043e, \u043b\u0435\u0433\u043a\u043e \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c ArrayPool&lt;T&gt;\u041d\u0435\u0443\u0434\u043e\u0431\u043d\u043e, \u043d\u0435\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 Dictionary\/HashSet, \u043d\u0443\u0436\u043d\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c struct \u0438 Span&lt;T&gt;\u041d\u0435 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 (\u0441\u043b\u043e\u0432\u0430\u0440\u0438, \u0445\u0435\u0448-\u0441\u0435\u0442\u044b)Unity Collections + Burst\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 Unity, \u0441\u043b\u043e\u0436\u043d\u044b\u0439 API\u0421\u0432\u043e\u0438 \u043f\u0443\u043b\u044b\u0414\u043e\u043b\u0433\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439\u0420\u0435\u0448\u0435\u043d\u0438\u0435: GC-free \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0441 \u043f\u0443\u043b\u0438\u043d\u0433\u043e\u043c \u0438 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c APIGcFreeCollections \u2014 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f .NET 8.0+ \u0438 Unity, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043d\u0430 \u0438\u0445 GC-free \u0430\u043d\u0430\u043b\u043e\u0433\u0438.dotnet add package GcFreeCollections &#8212;version 1.0.0\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438:PooledList&lt;T&gt; \u2014 \u0437\u0430\u043c\u0435\u043d\u0430 List&lt;T&gt; \u0431\u0435\u0437 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0432\u0430PooledDictionary&lt;TKey,TValue&gt; \u2014 \u0437\u0430\u043c\u0435\u043d\u0430 Dictionary&lt;K,V&gt;PooledHashSet&lt;T&gt; \u2014 \u0437\u0430\u043c\u0435\u043d\u0430 HashSet&lt;T&gt;PooledQueue&lt;T&gt;, PooledStack&lt;T&gt;, PooledPriorityQueue&lt;T,P&gt;PooledMemoryStream \u2014 \u0437\u0430\u043c\u0435\u043d\u0430 MemoryStreamPooledStringBuilder \u2014 \u0437\u0430\u043c\u0435\u043d\u0430 StringBuilder \u0441 \u043c\u0435\u043d\u044c\u0448\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439PooledQuery \u2014 LINQ-\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0431\u0435\u0437 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439HotPath.Enter() \u2014 \u043e\u0442\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0432 DEBUGLeak tracking \u2014 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u0443\u0442\u0435\u0447\u043a\u0438 \u043f\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432Reference Quarantine \u2014 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 Maintain()\u0427\u0435\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0439\u0425\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430List&lt;T&gt;PooledList&lt;T&gt;\u0410\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438\u0415\u0441\u0442\u044c (new List&lt;T&gt;())\u041d\u0435\u0442 (\u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0438\u0437 \u043f\u0443\u043b\u0430)\u0410\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\u0415\u0441\u0442\u044c (\u043f\u0440\u0438 \u0440\u043e\u0441\u0442\u0435 capacity)\u041d\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0432\u0430 (capacity \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d \u0438\u043b\u0438 \u043f\u0443\u043b \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f)\u0410\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u043f\u0440\u0438 Clear()\u041d\u0435\u0442, \u043d\u043e O(N) \u043e\u0431\u0445\u043e\u0434\u041d\u0435\u0442, O(1) (Hot-first Clear)\u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u043f\u0430\u043c\u044f\u0442\u0438\u0422\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0433\u0434\u0430 GC \u0441\u043e\u0431\u0435\u0440\u0451\u0442\u042f\u0432\u043d\u044b\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0432 \u043f\u0443\u043b (Dispose)\u041e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0443\u0442\u0435\u0447\u0435\u043a\u041d\u0435\u0442\u0414\u0430 (LogLeaks)\u0417\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u0432 hot path\u041d\u0435\u0442\u0414\u0430 (HotPath.Enter)\u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435: \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 &#171;\u0441\u043e\u0437\u0434\u0430\u043b-\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b-\u0437\u0430\u0431\u044b\u043b-\u043f\u0443\u0441\u0442\u044c-GC \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f&#187;. GcFreeCollections \u2014 &#171;\u0432\u0437\u044f\u043b-\u0438\u0437-\u043f\u0443\u043b\u0430-\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b-\u0432\u0435\u0440\u043d\u0443\u043b-\u0432-\u043f\u0443\u043b&#187;.\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\u0428\u0430\u0433 1. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438\u043c\u0451\u043dusing GcFreeCollections;\u0428\u0430\u0433 2. PooledList \u2014 \u0437\u0430\u043c\u0435\u043d\u0430 List\/\/ \u0412\u043c\u0435\u0441\u0442\u043e var list = new List&lt;int&gt;();using var list = PooledList&lt;int&gt;.Create();list.Add(42);list.Add(100);list.Add(73);foreach (var x in list) \/\/ struct enumerator, \u0431\u0435\u0437 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439{    Console.WriteLine(x);}list.Clear(); \/\/ O(1), \u0431\u0435\u0437 \u043e\u0431\u0445\u043e\u0434\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\/\/ \u0412 \u043a\u043e\u043d\u0446\u0435 using \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0435\u0440\u043d\u0451\u0442 list \u0432 \u043f\u0443\u043b\u0412\u0430\u0436\u043d\u043e: \u043f\u043e\u0441\u043b\u0435 Clear() \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043d\u0435 \u0437\u0430\u043d\u0443\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Reference Quarantine.\u0428\u0430\u0433 3. Hot-first Clear \u0438 Maintain\/\/ \u0412 \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u043a\u0430\u0434\u0440\u0435using var enemies = PooledList&lt;Enemy&gt;.Create();\/\/ &#8230; \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0440\u0430\u0433\u043e\u0432, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c &#8230;enemies.Clear(); \/\/ O(1) \u2014 \u0431\u044b\u0441\u0442\u0440\u0430\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0430\/\/ \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u0430\u0434\u0440\u0430 (\u0438\u043b\u0438 \u0440\u0430\u0437 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u0434\u0440\u043e\u0432)PooledGlobals.Maintain(); \/\/ \u041f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u0447\u0438\u0441\u0442\u0438\u043c \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 Enemy\u0428\u0430\u0433 4. PooledDictionaryusing var dict = PooledDictionary&lt;string, int&gt;.Create();dict[&#171;health&#187;] = 100;dict.Add(&#171;mana&#187;, 50);if (dict.TryGetValue(&#171;health&#187;, out int health)){    Console.WriteLine($&#187;Health: {health}&#187;);}foreach (var kv in dict) \/\/ struct enumerator{    Console.WriteLine($&#187;{kv.Key}: {kv.Value}&#187;);}\u0428\u0430\u0433 5. PooledHashSetusing var visited = PooledHashSet&lt;int&gt;.Create();visited.Add(42);visited.Add(100);if (visited.Contains(42)){    Console.WriteLine(&#171;Found&#187;);}\u0428\u0430\u0433 6. LINQ-\u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0431\u0435\u0437 GCusing var numbers = PooledList&lt;int&gt;.Create(10000);for (int i = 0; i &lt; 10000; i++) numbers.Add(i);\/\/ \u0412\u043c\u0435\u0441\u0442\u043e numbers.Where(x =&gt; x &gt; 10).Select(x =&gt; x * 2).Take(256).ToList()using var result = numbers    .Where(x =&gt; x &gt; 10)    .Select(x =&gt; x * 2)    .Take(256)    .ToPooledList(capacityHint: 256);\/\/ \u041d\u0438 \u043e\u0434\u043d\u043e\u0439 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u043d\u0430 \u0432\u0441\u0451\u043c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0435\u0428\u0430\u0433 7. PooledStringBuilderusing var sb = PooledStringBuilder.CreatePooled(128);sb.Append(&#171;Player &#171;);sb.Append(123);sb.Append(&#187; HP&#187;);string text = sb.ToString(); \/\/ \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u044f \u2014 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\u0428\u0430\u0433 8. PooledMemoryStreamusing var ms = PooledMemoryStream.Create();ms.Write(Encoding.UTF8.GetBytes(&#171;hello world&#187;));ms.Position = 0;using var reader = new StreamReader(ms);string content = reader.ReadToEnd();\u041f\u043e\u043b\u043d\u044b\u0439 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0432\u0440\u0430\u0433\u043e\u0432using GcFreeCollections;public class EnemyManager{    private readonly PooledList&lt;Enemy&gt; _allEnemies;    private readonly PooledList&lt;Enemy&gt; _nearbyEnemies;    private readonly PooledHashSet&lt;int&gt; _deadEnemyIds;        public EnemyManager(int maxEnemies)    {        _allEnemies = PooledList&lt;Enemy&gt;.Create(maxEnemies);        _nearbyEnemies = PooledList&lt;Enemy&gt;.Create(64);        _deadEnemyIds = PooledHashSet&lt;int&gt;.Create();    }        public void SpawnEnemy(Enemy enemy)    {        _allEnemies.Add(enemy);    }        public void UpdateNearbyEnemies(Vector3 playerPosition, float radius)    {        \/\/ \u0411\u044b\u0441\u0442\u0440\u0430\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0430 (O(1))        _nearbyEnemies.Clear();                \/\/ \u041f\u043e\u0438\u0441\u043a \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0445 \u0432\u0440\u0430\u0433\u043e\u0432        foreach (var enemy in _allEnemies)        {            if (Vector3.Distance(enemy.Position, playerPosition) &lt; radius)            {                _nearbyEnemies.Add(enemy);            }        }    }        public void HandleDeaths()    {        \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f ID \u0443\u043c\u0435\u0440\u0448\u0438\u0445        using var toRemove = PooledList&lt;int&gt;.Create();                for (int i = 0; i &lt; _allEnemies.Count; i++)        {            if (_allEnemies[i].IsDead)            {                toRemove.Add(i);                _deadEnemyIds.Add(_allEnemies[i].Id);            }        }                \/\/ \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043c\u0451\u0440\u0442\u0432\u044b\u0445 (\u0441 \u043a\u043e\u043d\u0446\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u0431\u0438\u0432\u0430\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b)        for (int i = toRemove.Count &#8212; 1; i &gt;= 0; i&#8212;)        {            _allEnemies.RemoveAt(toRemove[i]);        }    }        public void Update()    {        \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c AI \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u0440\u0430\u0433\u043e\u0432        foreach (var enemy in _allEnemies)        {            enemy.Update();        }    }        public void EndOfFrame()    {        \/\/ \u041f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u0430\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0430 \u0441\u0441\u044b\u043b\u043e\u043a        PooledGlobals.Maintain();    }        public void Dispose()    {        _allEnemies.Dispose();        _nearbyEnemies.Dispose();        _deadEnemyIds.Dispose();    }}\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434: Intel Core i5-11400F, Windows 11, .NET 8, BenchmarkDotNet 0.15.8List \u2014 Add + \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u044fNList&lt;T&gt; MeanList&lt;T&gt; AllocPooledList&lt;T&gt; MeanPooledList&lt;T&gt; AllocSpeedupAlloc gain10001,665 ns4,056 B1,503 ns56 B1.11\u00d772\u00d71000016,312 ns40,056 B14,319 ns56 B1.14\u00d7715\u00d7Dictionary \u2014 Add + TryGetValueNDictionary MeanDictionary AllocPooledDictionary MeanPooledDictionary AllocSpeedupAlloc gain100021,293 ns31,016 B25,407 ns88 B0.84\u00d7352\u00d710000348,706 ns283,042 B310,081 ns88 B1.12\u00d73,216\u00d7Note: Dictionary \u043d\u0430 1000 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u043d\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 352\u00d7 \u043f\u0430\u043c\u044f\u0442\u0438.HashSet \u2014 Add + ContainsNHashSet MeanHashSet AllocPooledHashSet MeanPooledHashSet AllocSpeedupAlloc gain100012,518 ns58,664 B6,377 ns72 B1.96\u00d7815\u00d710000177,439 ns538,656 B55,427 ns72 B3.20\u00d77,481\u00d7LINQ \u2014 Where\/Select\/Take\/ToListNLINQ MeanLINQ AllocPooledQuery MeanPooledQuery AllocSpeedupAlloc gain10002,367 ns6,496 B1,845 ns112 B1.28\u00d758\u00d71000012,522 ns42,496 B10,726 ns112 B1.17\u00d7379\u00d7StringBuilder \/ PooledStringBuilderNStringBuilder MeanStringBuilder AllocPooledStringBuilder MeanPooledStringBuilder AllocSpeedupAlloc gain100037 ns408 B49 ns80 B0.75\u00d75.1\u00d7Note: PooledStringBuilder \u043f\u043e\u043a\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0434\u043b\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u043a, \u043d\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043f\u0430\u043c\u044f\u0442\u044c.\u0413\u0434\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f1. \u0418\u0433\u0440\u043e\u0432\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 (Unity \/ Godot \/ Monogame)\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: GC-\u0441\u043f\u0430\u0439\u043a\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 frame hitches.\u0420\u0435\u0448\u0435\u043d\u0438\u0435: Pooled-\u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0432 Update\/FixedUpdate.void Update(){    using var activeEnemies = PooledList&lt;Enemy&gt;.Create();    GetActiveEnemies(activeEnemies);        foreach (var enemy in activeEnemies)    {        enemy.UpdateAI();    }} \/\/ \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u0432 \u043f\u0443\u043b2. Real-time \u0441\u0435\u0440\u0432\u0438\u0441\u044b (FinTech \/ Trading)\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: GC-\u043f\u0430\u0443\u0437\u044b \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 latency-sensitive \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.\u0420\u0435\u0448\u0435\u043d\u0438\u0435: Zero-\u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0437\u0430\u044f\u0432\u043e\u043a.public void ProcessOrders(ReadOnlySpan&lt;Order&gt; orders){    using var buyOrders = PooledList&lt;Order&gt;.Create(orders.Length);    using var sellOrders = PooledList&lt;Order&gt;.Create(orders.Length);        foreach (var order in orders)    {        if (order.Type == OrderType.Buy)            buyOrders.Add(order);        else            sellOrders.Add(order);    }        MatchOrders(buyOrders.AsSpan(), sellOrders.AsSpan());}3. \u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044b (Multiplayer games)\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0422\u044b\u0441\u044f\u0447\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439, \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043c\u0443\u0441\u043e\u0440.\u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u041f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430.public class GameRoom{    private readonly PooledList&lt;Player&gt; _players;    private readonly PooledList&lt;Message&gt; _pendingMessages;        public void Broadcast(Message msg)    {        for (int i = 0; i &lt; _players.Count; i++)        {            _players[i].Send(msg);        }    }}4. VR\/AR \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u041b\u044e\u0431\u043e\u0439 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u043a\u0430\u0434\u0440 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0434\u0438\u0441\u043a\u043e\u043c\u0444\u043e\u0440\u0442.\u0420\u0435\u0448\u0435\u043d\u0438\u0435: \u0421\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 frame pacing \u0431\u0435\u0437 GC.5. \u0410\u0443\u0434\u0438\u043e\/DSP \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0410\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0438 \u0432 \u0430\u0443\u0434\u0438\u043e-\u043f\u043e\u0442\u043e\u043a\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 \u0449\u0435\u043b\u0447\u043a\u0438.\u0420\u0435\u0448\u0435\u043d\u0438\u0435: Pooled-\u0431\u0443\u0444\u0435\u0440\u044b \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438.6. Unity Editor \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0432 Editor Tooling \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u043c\u0443\u0441\u043e\u0440.\u0420\u0435\u0448\u0435\u043d\u0438\u0435: GC-free \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432.\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430\u043c\u0438\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430GC-freePoolingDictionaryHashSetLINQ pipelineHot&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-481967","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/481967","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=481967"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/481967\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=481967"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=481967"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=481967"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}