{"id":81,"date":"2025-02-11T06:32:45","date_gmt":"2025-02-11T06:32:45","guid":{"rendered":"https:\/\/krzysztof.bobnis.eu\/?p=81"},"modified":"2025-04-01T05:31:40","modified_gmt":"2025-04-01T05:31:40","slug":"unreal-optimization","status":"publish","type":"post","link":"https:\/\/krzysztof.bobnis.eu\/index.php\/2025\/02\/11\/unreal-optimization\/","title":{"rendered":"Unreal optimization"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Finding the performance bottleneck (CPU vs GPU)<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">To properly test performance:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>disable vsync (r.vsync 0) <\/li>\n\n\n\n<li>and frame limiter (t.MaxFPS 0)\n<ul class=\"wp-block-list\">\n<li>in UE 5.5 there is a bug and setting t.MaxFPS to 0 caps the FPS at 60. To overcome it, set t.MaxFPS to higher value, like 1000<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>disable smooth framerate (Project &gt; Engine &gt; General Settings, disabled by default)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Stat command<\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"963\" height=\"661\" src=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-2.png\" alt=\"\" class=\"wp-image-89\" srcset=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-2.png 963w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-2-300x206.png 300w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-2-768x527.png 768w\" sizes=\"auto, (max-width: 963px) 100vw, 963px\" \/><figcaption class=\"wp-element-caption\">To turn on unit stat, click the three lines (top left corner three lines -&gt; show stats). <br>or type in console: <code>stat unit<\/code> <br>When looking at the unit stat, the frame is total time of frame. But look at the next ones. The biggest number will hint that this is the bottleneck. In case of this screenshot, the bottlenect might be the game thread: CPU.<br><br>To change the colors of the numbers, change: &#8220;t.UnacceptableFrameTimeThreshold &lt;milliseconds&gt;&#8221;<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Stat unitgraph<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"909\" height=\"625\" src=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-1.png\" alt=\"\" class=\"wp-image-85\" srcset=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-1.png 909w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-1-300x206.png 300w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-1-768x528.png 768w\" sizes=\"auto, (max-width: 909px) 100vw, 909px\" \/><figcaption class=\"wp-element-caption\">three lines in the top left corner of the viewport -&gt; stat -&gt; engine -&gt; unitgraph<br>command <code>stat unitgraph<\/code><br>To change the budget, use console command: &#8220;t.TargetFrameTimeThreshold &lt;milliseconds&gt;&#8221;<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s how to enable it:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"950\" height=\"694\" src=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image.png\" alt=\"\" class=\"wp-image-84\" srcset=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image.png 950w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-300x219.png 300w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-768x561.png 768w\" sizes=\"auto, (max-width: 950px) 100vw, 950px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"553\" src=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-14-1024x553.png\" alt=\"\" class=\"wp-image-120\" srcset=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-14-1024x553.png 1024w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-14-300x162.png 300w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-14-768x414.png 768w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-14.png 1297w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">command: &#8220;<code>stat game<\/code>&#8221; shows game related stats<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"549\" src=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-15-1024x549.png\" alt=\"\" class=\"wp-image-121\" srcset=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-15-1024x549.png 1024w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-15-300x161.png 300w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-15-768x411.png 768w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-15.png 1299w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">stat scenerendering<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"549\" src=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-16-1024x549.png\" alt=\"\" class=\"wp-image-122\" srcset=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-16-1024x549.png 1024w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-16-300x161.png 300w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-16-768x412.png 768w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-16.png 1294w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">stat UObjects<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">Unreal insights<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For finding bottlenecks, look for CPU wait for tasks and in GPU gaps. Those will tell you how much this specific hardware is waiting.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"460\" height=\"234\" src=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-3.png\" alt=\"\" class=\"wp-image-90\" srcset=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-3.png 460w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-3-300x153.png 300w\" sizes=\"auto, (max-width: 460px) 100vw, 460px\" \/><figcaption class=\"wp-element-caption\">It&#8217;s not clearly visible here, but the game thread calculates a frame and in the next frame the rendering thread is rendering. So on the screen you see a frame that is already one frame old.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Useful things to do when profiling:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>test GPU load &#8211; change screen resolution  (r.screenpercentage 10)<\/li>\n\n\n\n<li>test CPU load &#8211; pause the game (pause)<\/li>\n\n\n\n<li>add more information to the profiling session: console command: &#8220;stat namedevents&#8221;<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-4-1024x550.png\" alt=\"\" class=\"wp-image-100\" srcset=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-4-1024x550.png 1024w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-4-300x161.png 300w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-4-768x413.png 768w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-4-1536x826.png 1536w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-4.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"562\" src=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-5-1024x562.png\" alt=\"\" class=\"wp-image-101\" srcset=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-5-1024x562.png 1024w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-5-300x165.png 300w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-5-768x421.png 768w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-5-1536x843.png 1536w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-5.png 1834w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">a console command &#8220;trace.screenshot &lt;name&gt;&#8221; can be used to create a screenshot bookmark in insights<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Tools -&gt; Audit -&gt; Statistics<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-6-1024x550.png\" alt=\"\" class=\"wp-image-105\" srcset=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-6-1024x550.png 1024w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-6-300x161.png 300w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-6-768x413.png 768w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-6-1536x826.png 1536w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-6.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">The statitics tool shows details of a scene. In this case, all 60 instances of SM_Dining_Tableware were selected<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">ProfileGPU<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is a console command that you type during the game and scene you want profiled.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"595\" src=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-7-1024x595.png\" alt=\"\" class=\"wp-image-107\" srcset=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-7-1024x595.png 1024w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-7-300x174.png 300w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-7-768x446.png 768w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-7-1536x892.png 1536w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-7.png 1766w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">When game is opened, open console and type command: <code>profilegpu<\/code> . This will freeze the game for several seconds and then open GPU visualizer window and print logs to console.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">There is a benchmark launch arguments to run a benchmark level right from windows <\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/dev.epicgames.com\/documentation\/en-us\/unreal-engine\/unreal-engine-command-line-arguments-reference\">https:\/\/dev.epicgames.com\/documentation\/en-us\/unreal-engine\/unreal-engine-command-line-arguments-reference<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">View modes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wireframe (shortcut F1)<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"846\" height=\"629\" src=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-11.png\" alt=\"\" class=\"wp-image-115\" srcset=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-11.png 846w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-11-300x223.png 300w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-11-768x571.png 768w\" sizes=\"auto, (max-width: 846px) 100vw, 846px\" \/><figcaption class=\"wp-element-caption\">Pink meshes are movable. Green enable physics<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Shader complexity<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"936\" height=\"637\" src=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-12.png\" alt=\"\" class=\"wp-image-116\" srcset=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-12.png 936w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-12-300x204.png 300w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-12-768x523.png 768w\" sizes=\"auto, (max-width: 936px) 100vw, 936px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Player collision<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"852\" height=\"639\" src=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-13.png\" alt=\"\" class=\"wp-image-117\" srcset=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-13.png 852w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-13-300x225.png 300w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-13-768x576.png 768w\" sizes=\"auto, (max-width: 852px) 100vw, 852px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">AB test<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">this command tests between two console command settings. Example <code>abtest r.screenpercentage 10 100<\/code> will test screen percentage 10% and 100% and provide rudimentary results<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code data-enlighter-language=\"generic\" class=\"EnlighterJSRAW\">LogConsoleResponse: Display: 13.8509ms ( 494 samples) A = 'r.screenpercentage 10'<br>LogConsoleResponse: Display: 18.4659ms ( 506 samples) B = 'r.screenpercentage 100'<br>LogConsoleResponse: Display: A is 4.6150ms faster than B; 0% chance this is noise.<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Workflow<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Console variables editor<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"820\" height=\"517\" src=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-17.png\" alt=\"\" class=\"wp-image-125\" srcset=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-17.png 820w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-17-300x189.png 300w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-17-768x484.png 768w\" sizes=\"auto, (max-width: 820px) 100vw, 820px\" \/><figcaption class=\"wp-element-caption\">It is a plugin, so it might need to be installed.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"687\" src=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-18-1024x687.png\" alt=\"\" class=\"wp-image-126\" srcset=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-18-1024x687.png 1024w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-18-300x201.png 300w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-18-768x515.png 768w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-18.png 1251w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Console variables editor can listen to all variable changes and show them. In this situation I&#8217;ve changed scalability from medium to high and the variables window populated with this info.<\/figcaption><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">Improving performance<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Significance Manager is a tool to work on level of detail of actors.<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"713\" src=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-19-1024x713.png\" alt=\"\" class=\"wp-image-129\" srcset=\"https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-19-1024x713.png 1024w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-19-300x209.png 300w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-19-768x535.png 768w, https:\/\/krzysztof.bobnis.eu\/wp-content\/uploads\/2025\/02\/image-19.png 1175w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">To turn on this stat: three dots in the top left corner -> Stat -> Advanced -> SignificanceManager<br>In this screen we the significance manager stats, it&#8217;s update, sort, register times<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Finding the performance bottleneck (CPU vs GPU) To properly test performance: Stat command Stat unitgraph Here&#8217;s how to enable it: Unreal insights For finding bottlenecks, look for CPU wait for tasks and in GPU gaps. Those will tell you how much this specific hardware is waiting. Useful things to do when profiling: Tools -&gt; Audit [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-81","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/krzysztof.bobnis.eu\/index.php\/wp-json\/wp\/v2\/posts\/81","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/krzysztof.bobnis.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/krzysztof.bobnis.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/krzysztof.bobnis.eu\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/krzysztof.bobnis.eu\/index.php\/wp-json\/wp\/v2\/comments?post=81"}],"version-history":[{"count":14,"href":"https:\/\/krzysztof.bobnis.eu\/index.php\/wp-json\/wp\/v2\/posts\/81\/revisions"}],"predecessor-version":[{"id":131,"href":"https:\/\/krzysztof.bobnis.eu\/index.php\/wp-json\/wp\/v2\/posts\/81\/revisions\/131"}],"wp:attachment":[{"href":"https:\/\/krzysztof.bobnis.eu\/index.php\/wp-json\/wp\/v2\/media?parent=81"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/krzysztof.bobnis.eu\/index.php\/wp-json\/wp\/v2\/categories?post=81"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/krzysztof.bobnis.eu\/index.php\/wp-json\/wp\/v2\/tags?post=81"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}