<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Z&#39;s Blog</title>
  <icon>https://en.imzlp.com/icon.png</icon>
  
  <link href="https://en.imzlp.com/atom.xml" rel="self"/>
  
  <link href="https://en.imzlp.com/"/>
  <updated>2026-02-13T09:42:27.000Z</updated>
  <id>https://en.imzlp.com/</id>
  
  <author>
    <name>LIPENGZHA</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Package size optimization: Solution for reusing old-version resources in UE</title>
    <link href="https://en.imzlp.com/posts/99122/"/>
    <id>https://en.imzlp.com/posts/99122/</id>
    <published>2026-02-13T09:42:27.000Z</published>
    <updated>2026-02-13T09:42:27.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;For game projects, we always want players to experience the latest version with minimal cost. This includes CDN costs during operation, as well as the bandwidth and time costs for players during downloads. Smaller, faster, and more efficient are our eternal pursuits.&lt;/p&gt;
&lt;p&gt;So, when a game update (what we call a &lt;strong&gt;major version&lt;/strong&gt; update) occurs, must players re-download the entire set of resources?&lt;br&gt;Large mobile games in the current market have massive resource sizes, often reaching 10+ GB. Requiring a full download for every update is a poor choice for both operational costs and user experience.&lt;br&gt;However, since players have the full resources of the previous version locally, we can significantly reduce the required download size by leveraging them. We need a mechanism to reuse old version resources!&lt;/p&gt;
&lt;p&gt;This article shares a resource reuse solution for major version updates based on this pain point, minimizing player downloads while ensuring ease of release and maintenance.&lt;br&gt;In actual live project operations, this has achieved &lt;strong&gt;excellent results&lt;/strong&gt;.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="HotPatcher" scheme="https://en.imzlp.com/tags/HotPatcher/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/tags/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>Build a Homelab server using an old laptop</title>
    <link href="https://en.imzlp.com/posts/54672/"/>
    <id>https://en.imzlp.com/posts/54672/</id>
    <published>2025-12-03T10:39:42.000Z</published>
    <updated>2025-12-12T10:50:00.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;I have an old laptop from 10 years ago that has been idle for several years. Recently, I tidied it up and repurposed it, deploying a Proxmox environment on the bare metal to turn it into a simple home Homelab server.&lt;br&gt;It runs Ubuntu and FnOS virtual machines, and with intranet penetration, it can be used as a long-term online VPS or to deploy a NAS system for backing up files and photos.&lt;/p&gt;
&lt;p&gt;This article will introduce the complete deployment solution for PVE + Virtual Machines + FRP intranet penetration + Nginx reverse proxy, which can securely expose local area network services for public domain access.&lt;/p&gt;</summary>
    
    
    
    <category term="Homelab" scheme="https://en.imzlp.com/categories/Homelab/"/>
    
    
    <category term="Docker" scheme="https://en.imzlp.com/tags/Docker/"/>
    
    <category term="硬件维修" scheme="https://en.imzlp.com/tags/%E7%A1%AC%E4%BB%B6%E7%BB%B4%E4%BF%AE/"/>
    
    <category term="PVE" scheme="https://en.imzlp.com/tags/PVE/"/>
    
  </entry>
  
  <entry>
    <title>Availability Analysis of UE5 Virtual Assets</title>
    <link href="https://en.imzlp.com/posts/6069/"/>
    <id>https://en.imzlp.com/posts/6069/</id>
    <published>2025-09-26T17:34:01.000Z</published>
    <updated>2025-09-26T17:34:01.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;随着游戏规模和资产精度的提升，以及Nanite等技术的应用，项目工程规模急剧膨胀，达到数百G乃至上T的量级，完整拉取的耗时可能数小时。&lt;br&gt;而每个人在实际开发中，能够用到的资源只占其中的一小部分，所以怎么样减少工程拉取量级，使工程轻量化是需要优化的问题。&lt;br&gt;在UE5中，官方推出了&lt;a href=&quot;https://dev.epicgames.com/documentation/en-us/unreal-engine/overview-of-virtual-assets-in-unreal-engine&quot;&gt;虚拟资产(VirtualAssets)&lt;/a&gt;机制，与P4结合能够做到这一点。&lt;/p&gt;
&lt;p&gt;本篇文章会介绍UE5中虚拟资产的配置流程、资产的虚拟化过程与加载代码分析，以及断网可用性的测试。&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="UE5" scheme="https://en.imzlp.com/tags/UE5/"/>
    
    <category term="VirtualAssets" scheme="https://en.imzlp.com/tags/VirtualAssets/"/>
    
  </entry>
  
  <entry>
    <title>UE Hot Update: Updateability and Security</title>
    <link href="https://en.imzlp.com/posts/66804/"/>
    <id>https://en.imzlp.com/posts/66804/</id>
    <published>2025-07-17T14:03:51.000Z</published>
    <updated>2025-07-17T14:03:51.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In the process of game development, hot update is a very important capability that allows us to update features and fix bugs without replacing the entire package. However, there aren’t many detailed articles currently introducing what can be hot-updated, what cannot, and what carries risks.&lt;/p&gt;
&lt;p&gt;In this article, I will introduce my thoughts on hot update capabilities and hot update security during the development of &lt;a href=&quot;https://imzlp.com/posts/17590/&quot;&gt;HotPatcher&lt;/a&gt; and project hot update practices. This ensures that the hot update capabilities and stability are guaranteed when the project goes online, and that it’s clear what can be hot-updated during the hot update iteration phase, allowing for a good assessment of update risks.&lt;br&gt;Additionally, by building peripheral capabilities, conducting risk assessments in advance, and automating the hot update process, only the version PM needs to control the patch construction and release timing, with no need for programmers to be involved in the hot update process at all.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/categories/UnrealEngine/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/tags/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>UE Plugin and Tools Development: Extensibility Support</title>
    <link href="https://en.imzlp.com/posts/27510/"/>
    <id>https://en.imzlp.com/posts/27510/</id>
    <published>2025-07-12T09:54:52.000Z</published>
    <updated>2025-07-12T09:54:52.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;When developing plugins, as plugin functionalities become increasingly complex, it’s often necessary to provide some extensibility support to implement custom extended features that enrich the plugin’s capabilities, and also to facilitate users in customizing projects without modifying the core program.&lt;br&gt;In previous articles (&lt;a href=&quot;https://imzlp.com/posts/30178/&quot;&gt;HotPatcher’s Modular Refactoring and Development Planning&lt;/a&gt;), the support for &lt;a href=&quot;https://imzlp.com/posts/17590/&quot;&gt;HotPatcher&lt;/a&gt; and extension modules, and how to develop a new module based on HotPatcher were introduced. This article primarily details the specific implementation methods within UE.&lt;/p&gt;
&lt;p&gt;Simply put, it means building one’s own extension system on top of UE’s existing plugin system. This article will introduce some of my thoughts and techniques on improving plugin extensibility, and how to conveniently decouple these extension features from the main plugin body for easier maintenance and management.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="插件开发" scheme="https://en.imzlp.com/categories/UnrealEngine/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="工具开发" scheme="https://en.imzlp.com/tags/%E5%B7%A5%E5%85%B7%E5%BC%80%E5%8F%91/"/>
    
    <category term="插件开发" scheme="https://en.imzlp.com/tags/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
    
    <category term="Plugins" scheme="https://en.imzlp.com/tags/Plugins/"/>
    
  </entry>
  
  <entry>
    <title>Encrypted Analysis and Special Protection of PAK in UE</title>
    <link href="https://en.imzlp.com/posts/88478/"/>
    <id>https://en.imzlp.com/posts/88478/</id>
    <published>2025-07-11T09:21:59.000Z</published>
    <updated>2025-07-11T09:21:59.000Z</updated>
    
    
      
      
        
        
    <summary type="html">&lt;h3 id=&quot;Runtime-Retrieval-of-Decryption-Key&quot;&gt;&lt;a href=&quot;#Runtime-Retrieval-of-Decryption-Key&quot; class=&quot;headerlink&quot; title=&quot;Runtime Retrieval of</summary>
        
      
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/categories/UnrealEngine/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/tags/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    <category term="Pak" scheme="https://en.imzlp.com/tags/Pak/"/>
    
    <category term="加密" scheme="https://en.imzlp.com/tags/%E5%8A%A0%E5%AF%86/"/>
    
    <category term="Encrypt" scheme="https://en.imzlp.com/tags/Encrypt/"/>
    
  </entry>
  
  <entry>
    <title>UE plug-in and tool development: Configurable Capabilities</title>
    <link href="https://en.imzlp.com/posts/2411/"/>
    <id>https://en.imzlp.com/posts/2411/</id>
    <published>2025-07-10T12:28:32.000Z</published>
    <updated>2025-07-10T12:28:32.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;When developing UE plugins, we often provide a large number of configurable parameters for flexible control, used to manage the specific execution logic and behavior of the plugins.&lt;/p&gt;
&lt;p&gt;This article is the eighth in my &lt;a href=&quot;https://imzlp.com/categories/UnrealEngine/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/&quot;&gt;UE Plugin Development Series&lt;/a&gt;, and will introduce my thoughts and implementations regarding the configurability of plugins during the development process, along with practices in project configuration, task configuration, dynamic parameter replacement, etc., to make the plugin configuration process as flexible and easy to use as possible.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="插件开发" scheme="https://en.imzlp.com/categories/UnrealEngine/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="插件开发" scheme="https://en.imzlp.com/tags/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
    
    <category term="Plugins" scheme="https://en.imzlp.com/tags/Plugins/"/>
    
  </entry>
  
  <entry>
    <title>Ultimate Optimization: Reducing the size of UE Android APKs</title>
    <link href="https://en.imzlp.com/posts/53079/"/>
    <id>https://en.imzlp.com/posts/53079/</id>
    <published>2025-02-25T09:44:43.000Z</published>
    <updated>2025-03-03T13:12:55.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In game projects, when we package for various platforms, we always hope that the package for each platform can be minimized for easier distribution, and there are specific size requirements for some platforms.&lt;/p&gt;
&lt;p&gt;For UE, it contains massive code and numerous plugins, and during the Build phase, it generates a lot of reflection glue code, resulting in a significant increase in code segments during compilation. Taking the Android platform as an example, this leads to a sharp increase in the size of libUE4.so, putting pressure on both the package size and runtime memory.&lt;/p&gt;
&lt;p&gt;Moreover, some necessary and additional resources brought in by the engine can take up hundreds of MB, making the size of an empty APK easily reach several hundred MB! Not only to meet the platform’s requirements, but it is also necessary to trim down the size of the UE package from the perspective of package size and memory optimization.&lt;/p&gt;
&lt;p&gt;This article will take Android as an example and introduce optimization ideas and practices for the cuttable parts in the UE package from various aspects, optimizing both the APK size and the runtime memory usage of native libraries. The strategies can also be reused on other platforms.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="Android" scheme="https://en.imzlp.com/tags/Android/"/>
    
  </entry>
  
  <entry>
    <title>UE hot update: Fault analysis of a resource anomaly</title>
    <link href="https://en.imzlp.com/posts/22890/"/>
    <id>https://en.imzlp.com/posts/22890/</id>
    <published>2024-10-17T17:30:19.000Z</published>
    <updated>2024-10-17T17:30:19.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Recently, I encountered an extremely bizarre bug involving two maps. One map, A, can be accessed with its PAK placed in the engine’s automatic mount directory, but it cannot be accessed from the hot update directory. The other map, B, behaves completely oppositely: it is abnormal in the automatic mount directory but works normally in the hot update directory.&lt;/p&gt;
&lt;p&gt;At first glance, the issue appears entirely elusive, with two mutually exclusive behaviors occurring within the same logical framework. Moreover, the hot update mount and the automatic mount only differ in timing and priority, so this problem shouldn’t theoretically exist.&lt;/p&gt;
&lt;p&gt;While the issue can ultimately be resolved on the business logic side, this behavior involves another very obscure path within the engine. Understanding why and how it works is crucial. Therefore, I analyzed the engine’s code based on this behavior, came to a reasonable conclusion, and devised a method to detect and mitigate this issue.&lt;/p&gt;
&lt;p&gt;This article assumes that readers have some basic knowledge of UE hot updates; if in doubt, please refer to other articles in this blog’s &lt;a href=&quot;https://imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/&quot;&gt;hot update series&lt;/a&gt; for more information.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/categories/UnrealEngine/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/categories/UnrealEngine/%E7%83%AD%E6%9B%B4%E6%96%B0/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="HotPatcher" scheme="https://en.imzlp.com/tags/HotPatcher/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/tags/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>Deploy a self-hosted MEMOS note system</title>
    <link href="https://en.imzlp.com/posts/30014/"/>
    <id>https://en.imzlp.com/posts/30014/</id>
    <published>2024-04-13T10:34:01.000Z</published>
    <updated>2024-04-13T10:34:01.000Z</updated>
    
    
    <summary type="html">&lt;!--- I insist on not relying on any centralized platform services. Once any platform faces profit and regulatory pressure, advertising and content review are inevitable. Moreover, I don&#39;t want to &quot;contribute&quot; my personal data to third-party platforms. ---&gt;
&lt;p&gt;For personal knowledge management, I am very keen on creating my own local-first and open source self-hosted services. This way, I can avoid relying on any platform, have complete autonomy over my data, and be able to migrate services at any time. Options like Obsidian, Hexo blog, and the &lt;a href=&quot;https://github.com/usememos/memos&quot;&gt;memos&lt;/a&gt; introduced in this article all meet these criteria.&lt;/p&gt;
&lt;p&gt;The protagonist of this article, &lt;a href=&quot;https://github.com/usememos/memos&quot;&gt;memos&lt;/a&gt;, is an open-source lightweight note-taking service that allows you to take notes in a way similar to posting on Weibo, supporting TAG marking and citations. It features an account system and permission management, allowing web access at any time, and notes can be public or private, offering great flexibility. I chose it because it complements Obsidian; Obsidian is still too heavy for my needs—it works well on PC but has a poor mobile experience. Thus, I need a lightweight, always-available note-taking service.&lt;/p&gt;
&lt;p&gt;This article will introduce how to deploy a Memos service on a VPS using Docker, along with Nginx to bind the domain name, Certbot to issue and automatically update SSL certificates, and regular backups of the memos database, as well as some optimization configurations I made for the service.&lt;/p&gt;</summary>
    
    
    
    <category term="知识管理" scheme="https://en.imzlp.com/categories/%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86/"/>
    
    <category term="MEMOS" scheme="https://en.imzlp.com/categories/%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86/MEMOS/"/>
    
    
    <category term="知识管理" scheme="https://en.imzlp.com/tags/%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86/"/>
    
    <category term="MEMOS" scheme="https://en.imzlp.com/tags/MEMOS/"/>
    
    <category term="Knowledge Management" scheme="https://en.imzlp.com/tags/Knowledge-Management/"/>
    
    <category term="Self-host" scheme="https://en.imzlp.com/tags/Self-host/"/>
    
    <category term="自托管服务" scheme="https://en.imzlp.com/tags/%E8%87%AA%E6%89%98%E7%AE%A1%E6%9C%8D%E5%8A%A1/"/>
    
  </entry>
  
  <entry>
    <title>Use HotPatcher to accelerate real device resource verification</title>
    <link href="https://en.imzlp.com/posts/76004/"/>
    <id>https://en.imzlp.com/posts/76004/</id>
    <published>2024-04-07T18:40:11.000Z</published>
    <updated>2024-04-07T18:40:11.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In previous articles, I primarily introduced how &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt; can be applied in the hot update process. However, &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt; is not just capable of fulfilling the needs for hot updates; it is also a flexible resource packaging framework.&lt;/p&gt;
&lt;p&gt;As the project development reaches a certain stage, a massive amount of resources needs to be packaged, and waiting for a complete package to be built can take a long time. If a real device encounters issues, the serial process of &lt;strong&gt;repair -&amp;gt; package -&amp;gt; verify&lt;/strong&gt; can become exceedingly lengthy. There are often cases of script, data, or other resource errors that lead to package abnormalities.&lt;br&gt;&lt;img src=&quot;https://img.imzlp.com/imgs/zlp/picgo/2024/04/07/182636.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;In such cases, waiting hours to generate a complete package prevents smoke testing from proceeding. Even if you rebuild the package, there’s no guarantee that there won’t be other overlooked issues; otherwise, you have to start over again.&lt;br&gt;&lt;img src=&quot;https://img.imzlp.com/imgs/zlp/picgo/2024/04/07/161430.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Based on this pain point, we urgently need a method to quickly fix resource issues within packages and validate them during the development phase. &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt; provides this functionality, allowing you to utilize it fully without waiting for a complete package.&lt;/p&gt;
&lt;p&gt;This article will introduce how to utilize the editor features provided by HotPatcher to quickly package preset configurations and specific resources, accelerating the validation process of resources on real devices and significantly improving testing efficiency.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/categories/UnrealEngine/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    <category term="HotPatcher" scheme="https://en.imzlp.com/categories/UnrealEngine/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/HotPatcher/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="HotPatcher" scheme="https://en.imzlp.com/tags/HotPatcher/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/tags/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>Open source: HotPatcher development progress</title>
    <link href="https://en.imzlp.com/posts/16808/"/>
    <id>https://en.imzlp.com/posts/16808/</id>
    <published>2024-04-07T10:01:40.000Z</published>
    <updated>2026-05-08T18:49:00.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;It’s been more than half a year since the last version of &lt;a href=&quot;https://github.com/hxhb/HotPatcher/&quot;&gt;HotPatcher&lt;/a&gt; was released. It has good support for UE4, but lacks support for UE5, and many people in the group frequently ask about the adaptation status.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The last Release version of HotPatcher, &lt;a href=&quot;https://github.com/hxhb/HotPatcher/releases/tag/v81.0&quot;&gt;v81.0&lt;/a&gt;, was released on 20230604. It only supported UE5.1.0 and did not support WP and Nanite. Subsequently, Epic launched UE5.2 and 5.3, but the plugin was not adapted. Although compilation errors could be fixed manually, the feature support in UE5 was in a semi-finished state.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Taking advantage of the Qingming Festival holiday, I worked hard for several days, performing comprehensive optimization and adaptation support for HotPatcher. It can now be compatible with the latest versions from UE4.21 to UE5, and a new Release version has been published: &lt;a href=&quot;https://github.com/hxhb/HotPatcher/releases/tag/v82.0&quot;&gt;v82.0&lt;/a&gt;. The latter part of this article will introduce the adaptation status, precautions, and update log of &lt;a href=&quot;https://github.com/hxhb/HotPatcher/&quot;&gt;HotPatcher&lt;/a&gt; in UE5.&lt;br&gt;&lt;img src=&quot;https://img.imzlp.com/imgs/zlp/picgo/2024/04/06/171019.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Additionally, in 2020, I wrote an article: &lt;a href=&quot;https://imzlp.com/posts/8890/&quot;&gt;Some Thoughts and Ideas on Open Source&lt;/a&gt;. Over the past two years, I’ve had some new ideas about maintaining open-source projects, which I’ll summarize here.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/categories/UnrealEngine/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    <category term="HotPatcher" scheme="https://en.imzlp.com/categories/UnrealEngine/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/HotPatcher/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="HotPatcher" scheme="https://en.imzlp.com/tags/HotPatcher/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/tags/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>Repair your broken iPhone</title>
    <link href="https://en.imzlp.com/posts/27221/"/>
    <id>https://en.imzlp.com/posts/27221/</id>
    <published>2024-03-01T14:45:08.000Z</published>
    <updated>2024-05-08T15:32:00.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;During the New Year’s holiday, my iPhone 12 dropped and caused some malfunctions, making it barely usable. However, recently the battery also swelled and it easily shut down automatically, rendering it completely unusable. After switching to a backup phone, it was set aside for a while.&lt;/p&gt;
&lt;p&gt;I recently thought of it again, as it could still power on normally and most of its main functions could still operate, so I speculated that it was only partially faulty and not completely damaged. It would be a pity to completely scrap it, and it seems I can only swap it for a stainless steel basin.&lt;/p&gt;
&lt;p&gt;I took it apart to analyze the cause of the faults and attempted to buy parts for repair. This article documents the disassembly and resolution process.&lt;/p&gt;</summary>
    
    
    
    <category term="循迹研究" scheme="https://en.imzlp.com/categories/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="数码" scheme="https://en.imzlp.com/categories/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/%E6%95%B0%E7%A0%81/"/>
    
    <category term="硬件维修" scheme="https://en.imzlp.com/categories/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/%E6%95%B0%E7%A0%81/%E7%A1%AC%E4%BB%B6%E7%BB%B4%E4%BF%AE/"/>
    
    
    <category term="循迹研究" scheme="https://en.imzlp.com/tags/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="数码" scheme="https://en.imzlp.com/tags/%E6%95%B0%E7%A0%81/"/>
    
    <category term="硬件维修" scheme="https://en.imzlp.com/tags/%E7%A1%AC%E4%BB%B6%E7%BB%B4%E4%BF%AE/"/>
    
  </entry>
  
  <entry>
    <title>Macau Travel Guide</title>
    <link href="https://en.imzlp.com/posts/35791/"/>
    <id>https://en.imzlp.com/posts/35791/</id>
    <published>2024-02-15T15:35:31.000Z</published>
    <updated>2024-02-15T15:35:31.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;This year, I plan to celebrate the Spring Festival in Shenzhen and the next stop for my Greater Bay Area trip is Macau. Traveling from Shenzhen to Macau is relatively convenient, so I am making arrangements for the trip. I’ve done some research and itinerary planning that can serve as a reference for those visiting Macau for the first time.&lt;/p&gt;</summary>
    
    
    
    <category term="循迹旅行" scheme="https://en.imzlp.com/categories/%E5%BE%AA%E8%BF%B9%E6%97%85%E8%A1%8C/"/>
    
    <category term="大湾区" scheme="https://en.imzlp.com/categories/%E5%BE%AA%E8%BF%B9%E6%97%85%E8%A1%8C/%E5%A4%A7%E6%B9%BE%E5%8C%BA/"/>
    
    
    <category term="循迹旅行" scheme="https://en.imzlp.com/tags/%E5%BE%AA%E8%BF%B9%E6%97%85%E8%A1%8C/"/>
    
    <category term="大湾区" scheme="https://en.imzlp.com/tags/%E5%A4%A7%E6%B9%BE%E5%8C%BA/"/>
    
    <category term="澳门" scheme="https://en.imzlp.com/tags/%E6%BE%B3%E9%97%A8/"/>
    
    <category term="Macau" scheme="https://en.imzlp.com/tags/Macau/"/>
    
  </entry>
  
  <entry>
    <title>Use reflection to create properties cache for assets in UE</title>
    <link href="https://en.imzlp.com/posts/71162/"/>
    <id>https://en.imzlp.com/posts/71162/</id>
    <published>2023-10-25T15:27:37.000Z</published>
    <updated>2023-10-25T15:27:37.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In the previous article &lt;a href=&quot;https://imzlp.com/posts/19901/&quot;&gt;Design and Implementation of Resource Self-Correction in UE&lt;/a&gt;, I introduced the implementation plan of filtering using the asset inspection of ResScannerUE, followed by automated processing.&lt;/p&gt;
&lt;p&gt;Normally, if you want to check a certain property within a resource, you need to load the asset and retrieve the object:&lt;br&gt;&lt;img src=&quot;https://img.imzlp.com/imgs/zlp/picgo/2023/10/24/105204.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;However, if you want to check the properties of many resources in bulk, loading resources one by one in this way takes a long time, especially in the absence of DDC, where loading resources triggers the construction of DDC cache, which is time-consuming and has a high performance overhead.&lt;/p&gt;
&lt;p&gt;As the size of the assets increases, scanning all resources in a project completely can be extraordinarily time-consuming. Therefore, I wonder if it’s possible to implement a method that does not require loading resources but can still retrieve properties within resources.&lt;/p&gt;
&lt;p&gt;After research, I found a clever way to achieve this by combining reflection, asset serialization, and the features of AssetRegistry. Moreover, this is a non-intrusive approach that does not require modifying any existing resource type code.&lt;/p&gt;
&lt;p&gt;This article will introduce the implementation principles and analyze the related logic in the engine, as well as present the practical application of this mechanism in the project.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/categories/UnrealEngine/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="反射" scheme="https://en.imzlp.com/tags/%E5%8F%8D%E5%B0%84/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/tags/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    <category term="ResScanner" scheme="https://en.imzlp.com/tags/ResScanner/"/>
    
    <category term="AssetRegistry" scheme="https://en.imzlp.com/tags/AssetRegistry/"/>
    
  </entry>
  
  <entry>
    <title>Implementation scheme of resource self-correction in UE</title>
    <link href="https://en.imzlp.com/posts/19901/"/>
    <id>https://en.imzlp.com/posts/19901/</id>
    <published>2023-10-18T14:45:12.000Z</published>
    <updated>2023-10-18T14:45:12.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In a previous article, I introduced the implementation and efficiency optimization of &lt;strong&gt;multi-stage&lt;/strong&gt; and &lt;strong&gt;automated&lt;/strong&gt; resource checks using ResScannerUE in UE.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/22655&quot;&gt;Multistage Automated Resource Check Solutions in UE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/20376/&quot;&gt;Automated Resource Check Practices Based on ResScannerUE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/11750&quot;&gt;Resource Compliance Check Tool ResScannerUE in UE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This already allows for very flexible configuration of resource checks and timely alerts, with very powerful rule expression capabilities. However, they are still limited to the stage of &lt;strong&gt;discovering problems&lt;/strong&gt; for reminders; although there are constraints to prevent submission, manual processing is still required. Especially in cases with a large amount of existing resources, the manpower involved in manual processing is very time-consuming.&lt;br&gt;&lt;img src=&quot;https://img.imzlp.com/imgs/zlp/picgo/2023/202310181358828.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;Based on this situation, I designed a mechanism for automating resource corrections that can automatically fix resources after rules are established, ensuring that all scanned resources are set to the correct state.&lt;br&gt;&lt;img src=&quot;https://img.imzlp.com/imgs/zlp/picgo/2023/202310131604358.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;This completes the final piece of the puzzle in my resource check solution and can be applied throughout the scanning process as needed. This article will introduce its design concept and implementation mechanism, as well as some practical application scenarios in projects.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/categories/UnrealEngine/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/tags/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    <category term="ResScanner" scheme="https://en.imzlp.com/tags/ResScanner/"/>
    
  </entry>
  
  <entry>
    <title>UE plug-in and tool development:j2 design ideas and implementation</title>
    <link href="https://en.imzlp.com/posts/86105/"/>
    <id>https://en.imzlp.com/posts/86105/</id>
    <published>2023-10-14T20:23:37.000Z</published>
    <updated>2023-10-14T20:23:37.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;If I had to choose one recent experience in working with UE that felt the most meaningless and torturous, it would definitely be trying to find a resource in the ContentBrowser based on a long string path.&lt;/p&gt;
&lt;p&gt;The inability to quickly jump directly to a directory or resource makes me feel like I’m wasting my life every time I have to navigate deeply nested folders one step at a time.&lt;/p&gt;
&lt;p&gt;To address this pain point, I wrote a small tool that significantly alleviates this manual anxiety. I named it &lt;code&gt;j2&lt;/code&gt; (jump to), which is a minimalist ContentBrowser jump tool, open-source on GitHub: &lt;a href=&quot;https://github.com/hxhb/JumpTo&quot;&gt;hxhb/JumpTo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This article will introduce the usage of this project, the thought process behind conceptualizing the solution, and the step-by-step code implementation. Although the functionality itself is a very simple plugin, the discovery, analysis, and solution process for the actual pain points is worth documenting.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="插件开发" scheme="https://en.imzlp.com/categories/UnrealEngine/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="插件开发" scheme="https://en.imzlp.com/tags/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>Build a knowledge management system based on Obsidian</title>
    <link href="https://en.imzlp.com/posts/30911/"/>
    <id>https://en.imzlp.com/posts/30911/</id>
    <published>2023-09-07T16:19:40.000Z</published>
    <updated>2023-09-26T10:42:58.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In 2020, I wrote an article &lt;a href=&quot;https://imzlp.com/posts/29551/&quot;&gt;How to Build Your Own Knowledge System?&lt;/a&gt;, which mainly reflects on the daily accumulation of technology, leaning towards methodology.&lt;/p&gt;
&lt;p&gt;This article will explore the possibilities of personal knowledge management from the perspective of tools and practical use, based on &lt;a href=&quot;https://obsidian.md/&quot;&gt;Obsidian&lt;/a&gt;, and attempt to integrate it with the Hexo blog. Of course, this preference for tools and practices has a strong subjectivity; this article is entirely based on my personal practice and experience; &lt;strong&gt;there is no best tool, only the one that suits you best.&lt;/strong&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="知识管理" scheme="https://en.imzlp.com/categories/%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86/"/>
    
    <category term="Obsidian" scheme="https://en.imzlp.com/categories/%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86/Obsidian/"/>
    
    
    <category term="Hexo" scheme="https://en.imzlp.com/tags/Hexo/"/>
    
    <category term="博客管理" scheme="https://en.imzlp.com/tags/%E5%8D%9A%E5%AE%A2%E7%AE%A1%E7%90%86/"/>
    
    <category term="Obsidian" scheme="https://en.imzlp.com/tags/Obsidian/"/>
    
    <category term="知识管理" scheme="https://en.imzlp.com/tags/%E7%9F%A5%E8%AF%86%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>Hong Kong Travel Guide</title>
    <link href="https://en.imzlp.com/posts/31438/"/>
    <id>https://en.imzlp.com/posts/31438/</id>
    <published>2023-08-21T09:37:37.000Z</published>
    <updated>2023-09-01T09:50:12.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Shenzhen and Hong Kong are separated by just a river. Although I had long planned to visit Hong Kong, I was unable to do so for the past two to three years due to the pandemic. Now that the pandemic restrictions have eased this year, passing between Hong Kong and the mainland has also become relatively convenient, so I’ve included a trip to Hong Kong in my schedule.&lt;/p&gt;
&lt;p&gt;I went to Hong Kong for a weekend trip with my wife. Before we went, I made some travel plans and arrangements that can serve as a reference for first-time travelers to Hong Kong.&lt;/p&gt;</summary>
    
    
    
    <category term="循迹旅行" scheme="https://en.imzlp.com/categories/%E5%BE%AA%E8%BF%B9%E6%97%85%E8%A1%8C/"/>
    
    <category term="大湾区" scheme="https://en.imzlp.com/categories/%E5%BE%AA%E8%BF%B9%E6%97%85%E8%A1%8C/%E5%A4%A7%E6%B9%BE%E5%8C%BA/"/>
    
    
    <category term="循迹旅行" scheme="https://en.imzlp.com/tags/%E5%BE%AA%E8%BF%B9%E6%97%85%E8%A1%8C/"/>
    
    <category term="大湾区" scheme="https://en.imzlp.com/tags/%E5%A4%A7%E6%B9%BE%E5%8C%BA/"/>
    
    <category term="香港" scheme="https://en.imzlp.com/tags/%E9%A6%99%E6%B8%AF/"/>
    
    <category term="HongKong" scheme="https://en.imzlp.com/tags/HongKong/"/>
    
  </entry>
  
  <entry>
    <title>UE build improvement: optimize the implementation of remote build IOS</title>
    <link href="https://en.imzlp.com/posts/50293/"/>
    <id>https://en.imzlp.com/posts/50293/</id>
    <published>2023-08-16T10:43:50.000Z</published>
    <updated>2023-09-05T20:11:12.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Remote building is a very convenient way to package iOS in UE, allowing code compilation only on a Mac without COOKing resources, which greatly reduces the hardware requirements for Mac.&lt;/p&gt;
&lt;p&gt;Moreover, Macs are quite expensive. In a traditional setup, if multiple independent iOS package build processes are needed, it usually requires purchasing several separate Mac machines for deployment, leading to high hardware costs.&lt;/p&gt;
&lt;p&gt;Additionally, the iOS development environment often needs to be updated with iOS system iterations. Every year at WWDC, a new version of iOS is released, requiring support from the latest XCode, which in turn depends on the latest MacOS—a nested chain of dependencies. If the number of Mac build environments increases, updating the build environments of these machines also becomes a cumbersome repetitive task.&lt;/p&gt;
&lt;p&gt;Remote building for iOS can effectively solve this issue. A single independent Mac can simultaneously support multiple iOS build processes, and if an update is needed, it only needs to be handled on one machine. Furthermore, the time it takes to compile code is relatively fixed, and incremental compilation can be performed. In theory, as long as not all machines execute a full compilation at the same time, the performance pressure on the Mac won’t be that great.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.imzlp.com/imgs/zlp/picgo/2023/20230816154208.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;There are also articles on enabling remote building for iOS in the blog: &lt;a href=&quot;https://imzlp.com/posts/1948/#%E8%BF%9C%E7%A8%8B%E6%9E%84%E5%BB%BAiOS&quot;&gt;UE Development Notes: Mac/iOS Edition&lt;/a&gt;, which can be referred to for basic configuration.&lt;/p&gt;
&lt;p&gt;However, the default implementation of iOS remote building in UE also presents several issues in actual use, failing to achieve a fully automated process from deployment to building. This article aims to optimize the pain points of remote building in real project applications.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="BuildSystem" scheme="https://en.imzlp.com/categories/UnrealEngine/BuildSystem/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="BuildSystem" scheme="https://en.imzlp.com/tags/BuildSystem/"/>
    
  </entry>
  
  <entry>
    <title>Using AI to help with daily life and development exploration</title>
    <link href="https://en.imzlp.com/posts/71467/"/>
    <id>https://en.imzlp.com/posts/71467/</id>
    <published>2023-04-24T17:01:46.000Z</published>
    <updated>2023-04-24T17:01:46.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;&lt;strong&gt;To do a good job, one must first sharpen their tools!&lt;/strong&gt; AIGC tools represented by ChatGPT and Stable Diffusion have emerged, and the AI wave is sweeping across various industries. As developers, how to leverage AI capabilities to improve efficiency in tasks is a question worth studying.&lt;/p&gt;
&lt;p&gt;It is crucial to note that the content generated by GPT may not be entirely accurate and can contain inaccuracies. However, its potential lies in the possibility of achieving a general-purpose AI assistant. No one can possess expert-level knowledge in all fields, but effectively utilizing GPT in unfamiliar domains can significantly lower the entry costs.&lt;/p&gt;
&lt;p&gt;In this article, I will introduce some cases of using GPT to assist in work, life, and learning, as well as explore application scenarios for secondary development using the GPT API. At the end of the article, I will share some Prompts I use and recommend some useful GPT tools, as well as a solution for encapsulating Azure OpenAI services using Cloudflare Worker.&lt;/p&gt;</summary>
    
    
    
    <category term="随笔" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="循迹研究" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="AI" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/AI/"/>
    
    
    <category term="随笔" scheme="https://en.imzlp.com/tags/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="循迹研究" scheme="https://en.imzlp.com/tags/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="AI" scheme="https://en.imzlp.com/tags/AI/"/>
    
    <category term="GPT" scheme="https://en.imzlp.com/tags/GPT/"/>
    
    <category term="OpenAI" scheme="https://en.imzlp.com/tags/OpenAI/"/>
    
  </entry>
  
  <entry>
    <title>DevOps: CI/CD Practices for Unreal Engine</title>
    <link href="https://en.imzlp.com/posts/96336/"/>
    <id>https://en.imzlp.com/posts/96336/</id>
    <published>2023-04-15T14:30:56.000Z</published>
    <updated>2023-04-15T14:30:56.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;DevOps is a philosophy based on automation for Continuous Integration (CI) and Continuous Deployment (CD), optimizing all aspects of development, testing, and operations. It emphasizes the integration of software development, testing, and operations, reducing communication costs between departments or processes to achieve rapid and high-quality releases and iterations.&lt;/p&gt;
&lt;p&gt;Although the development situation in the gaming field differs significantly from traditional internet development, leveraging the concept of DevOps to integrate all production elements of a project into automation can greatly enhance efficiency.&lt;/p&gt;
&lt;p&gt;This article will introduce the basic concepts of automation in UE and share some of my attempts and actual engineering practices regarding automation builds in Unreal Engine.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="DevOps" scheme="https://en.imzlp.com/categories/UnrealEngine/DevOps/"/>
    
    <category term="CI/CD" scheme="https://en.imzlp.com/categories/UnrealEngine/DevOps/CI-CD/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="CI/CD" scheme="https://en.imzlp.com/tags/CI-CD/"/>
    
    <category term="DevOps" scheme="https://en.imzlp.com/tags/DevOps/"/>
    
  </entry>
  
  <entry>
    <title>Finding Certainty in a Complex World</title>
    <link href="https://en.imzlp.com/posts/83875/"/>
    <id>https://en.imzlp.com/posts/83875/</id>
    <published>2023-04-08T14:10:39.000Z</published>
    <updated>2023-04-08T14:10:39.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Recently, there is often a strange sense of anxiety. After a period of self-observation and reflection, I believe it is necessary to confront these issues and attempt to provide answers.&lt;/p&gt;
&lt;p&gt;This article is a thought experiment that examines and analyzes the current state of life and its problems, summarizing the ideological tools for guiding life and work. As a personal methodology, it contains a large amount of subjective content.&lt;/p&gt;</summary>
    
    
    
    <category term="随笔" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="循迹研究" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="方法论" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/%E6%96%B9%E6%B3%95%E8%AE%BA/"/>
    
    
    <category term="随笔" scheme="https://en.imzlp.com/tags/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="循迹研究" scheme="https://en.imzlp.com/tags/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="方法论" scheme="https://en.imzlp.com/tags/%E6%96%B9%E6%B3%95%E8%AE%BA/"/>
    
  </entry>
  
  <entry>
    <title>Unreal Resource Management: A raw uasset Encryption Scheme</title>
    <link href="https://en.imzlp.com/posts/32412/"/>
    <id>https://en.imzlp.com/posts/32412/</id>
    <published>2023-04-07T12:50:04.000Z</published>
    <updated>2023-04-07T12:50:04.000Z</updated>
    
    
    <summary type="html">&lt;!-- ![](https://img.imzlp.com/imgs/zlp/picgo/2023/20230407125507.webp) --&gt;
&lt;p&gt;In game project development, a large number of developers from various aspects such as development, art, planning, and outsourcing will be involved. For reasons of resource security and information confidentiality, complex permission controls and synchronization logic are usually implemented.&lt;/p&gt;
&lt;p&gt;However, leaving aside permission control and focusing on the resources themselves, in UE, resources are upward compatible, meaning resources can be opened directly with the same version engine or a higher version engine. This means that distributed resources can be used directly in other projects. Therefore, ensuring the security of resources during the development phase is a key focus.&lt;/p&gt;
&lt;p&gt;This article provides an idea for encrypting the original UASSET resources in the project and introduces the basic principles that can be used for resource encryption. However, publicly disclosing the specific encryption implementation would be akin to running naked, so this article will only provide an analysis of the uasset resource structure and ideas for implementing encryption, but will not provide specific implementation code.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/categories/UnrealEngine/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/tags/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    <category term="加密" scheme="https://en.imzlp.com/tags/%E5%8A%A0%E5%AF%86/"/>
    
  </entry>
  
  <entry>
    <title>UE plug-in and tool development:Commandlet</title>
    <link href="https://en.imzlp.com/posts/27475/"/>
    <id>https://en.imzlp.com/posts/27475/</id>
    <published>2023-03-23T13:46:03.000Z</published>
    <updated>2023-03-23T13:46:03.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;When using the Unreal Engine development tool, a significant number of tasks involve resource processing and data export needs. These tasks need to be performed frequently and automatically, often integrated into a CI/CD system.&lt;/p&gt;
&lt;p&gt;In the specific implementation, the &lt;code&gt;Commandlet&lt;/code&gt; mechanism of UE is utilized to drive the engine in a command-line manner, performing custom behaviors.&lt;/p&gt;
&lt;p&gt;Taking the Commandlet features supported in the plugin I developed as an example:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/10938/&quot;&gt;HotPatcher&lt;/a&gt;: Export basic package information, pack patches&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/22655/&quot;&gt;ResScannerUE&lt;/a&gt;: Incremental scanning of changed resources&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/24350/&quot;&gt;HotChunker&lt;/a&gt;: Standalone packaging of Chunk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/26943/&quot;&gt;libZSTD&lt;/a&gt;: Training Shader dictionaries&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/20203/&quot;&gt;ExportNavMesh&lt;/a&gt;: Export NavMesh data&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Commandlet allows for easier integration into CI/CD to achieve automation.&lt;/p&gt;
&lt;p&gt;In this article, I will primarily introduce the Commandlet mechanism of UE, analyze its implementation principles, and provide some development tips and insights from my development process.&lt;/p&gt;
&lt;p&gt;Additionally, this is the second article in my &lt;a href=&quot;https://imzlp.com/categories/UnrealEngine/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/&quot;&gt;UE Plugin and Tool Development&lt;/a&gt; series, which will continue to be updated, so stay tuned.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="插件开发" scheme="https://en.imzlp.com/categories/UnrealEngine/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="插件开发" scheme="https://en.imzlp.com/tags/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>Resource Management: Reshaping UnrealEngine Subcontracting Solution</title>
    <link href="https://en.imzlp.com/posts/37036/"/>
    <id>https://en.imzlp.com/posts/37036/</id>
    <published>2023-03-15T11:24:32.000Z</published>
    <updated>2023-03-15T11:24:32.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;I previously wrote an article introducing UE’s default unpacking method (&lt;a href=&quot;https://imzlp.com/posts/13765/&quot;&gt;UE Hot Update: Splitting the Base Package&lt;/a&gt;), but the default unpacking method in UE is not flexible enough for large-scale resource projects and cannot meet the refined management needs of super-large-scale resource projects.&lt;/p&gt;
&lt;p&gt;To address the issues with &lt;a href=&quot;https://imzlp.com/posts/37036/#UE%E9%BB%98%E8%AE%A4%E6%89%93%E5%8C%85%E7%9A%84%E9%97%AE%E9%A2%98&quot;&gt;UE’s default packaging and resource splitting pain points&lt;/a&gt;, I developed an extension based on HotPatcherCore that can solve the drawbacks of the default unpacking process, making it sufficiently flexible and powerful. There’s an article on the blog that introduces its overall implementation mechanism: &lt;a href=&quot;https://imzlp.com/posts/24350/&quot;&gt;A Flexible and Non-Intrusive Base Package Splitting Solution&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;HotChunker can be integrated into UE’s default packaging process non-intrusively, requiring no manual handling. As long as the default UE packaging is done, it will automatically trigger HotChunker’s unpacking process, achieving resource cooking, packaging, and automatic copying to the StagedBuilds directory.&lt;/p&gt;
&lt;p&gt;This article will focus on how to configure resource splitting using HotChunker, automate builds, minimize resource redundancy, and implement parallel packaging.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/categories/UnrealEngine/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/tags/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>Memory Expansion: Utilize new memory features of IOS in UE</title>
    <link href="https://en.imzlp.com/posts/56381/"/>
    <id>https://en.imzlp.com/posts/56381/</id>
    <published>2023-01-31T10:37:38.000Z</published>
    <updated>2023-01-31T10:37:38.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Memory optimization is a frequent focus in game development. To avoid excessive memory allocation that triggers an OOM (Out of Memory) to be forcibly terminated by the system, common optimization methods typically start from the usage perspective, enhancing memory utilization efficiency by trimming unnecessary features and controlling resource loading.&lt;/p&gt;
&lt;p&gt;However, there is another approach to increase the threshold for triggering OOM, allowing the system to permit our app to allocate more memory. In the new iOS versions, Apple has introduced new memory features for apps, allowing them to extend addressable space and increase allocatable memory.&lt;/p&gt;
&lt;p&gt;In this article, I will explore how to leverage these features in UE to enhance the total allocatable memory for games on the iOS platform.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="内存优化" scheme="https://en.imzlp.com/categories/UnrealEngine/%E5%86%85%E5%AD%98%E4%BC%98%E5%8C%96/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="Profiling" scheme="https://en.imzlp.com/tags/Profiling/"/>
    
    <category term="内存优化" scheme="https://en.imzlp.com/tags/%E5%86%85%E5%AD%98%E4%BC%98%E5%8C%96/"/>
    
    <category term="Memory" scheme="https://en.imzlp.com/tags/Memory/"/>
    
    <category term="IOS" scheme="https://en.imzlp.com/tags/IOS/"/>
    
  </entry>
  
  <entry>
    <title>UE plug-in and tool development: basic concepts</title>
    <link href="https://en.imzlp.com/posts/75405/"/>
    <id>https://en.imzlp.com/posts/75405/</id>
    <published>2023-01-29T12:12:55.000Z</published>
    <updated>2023-01-29T12:12:55.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;During the process of project development using Unreal Engine, various types of plugins are often developed and integrated to extend the engine, thereby fulfilling different requirements. For developers, understanding the operational mechanism is more important than using the tools. Thus, it is necessary to understand the principles behind the integration and development of plugins.&lt;/p&gt;
&lt;p&gt;Previously, I also developed some tools and plugins for UE, and I hope to write a series of related articles summarizing the common technical content related to UE plugin and tool development and sharing some of my thoughts and functional scaffolding during plugin development. The goal is to achieve the desired functionality with minimal code, minimal invasiveness, and the best implementation strategies.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="插件开发" scheme="https://en.imzlp.com/categories/UnrealEngine/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="插件开发" scheme="https://en.imzlp.com/tags/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
    
    <category term="Tools" scheme="https://en.imzlp.com/tags/Tools/"/>
    
    <category term="Plugins" scheme="https://en.imzlp.com/tags/Plugins/"/>
    
  </entry>
  
  <entry>
    <title>HotPatcher Modular Transformation and Development Planning</title>
    <link href="https://en.imzlp.com/posts/30178/"/>
    <id>https://en.imzlp.com/posts/30178/</id>
    <published>2023-01-07T11:25:54.000Z</published>
    <updated>2023-01-07T11:25:54.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;With the development of &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt; and my research on resource management technology, more and more features are being implemented around &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt;, and the implementation is becoming increasingly complex. Coupled with continuous updates of the engine, maintaining compatibility for a large and comprehensive plugin has become more difficult.&lt;/p&gt;
&lt;p&gt;With the arrival of the new generation engine UE5, &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt; will also follow up with support for UE5 and develop new features based on UE5’s characteristics. I hope it will not only be a resource packaging tool but also include a comprehensive resource management solution encompassing resource management, auditing, packaging, hot updates, package optimization, and build enhancements, and serve as an open resource processing framework.&lt;br&gt;&lt;img src=&quot;https://img.imzlp.com/imgs/zlp/picgo/2022/202301071731545.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;This article will introduce the modular progress of &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt;, support for existing features, and how to use the powerful packaging capability of &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt; to customize modular extensions based on project needs. Finally, I will discuss the future development plans for the &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt; project.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/categories/UnrealEngine/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    <category term="HotPatcher" scheme="https://en.imzlp.com/categories/UnrealEngine/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/HotPatcher/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/categories/UnrealEngine/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/HotPatcher/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="HotPatcher" scheme="https://en.imzlp.com/tags/HotPatcher/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/tags/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>2022 Unreal Open Day</title>
    <link href="https://en.imzlp.com/posts/10975/"/>
    <id>https://en.imzlp.com/posts/10975/</id>
    <published>2022-11-20T10:04:57.000Z</published>
    <updated>2022-11-20T10:04:57.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;The Unreal Open Day 2022 was hosted by Epic in the form of an offline event combined with online live streaming. I am very happy to have attended the offline Unreal Open Day event this year. I recorded an online technical presentation and also participated in the live event in Shanghai. I am honored to have once again received the &lt;strong&gt;Outstanding Community Contributor&lt;/strong&gt; award granted by Epic, which is both recognition and motivation for me. I look forward to the UE tech community continuing to grow and becoming the most vibrant game developer community. This article serves as a simple record, organizing the materials from UOD 2022, summarizing my participation in UOD, my presentation PPT, and related materials, as well as some photos taken at the UOD live event.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="UOD" scheme="https://en.imzlp.com/categories/UnrealEngine/UOD/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="UOD" scheme="https://en.imzlp.com/tags/UOD/"/>
    
    <category term="UnrelOpenDay" scheme="https://en.imzlp.com/tags/UnrelOpenDay/"/>
    
  </entry>
  
  <entry>
    <title>A Flexible and Non-Intrusive Basic Package Splitting Scheme</title>
    <link href="https://en.imzlp.com/posts/24350/"/>
    <id>https://en.imzlp.com/posts/24350/</id>
    <published>2022-10-23T15:20:00.000Z</published>
    <updated>2022-10-23T15:20:00.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;UE’s default resource management is relatively complex. By default, the resource packaging process is executed based on the configurations of maps, directories, and PrimaryAsset specified in &lt;code&gt;ProjectSetting&lt;/code&gt;, as well as a combination of condition checks. Furthermore, UE’s Cook dynamically adds resources to the package based on runtime loading, making the resource packaging process almost a black box.&lt;/p&gt;
&lt;p&gt;The blog introduces articles on &lt;strong&gt;default resource packaging rules&lt;/strong&gt; and &lt;strong&gt;basic package splitting&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/22570/&quot;&gt;UE Resource Management: Engine Packaging Resource Analysis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/13765/&quot;&gt;UE Hot Update: Splitting Basic Packages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This article presents a new idea, utilizing &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt;‘s precise Cook and packaging mechanism to implement a HotChunker Mod that can perform &lt;strong&gt;non-intrusive&lt;/strong&gt;, direct &lt;strong&gt;reuse of UE’s default packaging process&lt;/strong&gt; and &lt;strong&gt;clearly&lt;/strong&gt; split the basic package. This article will specifically introduce the usage and implementation principles.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/categories/UnrealEngine/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="HotPatcher" scheme="https://en.imzlp.com/tags/HotPatcher/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/tags/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>How to write a good technical article</title>
    <link href="https://en.imzlp.com/posts/23932/"/>
    <id>https://en.imzlp.com/posts/23932/</id>
    <published>2022-09-12T20:18:36.000Z</published>
    <updated>2022-09-12T20:18:36.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Technical articles are an effective way to enhance &lt;strong&gt;expression skills&lt;/strong&gt; and carry out &lt;strong&gt;technical accumulation&lt;/strong&gt;. Unlike simple technical notes, I believe a technical article should be a solution to &lt;strong&gt;real problems&lt;/strong&gt; or &lt;strong&gt;new technical ideas&lt;/strong&gt;, rather than a mere assemblage of technical points.&lt;/p&gt;
&lt;p&gt;Regarding how to write a qualified technical article, I have been contemplating this recently. This article will explore some of my thoughts and steps when writing articles, as well as tool recommendations and the implementation of CI/CD automation publishing.&lt;/p&gt;</summary>
    
    
    
    <category term="随笔" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="循迹研究" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="方法论" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/%E6%96%B9%E6%B3%95%E8%AE%BA/"/>
    
    
    <category term="随笔" scheme="https://en.imzlp.com/tags/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="循迹研究" scheme="https://en.imzlp.com/tags/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="方法论" scheme="https://en.imzlp.com/tags/%E6%96%B9%E6%B3%95%E8%AE%BA/"/>
    
  </entry>
  
  <entry>
    <title>ASTC texture compression analysis and efficiency optimization in UE</title>
    <link href="https://en.imzlp.com/posts/7181/"/>
    <id>https://en.imzlp.com/posts/7181/</id>
    <published>2022-09-08T19:01:53.000Z</published>
    <updated>2022-09-08T19:01:53.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;&lt;code&gt;ASTC&lt;/code&gt; stands for &lt;code&gt;Adaptive Scalable Texture Compression&lt;/code&gt;, which is a popular texture compression scheme on mobile platforms. When the platform uses ASTC packaging, UE defaults to using the &lt;a href=&quot;https://github.com/GameTechDev/ISPCTextureCompressor&quot;&gt;Intel ISPC Texture Compressor&lt;/a&gt; for texture compression. However, it has some limitations, only supporting compression specifications of &lt;code&gt;8x8&lt;/code&gt; and above, while &lt;code&gt;10x10&lt;/code&gt; and &lt;code&gt;12x12&lt;/code&gt; are not supported. If specified in the project, it will still use the &lt;code&gt;8x8&lt;/code&gt; specification. In addition to &lt;a href=&quot;https://github.com/GameTechDev/ISPCTextureCompressor&quot;&gt;ISPC&lt;/a&gt;, the engine also provides ARM’s &lt;a href=&quot;https://github.com/ARM-software/astc-encoder&quot;&gt;astc-encoder&lt;/a&gt; compression method, which supports specifications below &lt;code&gt;8x8&lt;/code&gt;, but is not enabled by default. Moreover, the integrated compression efficiency in the engine is very low, and using &lt;a href=&quot;https://github.com/ARM-software/astc-encoder&quot;&gt;astc-encoder&lt;/a&gt; to compress textures can pose a significant challenge to Cook time in large-scale resources.&lt;/p&gt;
&lt;p&gt;This article analyzes the settings for using ASTC compression for textures in UE, as well as the compression efficiency and optimization ideas for the &lt;a href=&quot;https://github.com/ARM-software/astc-encoder&quot;&gt;astc-encoder&lt;/a&gt; in the engine.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="ASTC" scheme="https://en.imzlp.com/categories/UnrealEngine/ASTC/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="Android" scheme="https://en.imzlp.com/tags/Android/"/>
    
    <category term="ASTC" scheme="https://en.imzlp.com/tags/ASTC/"/>
    
    <category term="贴图压缩" scheme="https://en.imzlp.com/tags/%E8%B4%B4%E5%9B%BE%E5%8E%8B%E7%BC%A9/"/>
    
    <category term="包体优化" scheme="https://en.imzlp.com/tags/%E5%8C%85%E4%BD%93%E4%BC%98%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>Multi-stage automated resource inspection scheme in UE</title>
    <link href="https://en.imzlp.com/posts/22655/"/>
    <id>https://en.imzlp.com/posts/22655/</id>
    <published>2022-08-23T11:30:21.000Z</published>
    <updated>2022-08-23T11:30:21.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In large projects, the scale of resources is immense, and the production teams involved are very diverse, including scenes, characters, UI, animations, effects, blueprints, data tables, and so on. Consequently, managing the volume and specification of resources becomes difficult to control.&lt;/p&gt;
&lt;p&gt;For the established resource specifications, art production personnel may struggle to cover 100% of the scenarios, potentially overlooking details unintentionally. In most cases, issues are discovered after the packages are created, and for existing resources, a significant amount of manpower is required for handling them, making review and repair challenging.&lt;/p&gt;
&lt;p&gt;Based on this pain point, I previously developed a resource scanning tool that allows convenient editing of rules to scan resources within the project.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/71162/&quot;&gt;Creating Attribute Caches for Assets in UE using Reflection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/19901/&quot;&gt;Design and Implementation Plan for Resource Self-Correction in UE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/22655/&quot;&gt;Multi-Stage Automated Resource Check Plan in UE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/20376/&quot;&gt;Automated Resource Checking Practice Based on ResScannerUE&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/11750/&quot;&gt;Resource Compliance Checking Tool ResScannerUE in UE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Recently, I have conducted a comprehensive upgrade of the plugin, enhancing its capabilities during editing and automated checks. This article will introduce how to utilize &lt;a href=&quot;https://imzlp.com/posts/11750/&quot;&gt;ResScannerUE&lt;/a&gt; to perform resource scans during &lt;strong&gt;editing&lt;/strong&gt;, &lt;strong&gt;submitting&lt;/strong&gt;, &lt;strong&gt;CI timed or Hook tasks&lt;/strong&gt;, and &lt;strong&gt;Cooking&lt;/strong&gt; phases, aiming to expose and prompt solutions to problematic resources as early as possible in production, thus avoiding anomalies in package resources.&lt;/p&gt;
&lt;p&gt;In terms of specific implementation, many optimizations have been made for scanning speed, transforming the checking process into a nearly unnoticed action, which will be elaborated upon in the article.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/categories/UnrealEngine/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/tags/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    <category term="ResScanner" scheme="https://en.imzlp.com/tags/ResScanner/"/>
    
  </entry>
  
  <entry>
    <title>An Efficient ZSTD Shader Dictionary Training Scheme</title>
    <link href="https://en.imzlp.com/posts/26943/"/>
    <id>https://en.imzlp.com/posts/26943/</id>
    <published>2022-07-14T13:01:54.000Z</published>
    <updated>2022-07-14T13:01:54.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In the article &lt;a href=&quot;https://imzlp.com/posts/24725/&quot;&gt;ZSTD Dictionary-based Shader Compression Scheme&lt;/a&gt;, I introduced a method for compressing UE’s ShaderCode using ZSTD dictionaries, which can significantly improve the compression ratio of ShaderLibrary. However, the process of training the dictionary and using it for compression remains complex and is not an efficient engineering implementation:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The engine’s default Shader compression must be turned off.&lt;/li&gt;
&lt;li&gt;You need to cook the project once to dump the ShaderCode of each unique Shader.&lt;/li&gt;
&lt;li&gt;Based on the dumped ShaderCode files, use the ZSTD program to train the dictionary.&lt;/li&gt;
&lt;li&gt;Execute a full cook process again to compress using the dictionary and generate the final shaderbytecode.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;According to the above process, changing the engine is necessary to dump ShaderCode; moreover, the disjointed workflow means that after dumping ShaderCode, you must invoke the &lt;code&gt;zstd&lt;/code&gt; program to train the dictionary; finally, you still need to cook the project again to compress the Shader using the trained dictionary. Additionally, turning off Shader compression will cause DDC Cache Miss with LZ4 compression, leading to significant time overhead from repeated cooking, which is unacceptable in projects with a large number of Shaders.&lt;/p&gt;
&lt;p&gt;Based on this pain point, I researched and implemented an efficient dictionary training method that requires no changes to the engine, allowing for rapid training of the dictionary and compression based on that dictionary. It can directly train the dictionary from ushaderbytecode and generate ushaderbytecode using ZSTD + dictionary compression, greatly improving processing efficiency. This is a completely Plugin-Only implementation, with almost zero integration cost, and will later be released as an extension module of &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt;.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="HotPatcher" scheme="https://en.imzlp.com/tags/HotPatcher/"/>
    
    <category term="ZSTD" scheme="https://en.imzlp.com/tags/ZSTD/"/>
    
    <category term="ushaderbytecode" scheme="https://en.imzlp.com/tags/ushaderbytecode/"/>
    
  </entry>
  
  <entry>
    <title>A runtime reorganization scheme for Pak in Unreal Engine</title>
    <link href="https://en.imzlp.com/posts/12188/"/>
    <id>https://en.imzlp.com/posts/12188/</id>
    <published>2022-05-23T11:03:22.000Z</published>
    <updated>2022-05-23T11:03:22.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Pak is a part of UFS in UE (Unreal File System), constructed as a virtual file system at the application layer. It is used to package game-related resources and files into a Pak file, avoiding the creation of a large number of file handles when accessing game resources at runtime, and allowing for read caching (PakCache) to enhance loading efficiency.&lt;/p&gt;
&lt;p&gt;Moreover, within UFS, the priority of each Pak can be controlled to manage the priority of files in the file system. When loading files through UFS, files in Paks with higher priority will be accessed first, allowing them to replace files with lower priority. This is also key to UE’s implementation of hot updates, as detailed in the previous &lt;a href=&quot;https://imzlp.com/categories/UnrealEngine/%E7%83%AD%E6%9B%B4%E6%96%B0/&quot;&gt;hot update series article&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;However, by default, the packaging of Pak is done on the UE side, with &lt;code&gt;PakUtilities&lt;/code&gt; and &lt;code&gt;UnrealPak&lt;/code&gt; being developer-side functionalities that do not exist at runtime, meaning Pak files cannot be created during runtime. Nevertheless, Pak itself is in the form of an Archive, which theoretically can be reorganized at runtime.&lt;/p&gt;
&lt;p&gt;This article will explore the implementation details and application directions of creating Pak files at runtime by discussing the aspects of Pak creation, file format, UFS analysis, and runtime reorganization feasibility.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="Pak" scheme="https://en.imzlp.com/categories/UnrealEngine/Pak/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="Pak" scheme="https://en.imzlp.com/tags/Pak/"/>
    
  </entry>
  
  <entry>
    <title>Shader compression scheme based on ZSTD dictionary</title>
    <link href="https://en.imzlp.com/posts/24725/"/>
    <id>https://en.imzlp.com/posts/24725/</id>
    <published>2022-04-17T17:37:38.000Z</published>
    <updated>2022-04-17T17:37:38.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;As the scale of projects increases, the number of Shader variants in UE gradually accumulates, often reaching millions of Shader variants. Although UE provides the &lt;code&gt;Share Material Shader Code&lt;/code&gt; feature to avoid duplicate storage of Shaders by serializing them into a standalone &lt;code&gt;ushaderbytecode&lt;/code&gt; file, it can still occupy hundreds of megabytes of package size. By default, UE places these NotUAsset files in Chunk0, which must go into the base package, significantly affecting the base package for mobile platforms where hundreds of megabytes could hold many resources.&lt;/p&gt;
&lt;p&gt;To solve this issue, we can only tackle it from three aspects:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Reduce the number of variants in the project, dump Shader information from the project, and analyze which ones are unnecessary;&lt;/li&gt;
&lt;li&gt;Split shaderbytecode so that the base package only contains essential Shaders, while others are downloaded as needed. However, UE does not provide such a mechanism by default, but you can use my developed &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt; to split the base package, generate multiple shader libs, and dynamically download resources and required shaderbytecode using the hot update process.&lt;/li&gt;
&lt;li&gt;Use a compression algorithm with a higher compression ratio to compress ShaderCode; the engine by default uses LZ4.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The first approach requires collaboration between TA and artists, making significant improvements relatively difficult. The second solution is detailed in previous articles about hot updates (&lt;a href=&quot;https://imzlp.com/categories/UnrealEngine/%E7%83%AD%E6%9B%B4%E6%96%B0/&quot;&gt;Unreal Engine#热更新&lt;/a&gt;). This article starts from the third approach, implementing a special compression method for Shaders that effectively reduces the size of shaderbytecode, significantly improving the compression ratio of Shaders and can be combined with solution 2 to enhance compression while splitting shaderbytecode.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="优化" scheme="https://en.imzlp.com/tags/%E4%BC%98%E5%8C%96/"/>
    
    <category term="Shader" scheme="https://en.imzlp.com/tags/Shader/"/>
    
    <category term="Compression" scheme="https://en.imzlp.com/tags/Compression/"/>
    
  </entry>
  
  <entry>
    <title>Efficient Debugging: Start UE Android App with command line parameters</title>
    <link href="https://en.imzlp.com/posts/29169/"/>
    <id>https://en.imzlp.com/posts/29169/</id>
    <published>2022-01-01T19:58:02.000Z</published>
    <updated>2022-01-01T19:58:02.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In the process of using UE development, specifying command line parameters is a frequently used feature that facilitates control over certain processes and toggles. UE also extensively uses Commandline to control the behavior of the engine. The official documentation: &lt;a href=&quot;https://docs.unrealengine.com/4.27/en-US/ProductionPipelines/CommandLineArguments/&quot;&gt;Command-Line Arguments&lt;/a&gt;, allows different modules to read or check parameters from the Commandline, implementing custom command line parameter functionalities.&lt;/p&gt;
&lt;p&gt;However, for the mobile Android platform, it is not very convenient to specify startup parameters; editing the &lt;code&gt;ue4commandline.txt&lt;/code&gt; file is quite cumbersome.&lt;/p&gt;
&lt;p&gt;Based on this pain point, I developed a UE Android plugin during the New Year holiday that allows Android applications to start and specify command line parameters as conveniently as on PC, without needing to modify the engine. Once the plugin is activated, you can package the APK for use. The project is open-sourced on GitHub: &lt;a href=&quot;https://github.com/hxhb/AppCmderUE&quot;&gt;hxhb/AppCmderUE&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.imzlp.com/imgs/zlp/picgo/2023/20230118171536.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;This article analyzes how UE reads Commandline on the Android side and introduces the implementation principles and usage methods of the &lt;a href=&quot;https://github.com/hxhb/AppCmderUE&quot;&gt;AppCmderUE&lt;/a&gt; plugin.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="插件开发" scheme="https://en.imzlp.com/categories/UnrealEngine/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
    
    <category term="Debugging" scheme="https://en.imzlp.com/categories/UnrealEngine/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/Debugging/"/>
    
    <category term="Android" scheme="https://en.imzlp.com/categories/UnrealEngine/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/Debugging/Android/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="插件开发" scheme="https://en.imzlp.com/tags/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
    
    <category term="Android" scheme="https://en.imzlp.com/tags/Android/"/>
    
    <category term="Debugging" scheme="https://en.imzlp.com/tags/Debugging/"/>
    
  </entry>
  
  <entry>
    <title>UE Resource Management: Engine Packaging Resource Analysis</title>
    <link href="https://en.imzlp.com/posts/22570/"/>
    <id>https://en.imzlp.com/posts/22570/</id>
    <published>2021-12-31T14:33:25.000Z</published>
    <updated>2021-12-31T14:33:25.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;By default, when packaging a project in UE, BuildCookRun is invoked to execute a series of processes such as Compile/Cook/Pak/Stage. In UE, only the assets involved in Cook will be packaged; however, it often includes many unexpected assets, which can be perplexing. What resources does the engine depend on? And how should we manage the resources involved in packaging in UE?&lt;/p&gt;
&lt;p&gt;This article starts with analyzing the rules for resource Cook during UE packaging, studying which resources will actually be Cooked, which is beneficial for resource management. Based on this understanding, a custom Cook process can be implemented, distributing Cook tasks to different processes or even machines to achieve parallelization and accelerate the UE build process.&lt;/p&gt;
&lt;p&gt;In addition to resources like uasset, there are many Non-Asset files during packaging, such as ini, Shader Library, AssetRegistry, or script files added to the project, etc. These have been introduced in a previous article &lt;a href=&quot;https://imzlp.com/posts/17371/&quot;&gt;UE Hot Update: Demand Analysis and Solution Design&lt;/a&gt;. UE’s collection of these &lt;strong&gt;resources&lt;/strong&gt; does not occur during the Cook phase (Shader Library and AssetRegistry are generated during the Cook phase), which will not be discussed further in this article, but a dedicated article will be written later on.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/categories/UnrealEngine/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/tags/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>My 2021 Annual Summary</title>
    <link href="https://en.imzlp.com/posts/24854/"/>
    <id>https://en.imzlp.com/posts/24854/</id>
    <published>2021-12-23T20:58:35.000Z</published>
    <updated>2021-12-23T20:58:35.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;I have always hoped that everything I want to do can be quantified and recorded. Otherwise, as the years go by, I won’t remember what I have done. So I will make an annual summary.&lt;/p&gt;
&lt;p&gt;As 2021 is coming to an end, reflecting on this year, many things happened, and I had many new ideas. It was also the year that had the greatest impact on me.&lt;/p&gt;</summary>
    
    
    
    <category term="随笔" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="循迹研究" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="年度总结" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/"/>
    
    
    <category term="随笔" scheme="https://en.imzlp.com/tags/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="循迹研究" scheme="https://en.imzlp.com/tags/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="年度总结" scheme="https://en.imzlp.com/tags/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/"/>
    
  </entry>
  
  <entry>
    <title>Things to Analyze Blog Traffic Data</title>
    <link href="https://en.imzlp.com/posts/14354/"/>
    <id>https://en.imzlp.com/posts/14354/</id>
    <published>2021-11-21T10:25:13.000Z</published>
    <updated>2021-11-21T10:25:13.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Recently, I checked the access data of the blog Google Analysic, and through traffic analysis, I found some very interesting points that can reflect, to some extent, the user characteristics in game development using Unreal Engine. The data sample in this article is the access traffic from our site for the week of 2021.11.14-2021.11.20. The overall data amount is limited and may not truly reflect real trends, only for reference.&lt;/p&gt;</summary>
    
    
    
    <category term="随笔" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="循迹研究" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="数据分析" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/"/>
    
    
    <category term="随笔" scheme="https://en.imzlp.com/tags/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="循迹研究" scheme="https://en.imzlp.com/tags/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="数据分析" scheme="https://en.imzlp.com/tags/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/"/>
    
  </entry>
  
  <entry>
    <title>UE5: Game Feature Tech Preview</title>
    <link href="https://en.imzlp.com/posts/17658/"/>
    <id>https://en.imzlp.com/posts/17658/</id>
    <published>2021-11-17T12:31:24.000Z</published>
    <updated>2021-11-17T12:31:24.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;The preview video for UE5 introduces a modular development mechanism for GamePlay, similar to mod-style development and management of game features and resources, referred to as “Game Feature”. This has already been enabled in UE4.27 and UE5. I think this new modular gameplay format is great, so I’ve conducted a technical research.&lt;/p&gt;
&lt;p&gt;This article introduces the activation process and operational mechanism of Game Features, and at the end shares a demo based on Game Features. Additionally, I implemented a mechanism in &lt;a href=&quot;https://imzlp.com/posts/17590&quot;&gt;HotPatcher&lt;/a&gt; that allows features to be packaged independently; Game Features do not need to be pre-packaged into the base package and can be downloaded and loaded on demand during runtime, achieving true modular loading.&lt;/p&gt;
&lt;p&gt;Currently, the UE5 EA version still has some imperfections, and related content will be supplemented as the engine updates.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="GameFeature" scheme="https://en.imzlp.com/categories/UnrealEngine/GameFeature/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="GameFeature" scheme="https://en.imzlp.com/tags/GameFeature/"/>
    
    <category term="GameplayModular" scheme="https://en.imzlp.com/tags/GameplayModular/"/>
    
  </entry>
  
  <entry>
    <title>Open Source an Unreal Engine launcher Project:UE Launcher</title>
    <link href="https://en.imzlp.com/posts/3635/"/>
    <id>https://en.imzlp.com/posts/3635/</id>
    <published>2021-11-10T14:17:15.000Z</published>
    <updated>2021-11-10T14:17:15.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Usually, when developing projects using UE, there are multiple engine versions locally, and the Epic Game Launcher only supports launching installed engine versions and does not support source-compiled engines. When there are multiple engine versions locally, switching becomes inconvenient, and there is no streamlined tool to launch the engine, projects, and add launch parameters easily. When executing Commandlet, it requires creating many scripts, making management very cumbersome. Based on these pain points, I developed a UE launcher: &lt;a href=&quot;https://github.com/hxhb/UE4Launcher&quot;&gt;UELauncher&lt;/a&gt;, to solve these issues, supporting both UE4 and UE5.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="工具开发" scheme="https://en.imzlp.com/categories/UnrealEngine/%E5%B7%A5%E5%85%B7%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="工具开发" scheme="https://en.imzlp.com/tags/%E5%B7%A5%E5%85%B7%E5%BC%80%E5%8F%91/"/>
    
    <category term="Launcher" scheme="https://en.imzlp.com/tags/Launcher/"/>
    
    <category term="Tools" scheme="https://en.imzlp.com/tags/Tools/"/>
    
  </entry>
  
  <entry>
    <title>Automated Resource Scanning and Inspection with ResScannerUE</title>
    <link href="https://en.imzlp.com/posts/20376/"/>
    <id>https://en.imzlp.com/posts/20376/</id>
    <published>2021-10-25T15:49:18.000Z</published>
    <updated>2021-10-25T15:49:18.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;For the resource inspection requirements in the project, it needs to be simple and convenient to configure, automate execution, and be able to promptly locate related personnel. Based on this requirement, I have open-sourced a resource compliance scanning tool &lt;a href=&quot;https://imzlp.com/posts/11750/&quot;&gt;ResScannerUE&lt;/a&gt;, with configuration documentation: &lt;a href=&quot;https://imzlp.com/posts/11750/&quot;&gt;UE Resource Compliance Inspection Tool ResScannerUE&lt;/a&gt;.&lt;br&gt;This article will introduce how to achieve automated resource scanning through this tool, provide support for incremental detection combined with Git, use Commandlet to automatically trigger and execute detection rules for Content content changes on CI platforms, and be able to locate the most recent committers of problematic resources, achieving precise positioning and real-time scanning report sending to corporate WeChat, reminding relevant personnel to take action.&lt;br&gt;Additionally, I also provide a Git-based Pre-Commit Hook implementation, allowing detection of non-compliant resources before submitting and prohibiting the submission, thus avoiding the contamination of remote repositories with problematic resources. The overall solution has been meticulously designed and extensively optimized for experience and enhanced automation support, making it very convenient to configure and integrate, capable of meeting various resource scanning needs.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/categories/UnrealEngine/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/tags/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    <category term="ResScanner" scheme="https://en.imzlp.com/tags/ResScanner/"/>
    
  </entry>
  
  <entry>
    <title>Details Panel Customization in Unreal Engine</title>
    <link href="https://en.imzlp.com/posts/26919/"/>
    <id>https://en.imzlp.com/posts/26919/</id>
    <published>2021-10-25T09:34:21.000Z</published>
    <updated>2021-10-25T09:34:21.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;When developing editor plugins in UE, it is very convenient to automatically create property panels using the reflection information of USTRUCT, providing a configurable way, but there are often special customization requirements for the property panels, such as providing special panel options, displaying different types of values based on parameters, etc. The property panels in UE are applied in &lt;a href=&quot;https://imzlp.com/posts/17590/&quot;&gt;HotPatcher&lt;/a&gt; and &lt;a href=&quot;https://imzlp.com/posts/11750/&quot;&gt;ResScannerUE&lt;/a&gt;, which can conveniently configure and customize plugins. The official documentation from UE: &lt;a href=&quot;https://docs.unrealengine.com/4.27/en-US/ProgrammingAndScripting/Slate/DetailsCustomization/&quot;&gt;Details Panel Customization&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This article starts with creating an independent &lt;code&gt;Details&lt;/code&gt; panel, and through specific cases in &lt;a href=&quot;https://imzlp.com/posts/11750/&quot;&gt;ResScannerUE&lt;/a&gt;, provides implementation methods for customizing property panels and property items.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="插件开发" scheme="https://en.imzlp.com/categories/UnrealEngine/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
    
    <category term="Slate" scheme="https://en.imzlp.com/categories/UnrealEngine/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/Slate/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="插件开发" scheme="https://en.imzlp.com/tags/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
    
    <category term="Slate" scheme="https://en.imzlp.com/tags/Slate/"/>
    
  </entry>
  
  <entry>
    <title>UE Hot Update: Config Overloading and Apply</title>
    <link href="https://en.imzlp.com/posts/9028/"/>
    <id>https://en.imzlp.com/posts/9028/</id>
    <published>2021-10-18T14:57:38.000Z</published>
    <updated>2021-10-18T14:57:38.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In the UE engine, a large number of configurations are set and controlled using ini files. For projects, understanding which of these can be updated can help establish rules for updating the project. Moreover, many functionalities in UE are realized through configurations and dynamic switches, such as CVars, as well as Device Profiles settings for specific platforms or devices, which can similarly implement dynamic dispatch and application of configurations during hot updates.&lt;/p&gt;
&lt;p&gt;This article analyzes the loading process of ini config from the engine mechanism, how different config modules are reloaded after hot updates, and how to apply them in projects, focusing on the runtime modification and reapplication of parameters in the engine or project based on ini configuration hot updates, enhancing the ability to update games.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/categories/UnrealEngine/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
  </entry>
  
  <entry>
    <title>UE Resource Scanning and inspection tool ResScannerUE</title>
    <link href="https://en.imzlp.com/posts/11750/"/>
    <id>https://en.imzlp.com/posts/11750/</id>
    <published>2021-09-15T15:29:18.000Z</published>
    <updated>2021-09-15T15:29:18.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In game project development, due to the large amount of resources involved and the broad range of personnel, it’s relatively difficult to consciously unify resource standards. If issues arise with the resources, manually checking them requires a significant amount of manpower. This highlights the risks and pain points in resource management. &lt;/p&gt;
&lt;p&gt;Based on this demand, I developed a resource scanning standard tool under the editor, &lt;a href=&quot;https://imzlp.com/posts/11750/&quot;&gt;ResScannerUE&lt;/a&gt;, which allows for easy configuration of rules and automation. This can be executed by artists before submitting resources or on a regular basis to check whether the resources in the project comply, thus avoiding issues that may only be discovered after packaging. &lt;/p&gt;
&lt;p&gt;This article introduces the usage methods, operational mechanisms, ways to extend custom rules, and future optimization arrangements for the &lt;a href=&quot;https://imzlp.com/posts/11750/&quot;&gt;ResScannerUE&lt;/a&gt; plugin.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/categories/UnrealEngine/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="资源管理" scheme="https://en.imzlp.com/tags/%E8%B5%84%E6%BA%90%E7%AE%A1%E7%90%86/"/>
    
    <category term="ResScanner" scheme="https://en.imzlp.com/tags/ResScanner/"/>
    
  </entry>
  
  <entry>
    <title>UE Hot Update: Shader update strategy</title>
    <link href="https://en.imzlp.com/posts/15810/"/>
    <id>https://en.imzlp.com/posts/15810/</id>
    <published>2021-09-13T10:24:16.000Z</published>
    <updated>2021-09-13T10:24:16.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In some previous articles, the issue of UE hot updates missing shaders and using default materials has been introduced, along with a Shader Patch solution. For details, please refer to the articles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/5867/&quot;&gt;UE Hot Update: Create Shader Patch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[UE Hot Update: Questions &amp;amp; Answers#Hot Update Resources Not Working / Material Missing](&lt;a href=&quot;https://imzlp.com/posts/16895/#Hot&quot;&gt;https://imzlp.com/posts/16895/#Hot&lt;/a&gt; Update Resources Not Working-Material Missing).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://img.imzlp.com/imgs/zlp/blog/notes/ue/index/UE4/pak-shadercode-error-in-ue425.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;The fundamental reason for the runtime loss of materials is that the shaders dependent on newly added or modified resources were not packaged, leading to reading failures at runtime. This article will introduce the strategy and pros and cons of shader updates, analyze the mechanisms within the engine, and provide an optimized solution that combines the advantages of Shader Patch and Inline Shader Code, which has been implemented in &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt;.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/categories/UnrealEngine/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="Shader" scheme="https://en.imzlp.com/tags/Shader/"/>
    
    <category term="InlineShaderCode" scheme="https://en.imzlp.com/tags/InlineShaderCode/"/>
    
  </entry>
  
  <entry>
    <title>UE Hot Update: binary patch solution for resources</title>
    <link href="https://en.imzlp.com/posts/25136/"/>
    <id>https://en.imzlp.com/posts/25136/</id>
    <published>2021-09-06T16:27:10.000Z</published>
    <updated>2021-09-06T16:27:10.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;A series of articles has been introduced regarding the engineering practices of hot updates in UE, capable of achieving version comparison and differential updates based on resources from the original project. However, by default, resource updates depend on file updates; if a resource changes, the entire file must be repackaged. In UE, resource changes after Cook do not cause the entire file to be updated; only certain bytes are modified during serialization. In this case, a file-based patch mechanism can significantly reduce the size of the patch. This article outlines the generation and loading scheme of binary patches based on &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt;, allowing for easy generation of binary patches.&lt;/p&gt;
&lt;p&gt;To fulfill this requirement, I have ported HDiffPatch to UE and used it as the default DIFF/PATCH algorithm for binary differential patches in &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt;; it can also easily extend other algorithms based on the Modular Feature approach.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/categories/UnrealEngine/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="HotPatcher" scheme="https://en.imzlp.com/tags/HotPatcher/"/>
    
  </entry>
  
  <entry>
    <title>UE as Lib</title>
    <link href="https://en.imzlp.com/posts/26475/"/>
    <id>https://en.imzlp.com/posts/26475/</id>
    <published>2021-08-24T09:34:30.000Z</published>
    <updated>2021-08-24T09:34:30.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;UE4.27 has introduced a new mechanism that allows UE to be compiled into a library, enabling it to be embedded in external programs, which can then drive the engine’s execution and message communication. However, the official documentation has not yet been released. I analyzed the relevant code in the engine and proposed a practical solution for UE as Lib, which can theoretically be implemented in engine versions before 4.27, although it may be inconsistent with the official documentation released later. The related research content will also be continuously updated in this article.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="UEAsLib" scheme="https://en.imzlp.com/tags/UEAsLib/"/>
    
  </entry>
  
  <entry>
    <title>Profiling IOS With Unreal Insights</title>
    <link href="https://en.imzlp.com/posts/14154/"/>
    <id>https://en.imzlp.com/posts/14154/</id>
    <published>2021-08-19T14:14:48.000Z</published>
    <updated>2021-08-19T14:14:48.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Unreal Insights is a profiling tool provided by UE since 4.23, which allows for an easy view of the flame graphs of various threads during game execution. However, the official documentation only provides connection methods for PC and Android, not directly supporting iOS, which is not very convenient. After some research, it was found that the main issue with iOS is related to network policies. This article provides a solution for real-device profiling and port communication between UE and iOS devices, supporting real-time profiling and cook on the fly, as well as data exchange between iOS devices and PCs.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="Profiling" scheme="https://en.imzlp.com/categories/UnrealEngine/Profiling/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="Profiling" scheme="https://en.imzlp.com/tags/Profiling/"/>
    
    <category term="IOS" scheme="https://en.imzlp.com/tags/IOS/"/>
    
    <category term="UnrealInsights" scheme="https://en.imzlp.com/tags/UnrealInsights/"/>
    
  </entry>
  
  <entry>
    <title>UE Multi-User Collaborative Editing Service Deployment Guide</title>
    <link href="https://en.imzlp.com/posts/25226/"/>
    <id>https://en.imzlp.com/posts/25226/</id>
    <published>2021-08-05T16:15:28.000Z</published>
    <updated>2021-08-05T16:15:28.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In the context of the large-scale project and the remote working demand caused by the pandemic, collaborative editing under development has become particularly important. In UE’s resource mechanism, maps are single resources; although they can be split using the Sub-level format, the smallest element remains a single resource. When different designers modify the same resource, it can lead to file conflicts, and merging is not as straightforward as with text. Furthermore, when each person is responsible for editing a single sub-level, there is no way to preview the entire scene’s effect in real-time, which is a bottleneck in collaborative development.&lt;/p&gt;
&lt;p&gt;After UE4.23, UE officially launched a multi-user collaboration mechanism that allows multiple people to edit the same map simultaneously without causing conflicts. It can also synchronize other changing resources and take effect in real time. As a supplement to version control, it effectively resolves issues of synchronized collaboration.&lt;/p&gt;
&lt;p&gt;This article records the enabling process, usage specifications, network strategies, and other issues. It will also extract an independent server-side program without relying on the complete engine, allowing for convenient deployment of the server side.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="工具开发" scheme="https://en.imzlp.com/categories/UnrealEngine/%E5%B7%A5%E5%85%B7%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="UnrealMultiUserServer" scheme="https://en.imzlp.com/tags/UnrealMultiUserServer/"/>
    
    <category term="多用户协同" scheme="https://en.imzlp.com/tags/%E5%A4%9A%E7%94%A8%E6%88%B7%E5%8D%8F%E5%90%8C/"/>
    
  </entry>
  
  <entry>
    <title>Comparison of Zlib/Oodle/ZSTD algorithm performance</title>
    <link href="https://en.imzlp.com/posts/30732/"/>
    <id>https://en.imzlp.com/posts/30732/</id>
    <published>2021-07-06T19:59:39.000Z</published>
    <updated>2021-07-06T19:59:39.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;I previously wrote an article about integrating the ZSTD compression algorithm into UE: &lt;a href=&quot;https://imzlp.com/posts/8470/&quot;&gt;ModularFeature: Integrating ZSTD Compression Algorithm into UE4&lt;/a&gt;, and extracted the Oodle compression algorithm library from UE5 for use in UE4: &lt;a href=&quot;https://imzlp.com/notes/ue5/#Oodle-Compression&quot;&gt;Oodle Compression&lt;/a&gt;. Recently, I analyzed their compression, decompression, CPU, and memory consumption, testing on three platforms: WindowsNoEditor, Android_ASTC, and iOS, as well as the performance of Oodle’s Kraken using different compression levels on different platforms.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="压缩算法" scheme="https://en.imzlp.com/tags/%E5%8E%8B%E7%BC%A9%E7%AE%97%E6%B3%95/"/>
    
    <category term="Oodle" scheme="https://en.imzlp.com/tags/Oodle/"/>
    
    <category term="zstd" scheme="https://en.imzlp.com/tags/zstd/"/>
    
    <category term="zlib" scheme="https://en.imzlp.com/tags/zlib/"/>
    
  </entry>
  
  <entry>
    <title>A first look at the next generation of UE5</title>
    <link href="https://en.imzlp.com/posts/8724/"/>
    <id>https://en.imzlp.com/posts/8724/</id>
    <published>2021-05-25T12:22:44.000Z</published>
    <updated>2021-05-25T12:22:44.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Finally, at the end of May 2021, UE5 is set to launch its first preview version, &lt;a href=&quot;https://mp.weixin.qq.com/s/W0e79uhqOyxLKXeC9MwnDg&quot;&gt;Unreal Engine 5 — Early Access Program starts at 10 PM on May 26, Wednesday China time!&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;I have been looking forward to UE5 for a long time; last year, Nanite and Lumen created a huge stir, and after a year’s wait, I finally get to experience it. Over the past year, there haven’t been many technical updates about UE5. I have summarized and analyzed some information disclosed by Epic regarding UE5, which can be found in &lt;a href=&quot;https://imzlp.com/notes/ue5/&quot;&gt;notes/ue5&lt;/a&gt;. This article will document some experiences using UE5, focusing on the changes in development methods compared to UE4, the transition from UE4 to UE5, and a technical pre-research on applying UE5 in production environments. I will keep updating this article in the near future.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="UE5" scheme="https://en.imzlp.com/tags/UE5/"/>
    
  </entry>
  
  <entry>
    <title>UE project optimization: PSO Cache</title>
    <link href="https://en.imzlp.com/posts/24336/"/>
    <id>https://en.imzlp.com/posts/24336/</id>
    <published>2021-04-22T19:40:55.000Z</published>
    <updated>2021-04-22T19:40:55.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In UE, there is a PSO Cache mechanism, which stands for Pipeline State Object Caching. It is used to pre-record and construct the shader information dependent on the materials used at runtime. When the project first utilizes these shaders, this list can speed up the shader loading/compilation process. The PSO Cache saves rendering states, vertex declarations, primitive types, render target pixel formats, and other data to files, enhancing shader loading efficiency. This article primarily introduces the enabling and construction process of PSO Cache, and will analyze the loading process of PSO Cache in the engine, along with implementing hot-update PSO methods, error handling, etc. The principle of PSO Cache will be analyzed in detail later.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="PSOCache" scheme="https://en.imzlp.com/categories/UnrealEngine/PSOCache/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="PSOCache" scheme="https://en.imzlp.com/tags/PSOCache/"/>
    
    <category term="PSO" scheme="https://en.imzlp.com/tags/PSO/"/>
    
    <category term="优化" scheme="https://en.imzlp.com/tags/%E4%BC%98%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>UE Development Notes: Android</title>
    <link href="https://en.imzlp.com/posts/17996/"/>
    <id>https://en.imzlp.com/posts/17996/</id>
    <published>2021-04-15T19:54:12.000Z</published>
    <updated>2021-04-15T19:54:12.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In a previous article, I introduced the development notes and some engineering practices for Mac/iOS: &lt;a href=&quot;https://imzlp.com/posts/1948/&quot;&gt;UE4 Development Notes: Mac/iOS Edition&lt;/a&gt;. This article serves as a sister piece, documenting the standardized environment, debugging tools, engineering practices, and analysis of related engine code that I used while developing on Android with UE. It records some pitfalls encountered in the project, primarily organized from my previous notes &lt;a href=&quot;https://imzlp.com/notes/ue/&quot;&gt;notes/ue&lt;/a&gt;. Future Android-related content will also be updated in this article.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="Android" scheme="https://en.imzlp.com/categories/UnrealEngine/Android/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="Android" scheme="https://en.imzlp.com/tags/Android/"/>
    
    <category term="UPL" scheme="https://en.imzlp.com/tags/UPL/"/>
    
  </entry>
  
  <entry>
    <title>UE Performance Analysis: Memory Optimization</title>
    <link href="https://en.imzlp.com/posts/19135/"/>
    <id>https://en.imzlp.com/posts/19135/</id>
    <published>2021-03-30T10:59:16.000Z</published>
    <updated>2021-03-30T10:59:16.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In game development, program performance is a crucial issue that needs to be emphasized. To cover the largest possible user base, we must consider the operational effects on mid to low-end devices and ensure compatibility with a wide range of hardware specifications. In this context, it is key to analyze and optimize the performance bottlenecks of the game.&lt;/p&gt;
&lt;p&gt;Loading more resources into memory at runtime is essentially a trade-off of space for time. Frequent I/O from the disk is quite time-consuming, and pre-loading resources into memory allows for fast retrieval. However, memory resources are also limited and cannot be used without restrictions, especially for some mid to low-end mobile devices where devices with 4GB or even less memory still have a significant market share. Therefore, it is important to avoid wasting memory, as excessive memory usage may lead to termination by the system.&lt;/p&gt;
&lt;p&gt;Memory optimization fundamentally seeks to strike a balance between loading efficiency and memory consumption, aiming to use as much available memory as possible while ensuring that more low-end devices run normally without triggering OOM.&lt;/p&gt;
&lt;p&gt;I plan to write a few articles related to performance optimization. This article will start with UE memory analysis, introducing commonly used memory analysis tools and methods, as well as organizing the memory optimization techniques that can be applied in UE projects. This part was previously recorded in the form of notes at &lt;a href=&quot;https://imzlp.com/notes/ue/&quot;&gt;notes/ue&lt;/a&gt;, and subsequent memory-related content will be added to this article.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="Profiling" scheme="https://en.imzlp.com/categories/UnrealEngine/Profiling/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="Profiling" scheme="https://en.imzlp.com/tags/Profiling/"/>
    
    <category term="内存优化" scheme="https://en.imzlp.com/tags/%E5%86%85%E5%AD%98%E4%BC%98%E5%8C%96/"/>
    
    <category term="Memory" scheme="https://en.imzlp.com/tags/Memory/"/>
    
  </entry>
  
  <entry>
    <title>UE Hot update: Questions &amp; Answers</title>
    <link href="https://en.imzlp.com/posts/16895/"/>
    <id>https://en.imzlp.com/posts/16895/</id>
    <published>2021-03-12T10:45:44.000Z</published>
    <updated>2021-03-12T10:45:44.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt; project has been open source for over a year, undergoing numerous updates and optimizations. It has increasingly been chosen by developers as a hot update solution for their projects. During this time, many have inquired about common issues related to UE4 hot updates, which I noticed frequently repeated, so I decided to organize these common questions to help newcomers quickly troubleshoot the UE4 hot update solution.&lt;/p&gt;
&lt;p&gt;This article will continually update the Q&amp;amp;A content related to UE4 hot updates and &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt;. If you have any questions, feel free to comment directly on this article. I will periodically consolidate responses. You can also join my UE4 hot update group to discuss encountered issues (QQ group 958363331).&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/categories/UnrealEngine/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="HotPatcher" scheme="https://en.imzlp.com/tags/HotPatcher/"/>
    
  </entry>
  
  <entry>
    <title>UE Hot Update: Create Shader Patch</title>
    <link href="https://en.imzlp.com/posts/5867/"/>
    <id>https://en.imzlp.com/posts/5867/</id>
    <published>2021-03-12T09:49:27.000Z</published>
    <updated>2021-03-12T09:49:27.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In the previous series of articles on hot updates, the process and packaging details of UE hot updates were introduced. In fact, there are some engineering practices for optimizing hot update patches that I think can be discussed in detail.&lt;/p&gt;
&lt;p&gt;This article starts with the generation of Shader patches, aiming to reduce the size of shaders during each hot update. It will analyze some internal implementation details of the engine, address issues related to Shader patches in the engine, and automate the Shader patch process based on &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2021.11.02 UPDATE: &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt; now supports collecting all compiled shaders of Cooked resources in the patch and packaging them into a Shader Library, which can replace the Shader Patch mechanism. For more details, see the article: &lt;a href=&quot;https://imzlp.com/posts/15810/&quot;&gt;UE Hot Updates: Shader Update Strategy&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/categories/UnrealEngine/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="HotPatcher" scheme="https://en.imzlp.com/tags/HotPatcher/"/>
    
    <category term="ShaderPatch" scheme="https://en.imzlp.com/tags/ShaderPatch/"/>
    
    <category term="ushaderbytecode" scheme="https://en.imzlp.com/tags/ushaderbytecode/"/>
    
  </entry>
  
  <entry>
    <title>UE reflection impl analysis: reflection code generation (part 1)</title>
    <link href="https://en.imzlp.com/posts/9780/"/>
    <id>https://en.imzlp.com/posts/9780/</id>
    <published>2021-03-10T15:14:19.000Z</published>
    <updated>2021-03-10T15:14:19.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;I previously wrote two articles analyzing the implementation of reflection in UE, introducing the basic concepts of reflection in UE and some of the C++ features it relies on. This article will begin analyzing the specific process of UE’s reflection implementation.&lt;/p&gt;
&lt;p&gt;The C++ standard does not have reflection features, and the reflection used in UE is a mechanism based on &lt;strong&gt;marker syntax&lt;/strong&gt; and &lt;strong&gt;UHT scanning to generate auxiliary code&lt;/strong&gt;. As David Wheeler famously said, “&lt;em&gt;All problems in computer science can be solved by another level of indirection&lt;/em&gt;,” UHT does just that: it analyzes the marked code before actual compilation and generates real C++ code, collecting metadata regarding reflection types for runtime use.&lt;/p&gt;
&lt;p&gt;UHT generates a large amount of code. To avoid organizational confusion in this article, I will mainly discuss the &lt;strong&gt;actual C++ code&lt;/strong&gt; generated in &lt;code&gt;generated.h&lt;/code&gt; after UHT processes reflection markers like &lt;code&gt;GENERATED_BODY&lt;/code&gt; and &lt;code&gt;UFUNCTION&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The code generated by UHT is located in &lt;code&gt;generated.h&lt;/code&gt; and &lt;code&gt;gen.cpp&lt;/code&gt;. The code in &lt;code&gt;generated.h&lt;/code&gt; mostly defines some macros added to declared classes through compiler preprocessing to introduce common members, while the code in &lt;code&gt;gen.cpp&lt;/code&gt; represents the specific code generated by UHT to describe class reflection information, maintaining separation of declaration and definition.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="反射" scheme="https://en.imzlp.com/categories/UnrealEngine/%E5%8F%8D%E5%B0%84/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="UHT" scheme="https://en.imzlp.com/tags/UHT/"/>
    
    <category term="反射" scheme="https://en.imzlp.com/tags/%E5%8F%8D%E5%B0%84/"/>
    
  </entry>
  
  <entry>
    <title>UE Hot Update: asset management and audit tools</title>
    <link href="https://en.imzlp.com/posts/3675/"/>
    <id>https://en.imzlp.com/posts/3675/</id>
    <published>2021-03-09T18:16:31.000Z</published>
    <updated>2021-03-09T18:16:31.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In the previous article, the rules and implementation of basic package splitting were introduced. After the basic packaging rules are stabilized, the focus in daily development shifts to asset management, package resource auditing, and analyzing asset sizes and redundancy in the project.&lt;/p&gt;
&lt;p&gt;This article introduces resource packaging configuration in UE, commonly used asset management methods, and asset auditing tools in engineering practice. It is also a supplement to the previous article &lt;a href=&quot;https://imzlp.com/posts/13765/&quot;&gt;UE4 Hot Update: Splitting Basic Packages&lt;/a&gt; in the series on resource management for hot updates.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/categories/UnrealEngine/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="HotPatcher" scheme="https://en.imzlp.com/tags/HotPatcher/"/>
    
    <category term="资产审计" scheme="https://en.imzlp.com/tags/%E8%B5%84%E4%BA%A7%E5%AE%A1%E8%AE%A1/"/>
    
  </entry>
  
  <entry>
    <title>UE Hot Update: split the basic package</title>
    <link href="https://en.imzlp.com/posts/13765/"/>
    <id>https://en.imzlp.com/posts/13765/</id>
    <published>2021-01-27T21:51:56.000Z</published>
    <updated>2021-01-27T21:51:56.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In previous articles, we introduced the implementation mechanism of UE hot updates and the automation process of hot updates. Recently, we plan to continue writing a few articles to discuss the process and rules of resource package management in UE hot updates.&lt;/p&gt;
&lt;p&gt;Of course, different types of projects will have different packaging strategies, and resource management does not have a universal best strategy. This article mainly introduces the engineering practice of splitting the base package in the hot update process, involving the modification of the engine to implement a common splitting method for Android/iOS. We hope to provide some useful ideas for projects in different businesses.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In practical engineering, we abandoned the default package splitting scheme provided by UE and implemented a flexible package splitting scheme based on the &lt;a href=&quot;https://imzlp.com/posts/17590/&quot;&gt;HotPatcher&lt;/a&gt; framework. For details, see the article: &lt;a href=&quot;https://imzlp.com/posts/37036/&quot;&gt;Resource Management: Reshaping UE’s Package Splitting Scheme&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/categories/UnrealEngine/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="HotPatcher" scheme="https://en.imzlp.com/tags/HotPatcher/"/>
    
  </entry>
  
  <entry>
    <title>UE hot update: automated process based on HotPatcher</title>
    <link href="https://en.imzlp.com/posts/10938/"/>
    <id>https://en.imzlp.com/posts/10938/</id>
    <published>2021-01-24T12:47:34.000Z</published>
    <updated>2021-01-24T12:47:34.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;&lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt; is an open-source version management and resource packaging tool for UE4 hot updates that I developed earlier. It allows for convenient differential analysis between versions and pak packaging. Previous articles have visually introduced this based on manual configuration and packaging within the editor. In actual engineering practice, it’s preferable to automate repetitive operations to avoid manual involvement. I added commandlet support to the plugin earlier, and recently, I have fixed some issues and added many optimizations for commandlet. This article discusses the engineering practice of the automated hot update process based on HotPatcher.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/categories/UnrealEngine/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="HotPatcher" scheme="https://en.imzlp.com/tags/HotPatcher/"/>
    
  </entry>
  
  <entry>
    <title>Some thoughts and ideas on open source</title>
    <link href="https://en.imzlp.com/posts/8890/"/>
    <id>https://en.imzlp.com/posts/8890/</id>
    <published>2020-12-18T22:21:02.000Z</published>
    <updated>2020-12-18T22:21:02.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Open source is not just about making the code available; it’s about how to use your code to address real-world needs, continuously iterate and update, and build a community for open source projects. Based on my experiences with open source over the past couple of years, I want to share my views on open source from a developer’s perspective and some thoughts on open source behavior.&lt;/p&gt;</summary>
    
    
    
    <category term="编程随想" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E9%9A%8F%E6%83%B3/"/>
    
    <category term="开源" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E9%9A%8F%E6%83%B3/%E5%BC%80%E6%BA%90/"/>
    
    
    <category term="开源" scheme="https://en.imzlp.com/tags/%E5%BC%80%E6%BA%90/"/>
    
    <category term="编程随想" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E9%9A%8F%E6%83%B3/"/>
    
  </entry>
  
  <entry>
    <title>UE reflection impl analysis: C++ features</title>
    <link href="https://en.imzlp.com/posts/23694/"/>
    <id>https://en.imzlp.com/posts/23694/</id>
    <published>2020-12-13T19:39:37.000Z</published>
    <updated>2020-12-13T19:39:37.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In the previous article, the basic concepts of UE’s reflection were introduced. This article begins to explore the specific implementation of UE’s reflection mechanism.&lt;/p&gt;
&lt;p&gt;Before introducing UE’s code, some C++ features need to be highlighted. Although UE’s reflection implementation relies heavily on UHT’s code generation, it also requires support from C++ syntax features. Only by understanding these features and their underlying meanings can we better grasp UE’s reflection mechanism.&lt;/p&gt;
&lt;p&gt;The C++ features and standards described in this article are based on &lt;code&gt;ISO/IEC 14882:2014&lt;/code&gt;, which is the C++14 standard.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="反射" scheme="https://en.imzlp.com/categories/UnrealEngine/%E5%8F%8D%E5%B0%84/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="反射" scheme="https://en.imzlp.com/tags/%E5%8F%8D%E5%B0%84/"/>
    
  </entry>
  
  <entry>
    <title>UE reflection impl analysis: basic concepts</title>
    <link href="https://en.imzlp.com/posts/12624/"/>
    <id>https://en.imzlp.com/posts/12624/</id>
    <published>2020-12-12T23:56:24.000Z</published>
    <updated>2020-12-12T23:56:24.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;&lt;strong&gt;Reflection&lt;/strong&gt; refers to the ability of a program to perform self-inspection at runtime, which is very useful in the editor’s property panel, serialization, GC, and other areas. However, C++ does not support reflection features inherently. UE implements the generation of reflection information through UHT based on the syntax of C++, thereby achieving the goal of runtime reflection.&lt;/p&gt;
&lt;p&gt;In previous articles, some content related to UE’s build system and reflection was discussed.&lt;/p&gt;
&lt;p&gt;Articles related to UE’s build system:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/6362/&quot;&gt;Build flow of the Unreal Engine4 project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://img.imzlp.com/imgs/zlp/blog/posts/16643/&quot;&gt;UE4 Build System: Target and Module&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/20425/&quot;&gt;Differences and Connections Between UEC++ and Standard C++&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Articles on using UE’s reflection mechanism for various tricks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/15049/&quot;&gt;UE4: Hook UObject&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The implementation of UE’s reflection relies on UHT in the build system to perform code generation. This article provides a basic concept introduction to UE’s reflection, and subsequent articles will thoroughly introduce the implementation mechanisms of reflection in UE.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="反射" scheme="https://en.imzlp.com/categories/UnrealEngine/%E5%8F%8D%E5%B0%84/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="反射" scheme="https://en.imzlp.com/tags/%E5%8F%8D%E5%B0%84/"/>
    
  </entry>
  
  <entry>
    <title>2020 Unreal Open Day</title>
    <link href="https://en.imzlp.com/posts/11043/"/>
    <id>https://en.imzlp.com/posts/11043/</id>
    <published>2020-12-05T13:38:15.000Z</published>
    <updated>2020-12-05T13:38:15.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;The 2020 Unreal Open Day was held in the form of online live streaming and technical sub-forums. I was very happy to participate in this year’s UOD event. I recorded a technical video for UOD and also attended the UOD award ceremony live in Shanghai. I am honored and grateful to Epic for awarding me the &lt;strong&gt;Outstanding Community Contributor&lt;/strong&gt; award, which is both recognition and motivation for me. I will strive to produce more technical content to promote the development of the UE community.&lt;/p&gt;
&lt;p&gt;This article serves as a simple record, organizing the materials related to UOD and summarizing the videos, presentation PPTs, and relevant materials I participated in, as well as some photos taken on-site during the UOD live broadcast.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="UOD" scheme="https://en.imzlp.com/categories/UnrealEngine/UOD/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="UnrealOpenDay" scheme="https://en.imzlp.com/tags/UnrealOpenDay/"/>
    
    <category term="UOD" scheme="https://en.imzlp.com/tags/UOD/"/>
    
  </entry>
  
  <entry>
    <title>Best practices for UPL and JNI calls in UE</title>
    <link href="https://en.imzlp.com/posts/27289/"/>
    <id>https://en.imzlp.com/posts/27289/</id>
    <published>2020-11-15T10:45:27.000Z</published>
    <updated>2020-11-15T10:45:27.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;When developing Android with UE4, it is sometimes necessary to obtain platform-related information or perform platform-related operations. In such cases, it is essential to add Java code in the codebase and call it from C++. Some requirements also necessitate receiving events from the Java side in the game, requiring handling the Java calling C++ process.&lt;/p&gt;
&lt;p&gt;This article mainly involves the following sections:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adding Java code to UE projects&lt;/li&gt;
&lt;li&gt;Java function signature rules&lt;/li&gt;
&lt;li&gt;Java calling C++ functions&lt;/li&gt;
&lt;li&gt;C++ calling Java functions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;How to utilize UE’s UPL features, Java’s signature rules, and implement JNI calls in UE will be detailed in the article.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="Android" scheme="https://en.imzlp.com/categories/UnrealEngine/Android/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="Android" scheme="https://en.imzlp.com/tags/Android/"/>
    
    <category term="JNI" scheme="https://en.imzlp.com/tags/JNI/"/>
    
    <category term="UPL" scheme="https://en.imzlp.com/tags/UPL/"/>
    
  </entry>
  
  <entry>
    <title>UE：Hook UObject</title>
    <link href="https://en.imzlp.com/posts/15049/"/>
    <id>https://en.imzlp.com/posts/15049/</id>
    <published>2020-11-08T22:35:37.000Z</published>
    <updated>2020-11-08T22:35:37.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Hook is a mechanism that allows you to meet your requirements by intercepting and hooking into certain events. Unlike traditional low-level hooks, this article mainly introduces how to use similar hooking mechanisms in UE to achieve business needs.&lt;/p&gt;
&lt;p&gt;Some requirements necessitate the global modification of all objects of a specific class, such as playing a uniform sound effect for a certain type of Button in the UI. If every control needs to listen to its OnClicked and then play the sound, it leads to a lot of redundant operations. So, I want to find a method that can globally listen to the click events of all UButtons and handle them collectively. Alternatively, if I want to control an attribute that is invisible in blueprints, modifying the engine’s code for simple needs seems counterproductive.&lt;/p&gt;
&lt;p&gt;These requirements can be achieved through UE’s reflection mechanism. This article provides a simple implementation analysis.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="反射" scheme="https://en.imzlp.com/categories/UnrealEngine/%E5%8F%8D%E5%B0%84/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="反射" scheme="https://en.imzlp.com/tags/%E5%8F%8D%E5%B0%84/"/>
    
  </entry>
  
  <entry>
    <title>BuildGraph：构建支持多平台打包的二进制引擎</title>
    <link href="https://en.imzlp.com/posts/11956/"/>
    <id>https://en.imzlp.com/posts/11956/</id>
    <published>2020-11-08T15:40:19.000Z</published>
    <updated>2023-10-22T12:35:18.000Z</updated>
    
    
      
      
        
        
    <summary type="html">&lt;h3 id=&quot;Error-of-Not-Importing-Provision&quot;&gt;&lt;a href=&quot;#Error-of-Not-Importing-Provision&quot; class=&quot;headerlink&quot; title=&quot;Error of Not Importing</summary>
        
      
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="构建" scheme="https://en.imzlp.com/categories/UnrealEngine/%E6%9E%84%E5%BB%BA/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="BuildGraph" scheme="https://en.imzlp.com/tags/BuildGraph/"/>
    
  </entry>
  
  <entry>
    <title>2020: The next five-year plan</title>
    <link href="https://en.imzlp.com/posts/27392/"/>
    <id>https://en.imzlp.com/posts/27392/</id>
    <published>2020-10-25T12:18:58.000Z</published>
    <updated>2020-10-25T12:18:58.000Z</updated>
    
    
    <summary type="html">&quot;please enter the password before reading.&quot;</summary>
    
    
    
    <category term="随笔" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="循迹研究" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="年度总结" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/"/>
    
    
    <category term="随笔" scheme="https://en.imzlp.com/tags/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="循迹研究" scheme="https://en.imzlp.com/tags/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="年度总结" scheme="https://en.imzlp.com/tags/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/"/>
    
  </entry>
  
  <entry>
    <title>UE Toolset: Introduction to my open source project</title>
    <link href="https://en.imzlp.com/posts/21696/"/>
    <id>https://en.imzlp.com/posts/21696/</id>
    <published>2020-10-11T10:33:56.000Z</published>
    <updated>2020-10-11T10:33:56.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;工欲善其事必先利其器，本文主要介绍我在使用 UE 的过程中开发的一些开源的工具和插件，能够方便地在项目中使用，提高开发效率。之前简单罗列在 &lt;a href=&quot;https://imzlp.com/resources/&quot;&gt;资源&lt;/a&gt; 页面里，今天做一个详细的整理，对各个工具、插件做一些介绍。&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="开源" scheme="https://en.imzlp.com/categories/UnrealEngine/%E5%BC%80%E6%BA%90/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="开源" scheme="https://en.imzlp.com/tags/%E5%BC%80%E6%BA%90/"/>
    
  </entry>
  
  <entry>
    <title>How to build your own knowledge system?</title>
    <link href="https://en.imzlp.com/posts/29551/"/>
    <id>https://en.imzlp.com/posts/29551/</id>
    <published>2020-10-10T10:08:52.000Z</published>
    <updated>2020-10-10T10:08:52.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Learning is like rowing upstream; not to advance is to drop back. This is especially true in the field of CS, where new technologies and frameworks are developing rapidly, and the technical iteration on the business level is very fast. You may become familiar with a technology only to see it quickly become obsolete. Therefore, only by continuously engaging with, understanding, and learning new knowledge and skills can one continually expand their programming career.&lt;br&gt;This article is a reflection on the technical accumulation I’ve made over the past few years while blogging. Originally intended as a record of the &lt;a href=&quot;/notes&quot;&gt;notes&lt;/a&gt; revision, I now feel it’s appropriate to separate it into a standalone article. I rarely write reflective pieces, thinking that methodologies are too abstract, but if one has the self-discipline to turn theoretical guidance into action, methodologies are indeed necessary. I hope I can accomplish this as well.&lt;/p&gt;</summary>
    
    
    
    <category term="随笔" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="随笔" scheme="https://en.imzlp.com/tags/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="方法论" scheme="https://en.imzlp.com/tags/%E6%96%B9%E6%B3%95%E8%AE%BA/"/>
    
  </entry>
  
  <entry>
    <title>UE integrated WWise: concept and code analysis</title>
    <link href="https://en.imzlp.com/posts/9809/"/>
    <id>https://en.imzlp.com/posts/9809/</id>
    <published>2020-09-12T15:31:46.000Z</published>
    <updated>2020-09-12T15:31:46.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;&lt;a href=&quot;https://www.audiokinetic.com/products/wwise/&quot;&gt;WWise&lt;/a&gt; is Audiokinetic’s cross-platform audio engine that interacts well with game engines, allowing audio designers to handle audio solely within WWise. This separates game logic from audio production and management, providing events and parameters for use in game engines, achieving decoupling with business logic and precision control over audio.&lt;/p&gt;
&lt;p&gt;This article mainly introduces the integration of WWise with UE4, remote building, resource analysis, documentation collection, the control interaction between WWise and UE, and code analysis of generated Banks.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="Wwise" scheme="https://en.imzlp.com/categories/UnrealEngine/Wwise/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="Wwise" scheme="https://en.imzlp.com/tags/Wwise/"/>
    
  </entry>
  
  <entry>
    <title>UE import atlas: TexturePacker</title>
    <link href="https://en.imzlp.com/posts/28513/"/>
    <id>https://en.imzlp.com/posts/28513/</id>
    <published>2020-09-11T15:53:22.000Z</published>
    <updated>2020-09-11T15:53:22.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;When developing games, a large number of image resources are used, and the purpose of using texture atlases is to reduce DrawCall and improve performance. In UE, there is no packaging tool for texture atlases, and a popular solution is to use the third-party texture packing tool &lt;a href=&quot;https://www.codeandweb.com/texturepacker&quot;&gt;TexturePacker&lt;/a&gt;. The new version of TexturePacker supports direct export of UE4 Sprites and can be imported directly into the engine. In earlier versions, it was possible to import data via a Json Array using &lt;a href=&quot;https://github.com/ufna/VaTexAtlas&quot;&gt;VaTexAtlas&lt;/a&gt;, but compared to the direct export of UE Sprites by TexturePacker, VaTexAtlas does not have an advantage. UE Sprites can be previewed directly, while VaTexAtlas cannot. Given that official support is already available, it is not recommended to use VaTexAtlas as a method for importing texture atlases into UE.&lt;/p&gt;
&lt;p&gt;This article mainly focuses on documenting the analysis of TexturePacker atlas generation files, importing into UE, introducing options, and recording the issues encountered while using it in UE.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="图集" scheme="https://en.imzlp.com/categories/UnrealEngine/%E5%9B%BE%E9%9B%86/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="图集" scheme="https://en.imzlp.com/tags/%E5%9B%BE%E9%9B%86/"/>
    
    <category term="TexturePackaer" scheme="https://en.imzlp.com/tags/TexturePackaer/"/>
    
  </entry>
  
  <entry>
    <title>UE Development Notes: Mac/iOS</title>
    <link href="https://en.imzlp.com/posts/1948/"/>
    <id>https://en.imzlp.com/posts/1948/</id>
    <published>2020-09-01T21:45:03.000Z</published>
    <updated>2023-09-08T09:47:17.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;The main content of this article introduces the deployment of the UE development environment on Mac, configuration of iOS remote packaging, the application of UPL on iOS (intervening in the ipa packaging process), tools and development skills, as well as analysis of related engine code, documenting some pitfalls encountered in the project. It is primarily compiled from my previous &lt;a href=&quot;https://imzlp.com/notes&quot;&gt;notes&lt;/a&gt;, and related Mac and iOS content will also be updated in this article in the future.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="Apple" scheme="https://en.imzlp.com/categories/UnrealEngine/Apple/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="iOS" scheme="https://en.imzlp.com/tags/iOS/"/>
    
    <category term="Mac" scheme="https://en.imzlp.com/tags/Mac/"/>
    
  </entry>
  
  <entry>
    <title>UE hot update: demand analysis and solution design</title>
    <link href="https://en.imzlp.com/posts/17371/"/>
    <id>https://en.imzlp.com/posts/17371/</id>
    <published>2020-05-16T11:22:35.000Z</published>
    <updated>2020-05-16T11:22:35.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Game hot updates are a way for players to obtain the latest game content without reinstalling the game. They are widely used in network games on both PC and mobile platforms, as quick adjustments, bug fixes, and content updates are often needed after a game goes live. If even the smallest change requires players to update the app through the App Store, or manually download and install it from a website, and given that different platforms have inconsistent review rules and feedback times, operations could become chaotic.&lt;/p&gt;
&lt;p&gt;While there may be relatively mature solutions for hot updates in other engines, comprehensive discussions on implementing hot updates in UE4 are not commonly found. Fortunately, I have previously analyzed and implemented UE4’s hot update mechanism and plan to write a couple of articles to document my thoughts and implementation plans, along with a runnable demo, which I hope will be of help to those who need it.&lt;/p&gt;
&lt;p&gt;To conveniently collect and manage common questions and solutions regarding hot updates and HotPatcher, I’ve created a new article to document and organize them: &lt;a href=&quot;https://imzlp.com/posts/16895/&quot;&gt;UE4 Hot Update: Questions &amp;amp; Answers&lt;/a&gt;. If you encounter issues, please check this FAQ page first.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/categories/UnrealEngine/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="HotPatcher" scheme="https://en.imzlp.com/tags/HotPatcher/"/>
    
  </entry>
  
  <entry>
    <title>Integrate ZSTD compression algorithm for UE4 using ModularFeature</title>
    <link href="https://en.imzlp.com/posts/8470/"/>
    <id>https://en.imzlp.com/posts/8470/</id>
    <published>2020-04-20T21:52:56.000Z</published>
    <updated>2020-04-20T21:52:56.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;UE uses &lt;code&gt;Zlib&lt;/code&gt; by default as the compression algorithm for packaging resources, but it is not the best choice in terms of compression ratio and decompression speed. The efficiency comparison of various compression algorithms can be seen from the &lt;a href=&quot;https://quixdb.github.io/squash-benchmark/&quot;&gt;Squash Compression Benchmark&lt;/a&gt;. I chose the Facebook open-source &lt;a href=&quot;https://facebook.github.io/zstd/&quot;&gt;ZStandard&lt;/a&gt; to replace Zlib, as ZSTD provides a good compression ratio while also having decent decompression speed. This article will not only explain how to integrate a compression algorithm into UE but will also briefly introduce a modular organization method for some features in UE—&lt;code&gt;ModularFeature&lt;/code&gt;. Using this method makes it easy to replace certain functionalities, and the replacement compression algorithm in this article serves as a practical example.&lt;/p&gt;
&lt;p&gt;I integrated &lt;a href=&quot;https://facebook.github.io/zstd/&quot;&gt;ZSTD&lt;/a&gt; into UE by writing a plugin. The source code is available on GitHub: &lt;a href=&quot;https://github.com/hxhb/ue-zstd&quot;&gt;hxhb/ue-zstd&lt;/a&gt;, which supports Android, Windows, iOS, and macOS. Feel free to give it a star.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="插件开发" scheme="https://en.imzlp.com/categories/UnrealEngine/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
    
    <category term="压缩算法" scheme="https://en.imzlp.com/categories/UnrealEngine/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/%E5%8E%8B%E7%BC%A9%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="插件开发" scheme="https://en.imzlp.com/tags/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
    
    <category term="ZSTD" scheme="https://en.imzlp.com/tags/ZSTD/"/>
    
    <category term="压缩算法" scheme="https://en.imzlp.com/tags/%E5%8E%8B%E7%BC%A9%E7%AE%97%E6%B3%95/"/>
    
  </entry>
  
  <entry>
    <title>UE hot update: Lua programming guide based on UnLua</title>
    <link href="https://en.imzlp.com/posts/36659/"/>
    <id>https://en.imzlp.com/posts/36659/</id>
    <published>2020-03-24T10:50:17.000Z</published>
    <updated>2021-06-22T11:08:09.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;UE uses C++ as a compiled language, which means it becomes binary after compilation, and players can only update the game by reinstalling it. However, in game development, there’s often an urgent need for requirement adjustments and bug fixes, and frequently prompting players to update the app is unacceptable. Generally, game projects use Lua as the scripting language to transform the immutable C++ code at runtime into updatable Lua code.&lt;/p&gt;
&lt;p&gt;Although UE does not officially support Lua, Tencent has open-sourced &lt;a href=&quot;https://github.com/Tencent/UnLua&quot;&gt;UnLua&lt;/a&gt;, which is being used in my current project. Over the past few days, I’ve organized some materials on UnLua (mainly the official documentation, issues, and presentation PPT) and combined it with my own experience from testing UnLua while writing a small demo, resulting in this programming guide for UE combined with UnLua. This article summarizes some basic methods and pitfalls for using UnLua to write business logic and will be updated continuously.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Additionally, Lua files can be packaged into Pak using my previously open-sourced tool: &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;hxhb/HotPatcher&lt;/a&gt;. I’ve also modified a version based on UnLua, adding some extra optimizations. The source code integrates the &lt;a href=&quot;https://github.com/diegonehab/luasocket&quot;&gt;Luasocket&lt;/a&gt;/&lt;a href=&quot;https://github.com/Tencent/LuaPanda&quot;&gt;Luapanda&lt;/a&gt;/&lt;code&gt;lpeg&lt;/code&gt;/&lt;code&gt;Sproto&lt;/code&gt;/&lt;code&gt;Luacrypt&lt;/code&gt; libraries, and you can use &lt;a href=&quot;https://github.com/Tencent/LuaPanda&quot;&gt;LuaPanda&lt;/a&gt; for debugging. The GitHub address is: &lt;a href=&quot;https://github.com/hxhb/debugable-unlua&quot;&gt;hxhb/debugable-unlua&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="Lua" scheme="https://en.imzlp.com/categories/UnrealEngine/Lua/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="Lua" scheme="https://en.imzlp.com/tags/Lua/"/>
    
    <category term="UnLua" scheme="https://en.imzlp.com/tags/UnLua/"/>
    
  </entry>
  
  <entry>
    <title>The Differences and Relationships between UEC++ and Standard C++</title>
    <link href="https://en.imzlp.com/posts/20425/"/>
    <id>https://en.imzlp.com/posts/20425/</id>
    <published>2020-02-11T11:22:44.000Z</published>
    <updated>2020-02-11T11:22:44.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Due to the impact of &lt;a href=&quot;https://g.co/kgs/oevWTp&quot;&gt;COVID-19&lt;/a&gt;, I’ve been confined at home throughout the Spring Festival, and I haven’t returned to work yet. I can only read books and organize my notes, hoping the pandemic ends soon and that my friends stay healthy.&lt;br&gt;The main content of this article is to analyze the differences in syntax between the C++ used in UE development and &lt;strong&gt;standard C++&lt;/strong&gt;. UEC++ is essentially a superset of C++, supporting and utilizing all features of C++, but it has built its own syntax on top of the standard features. Many compilation issues during development can only be quickly and accurately identified at different stages by understanding the boundaries between the two. For those who learned C++ before using UE, this isn’t a problem, but for students who first encounter UE and then gradually learn C++, this can be quite a significant issue.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Standard C++&lt;/strong&gt; is based on the language standard &lt;strong&gt;ISO/IEC 14882&lt;/strong&gt; (C++98/03/11/14/17, etc.), while UEC++ is Epic’s extended usage built on standard C++. This article will not cover topics like GC or reflection or various libraries in UE, focusing instead on the core syntax level.  &lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/UnrealEngine/C/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
  </entry>
  
  <entry>
    <title>Modify the default data storage path for Android games</title>
    <link href="https://en.imzlp.com/posts/20367/"/>
    <id>https://en.imzlp.com/posts/20367/</id>
    <published>2020-01-22T09:10:02.000Z</published>
    <updated>2020-01-22T09:10:02.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;By default, after packaging a game with UE and installing the Apk on a phone, launching the game will create the game’s data directory under &lt;code&gt;/storage/emulated/0/UE4Game/&lt;/code&gt; (which is at the root of the internal storage). According to Google’s rules, it is best for each app’s data files to be placed in their own private directory. Therefore, I want to put all the game’s data packaged by UE into the directory &lt;code&gt;/storage/emulated/0/Android/data/PACKAGE_NAME&lt;/code&gt; (regardless of whether it’s log, ini, or crash information).&lt;br&gt;This seemingly simple requirement has several different approaches involving UE4’s path management, JNI, Android Manifest, and analysis of UBT code.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="Android" scheme="https://en.imzlp.com/categories/UnrealEngine/Android/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="Android" scheme="https://en.imzlp.com/tags/Android/"/>
    
  </entry>
  
  <entry>
    <title>HotPatcher: A open source UE resource hot patching tool</title>
    <link href="https://en.imzlp.com/posts/17590/"/>
    <id>https://en.imzlp.com/posts/17590/</id>
    <published>2020-01-15T09:41:30.000Z</published>
    <updated>2020-08-31T17:27:31.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;&lt;strong&gt;Important Notice: The author does not have any platform or channel to record paid courses and does not endorse any commercial activities by third parties. Please stay vigilant and be cautious of scams.&lt;/strong&gt;&lt;br&gt;&lt;strong&gt;The open source license of this software: Allows free use of features in commercial projects, but does not allow any third party to charge any form of secondary fees based on this plugin, including but not limited to recording paid courses, secondary distribution of the plugin and code, etc.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt; is a tool used for managing hot updates and resource packaging, aimed at tracking changes in original resources of project versions to generate patches. It supports one-click cooking for multiple platforms, one-click packaging for multiple platform patches, and editor support for Windows and MacOS. Writing a process to download patches from a server creates a complete hot update solution for games. &lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt; has been used in many UE projects and will continue to update to support new engine versions. Issues are welcome.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/hxhb/HotPatcher&quot;&gt;HotPatcher&lt;/a&gt; differs from the Patch mechanism in UnrealFrontEnd; there are some issues with UE’s Patch management for projects: based on the original project version, it is difficult to generate identical patches on different computers, it is not possible to generate a new patch based on the version of a patch, and the content included in a patch cannot be previewed intuitively. Additionally, it is not convenient to package external files into pak (such as lua files, db, and other non-assets, which often reside outside the Content directory), nor to manage project and patch versions easily.&lt;/p&gt;
&lt;p&gt;This plugin is designed to solve such issues by using the project’s original resources as the version basis, only needing to manage the project itself without paying attention to other files generated by UE. It allows easy operations such as cooking, generating pak, extracting resource information from basic packages, diff between versions, and patch splitting. It has very rich configuration options and Commandlet support, making it convenient to achieve an automated hot update packaging process.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The currently supported engine versions are UE4.21-UE5, and support for the IoStore mechanism is provided! Many friends have contacted me privately to inquire about plugin-related issues, so I created a group to discuss UE hot updates and the HotPatcher plugin (QQ group 958363331). You are welcome to join and exchange technical knowledge related to UE.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;To conveniently collect and manage common questions and solutions regarding hot updates and the HotPatcher, I have created a new article to document and organize: &lt;a href=&quot;https://imzlp.com/posts/16895/&quot;&gt;UE4 Hot Update: Questions &amp;amp; Answers&lt;/a&gt;. If you encounter problems, you can check this FAQ page first. Regarding the issue that many people have reported about the inconsistency between the configuration parameters in the plugin and the previous recorded video, it is because the plugin has undergone many updates. You can check the &lt;a href=&quot;https://imzlp.com/posts/17590/#Update-Log&quot;&gt;Change Log&lt;/a&gt; for detailed changes for each version.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/categories/UnrealEngine/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="热更新" scheme="https://en.imzlp.com/tags/%E7%83%AD%E6%9B%B4%E6%96%B0/"/>
    
    <category term="HotPatcher" scheme="https://en.imzlp.com/tags/HotPatcher/"/>
    
  </entry>
  
  <entry>
    <title>Design specifications and code standards for UE projects</title>
    <link href="https://en.imzlp.com/posts/25915/"/>
    <id>https://en.imzlp.com/posts/25915/</id>
    <published>2020-01-01T11:55:16.000Z</published>
    <updated>2020-01-01T11:55:16.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Recently, a new project has been initiated, summarizing some issues from previous projects and listing design specifications and code standards for UE development projects (the term “code standards” seems too strict; coding habits are quite subjective, and “coding conventions” would be a better term, but strict execution is necessary for promotion within the team). This article will be continuously updated and organized, and feedback and discussions are welcome.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="代码规范" scheme="https://en.imzlp.com/tags/%E4%BB%A3%E7%A0%81%E8%A7%84%E8%8C%83/"/>
    
  </entry>
  
  <entry>
    <title>Become a content creator for the Unreal Engine Marketplace</title>
    <link href="https://en.imzlp.com/posts/1927/"/>
    <id>https://en.imzlp.com/posts/1927/</id>
    <published>2019-12-08T22:49:19.000Z</published>
    <updated>2019-12-08T22:49:19.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Last week, I uploaded a plugin I had previously written, &lt;a href=&quot;https://www.unrealengine.com/marketplace/en-US/slug/exportnavigation&quot;&gt;ExortNavigation&lt;/a&gt;, to the Unreal Marketplace. I familiarized myself with the submission process for UE code plugins and would like to document it here.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="插件开发" scheme="https://en.imzlp.com/categories/UnrealEngine/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
    
    <category term="Marketplace" scheme="https://en.imzlp.com/categories/UnrealEngine/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/Marketplace/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="虚幻商城" scheme="https://en.imzlp.com/tags/%E8%99%9A%E5%B9%BB%E5%95%86%E5%9F%8E/"/>
    
    <category term="Epic Marketplace" scheme="https://en.imzlp.com/tags/Epic-Marketplace/"/>
    
    <category term="插件开发" scheme="https://en.imzlp.com/tags/%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>Export Recast Navigation Data from UE4</title>
    <link href="https://en.imzlp.com/posts/20203/"/>
    <id>https://en.imzlp.com/posts/20203/</id>
    <published>2019-11-01T09:18:13.000Z</published>
    <updated>2019-11-01T09:18:13.000Z</updated>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;The latest version supports UE5, see the UE5.0 branch on github: &lt;a href=&quot;https://github.com/hxhb/ue4-export-nav-data/tree/UE5.0&quot;&gt;ue4-export-nav-data/tree/UE5.0&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/recastnavigation/recastnavigation&quot;&gt;Recast Navigation&lt;/a&gt; is an open-source game navigation/pathfinding engine that provides pathfinding calculations for AI in games. Both UE and Unity integrate RecastNavigation to provide navigation and pathfinding calculations for games (of course, in modified versions). The UE modules &lt;code&gt;NavigationSystem&lt;/code&gt; and &lt;code&gt;NavMesh&lt;/code&gt; contain relevant code implementations. Recently, there was a requirement to export the client’s map information to a server with a non-UE network architecture, for verifying player locations on the server. It occurred to me that the navigation data generated by the client could be exported as a &lt;strong&gt;map&lt;/strong&gt; of the client world, so I tinkered and wrote a UE plugin (open-sourced on Github: &lt;strong&gt;&lt;a href=&quot;https://github.com/hxhb/ue4-export-nav-data&quot;&gt;ue4-export-nav-data&lt;/a&gt;&lt;/strong&gt;) that implements &lt;strong&gt;directly&lt;/strong&gt; exporting the navigation data generated by UE. If interested, you can directly view the specific code. Based on the exported navigation data, pathfinding calculations based on &lt;a href=&quot;https://github.com/recastnavigation/recastnavigation&quot;&gt;Recast Navigation&lt;/a&gt; can be fully implemented on the server with a non-UE network architecture, seamlessly integrated with UE.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2019.12.04 Update:&lt;/strong&gt; This plugin has been listed on the Unreal Marketplace, purchase link &lt;a href=&quot;https://unrealengine.com/marketplace/en-US/slug/exportnavigation&quot;&gt;ExportNavigation&lt;/a&gt;. In support of programmer sentiment for open-source, this project’s repository on Github will not be closed, but it is unlikely to be updated. If this plugin is useful to you, feel free to purchase it on the marketplace to support the author.&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="Recast" scheme="https://en.imzlp.com/tags/Recast/"/>
    
    <category term="Navigation" scheme="https://en.imzlp.com/tags/Navigation/"/>
    
  </entry>
  
  <entry>
    <title>Oculus Quest Development with UE4</title>
    <link href="https://en.imzlp.com/posts/30042/"/>
    <id>https://en.imzlp.com/posts/30042/</id>
    <published>2019-09-24T10:41:10.000Z</published>
    <updated>2020-09-17T21:31:19.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;&lt;a href=&quot;https://www.oculus.com/quest/&quot;&gt;Oculus Quest&lt;/a&gt; is the new generation of all-in-one VR headset released by Oculus, supporting 6DoF, with no need for a PC connection or additional positioning base stations. It also supports Guardian; when the user walks out of the positioning boundary while wearing the headset, real-world visuals will immediately display in the headset to prevent accidental mishaps.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.oculus.com/quest/&quot;&gt;Oculus Quest&lt;/a&gt; features two &lt;code&gt;Pentile OLED&lt;/code&gt; screens, with a single-eye resolution of &lt;code&gt;1440x1600&lt;/code&gt; and a refresh rate of &lt;code&gt;72Hz&lt;/code&gt;, powered by a &lt;code&gt; Qualcomm Snapdragon 835&lt;/code&gt; processor based on the &lt;code&gt;arm&lt;/code&gt; architecture, which is the same as the flagship processors from two years ago (such as Xiaomi 6, Samsung S8).&lt;/p&gt;
&lt;p&gt;Quest employs the &lt;code&gt;Oculus Insight&lt;/code&gt; (inside-out tracking) positioning solution, using four cameras located at the four corners of the headset panel for positional tracking.&lt;br&gt;The introduction of Oculus Insight during the release event: &lt;a href=&quot;https://www.youtube.com/watch?v=2jY3B_F3GZk&quot;&gt;Oculus Insight VR Positional Tracking System (Sep 2018)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;And a video of a user’s test of Quest’s tracking range abroad: &lt;a href=&quot;https://drive.google.com/file/d/1-bqNmwUi8J57yykxLP6szgiLeU3IgdgL/view&quot;&gt;Quest Distance Test&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The 64G storage version of &lt;code&gt;Oculus Quest&lt;/code&gt; is priced at $399, while the 128G version costs $499, with tax-excluded prices roughly around 3500; compared to HTC’s similar new product (HTC Vive Focus), it is significantly cheaper, and it offers even greater advantages over PC-Based VR since it does not require a high-performance host. I believe that 6DoF all-in-one VR devices must be the trend of the future!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Before the National Day holiday at OC6, Oculus announced two technologies: Oculus Link and finger tracking, both are impressive and promising.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The entire Quest device is about the same size as a &lt;code&gt;10.5&lt;/code&gt; inch iPad, making it easy to carry in a small bag:&lt;br&gt;&lt;img src=&quot;https://img.imzlp.com/imgs/zlp/blog/posts/30042/20190925000314.webp&quot;&gt;&lt;/p&gt;
&lt;p&gt;There’s no need to elaborate on the specifications of the Quest device; the main content of this article will focus on the environment setup, development documentation, debugging tools, and additional considerations when using UE to develop Quest projects, which will be updated continuously.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="VR" scheme="https://en.imzlp.com/categories/UnrealEngine/VR/"/>
    
    <category term="Quest" scheme="https://en.imzlp.com/categories/UnrealEngine/VR/Quest/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="VR" scheme="https://en.imzlp.com/tags/VR/"/>
    
    <category term="OculusQuest" scheme="https://en.imzlp.com/tags/OculusQuest/"/>
    
  </entry>
  
  <entry>
    <title>UE Build System：Target and Module</title>
    <link href="https://en.imzlp.com/posts/16643/"/>
    <id>https://en.imzlp.com/posts/16643/</id>
    <published>2019-09-12T13:14:22.000Z</published>
    <updated>2019-09-12T13:14:22.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Module is the basic element that constitutes Unreal. Each Module encapsulates and implements a set of functions, which can be used by other Modules. The entire Unreal Engine is driven by the combination of various Modules, and even the game project that we create is a separate Module.&lt;/p&gt;
&lt;p&gt;So how does UE create and build these Modules? This is the main purpose of writing this article, to study Unreal’s build system and the various properties they support (Target and Module).&lt;/p&gt;
&lt;p&gt;It is recommended to read my previous article before looking at this one: &lt;a href=&quot;https://imzlp.com/posts/6362/&quot;&gt;Build flow of the Unreal Engine4 project&lt;/a&gt;, which mainly outlines the build process of UE; this article is merely one part of the UE build system.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="Build System" scheme="https://en.imzlp.com/categories/UnrealEngine/Build-System/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="UBT" scheme="https://en.imzlp.com/tags/UBT/"/>
    
  </entry>
  
  <entry>
    <title>UE tool chain configuration and development skills</title>
    <link href="https://en.imzlp.com/posts/12143/"/>
    <id>https://en.imzlp.com/posts/12143/</id>
    <published>2019-09-09T23:32:08.000Z</published>
    <updated>2019-09-09T23:32:08.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;工欲善其事，必先利其器！Mastering the right tools can elevate development efficiency to a new level.&lt;br&gt;This article is a compilation of notes I usually keep in &lt;a href=&quot;https://imzlp.com/notes&quot;&gt;notes&lt;/a&gt; about the UE toolchain and some configuration and usage tips for tools using UE. Future content in this area will also be included in this article.&lt;br&gt;Below are some standalone articles I previously wrote about the UE toolchain or relevant extensions:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/9050/&quot;&gt;Analyzing the Content Distribution Restrictions of EULA in UBT&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/31962/&quot;&gt;Create A Standalone Application in UE4&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/6362/&quot;&gt;Build flow of the Unreal Engine4 project&lt;/a&gt;  &lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://imzlp.com/posts/11515/&quot;&gt;Scraping UE4 API and Generating Indexed Dash Documentation&lt;/a&gt;  &lt;/li&gt;
&lt;/ul&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
  </entry>
  
  <entry>
    <title>Analyzing the content distribution restrictions of EULA in UBT</title>
    <link href="https://en.imzlp.com/posts/9050/"/>
    <id>https://en.imzlp.com/posts/9050/</id>
    <published>2019-08-24T14:15:36.000Z</published>
    <updated>2019-08-24T14:15:36.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;The &lt;a href=&quot;https://www.unrealengine.com/en-US/eula&quot;&gt;EULA&lt;/a&gt; &lt;strong&gt;License Grant/(A)&lt;/strong&gt; of UE clearly states that content developed using UE and redistributed must not include &lt;strong&gt;uncooked source formats&lt;/strong&gt; or paid content developed based on &lt;strong&gt;engine tools&lt;/strong&gt;. This article studies the specific content distribution details in the EULA and how to technically circumvent this limitation.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="UBT" scheme="https://en.imzlp.com/categories/UnrealEngine/UBT/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="EULA" scheme="https://en.imzlp.com/tags/EULA/"/>
    
  </entry>
  
  <entry>
    <title>PixelStreaming: Basic Concepts and Getting Started</title>
    <link href="https://en.imzlp.com/posts/9455/"/>
    <id>https://en.imzlp.com/posts/9455/</id>
    <published>2019-07-30T17:48:27.000Z</published>
    <updated>2019-07-30T17:48:27.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;PixelStreaming is a technology supported by UE_4.21 that enables games to run on a server, allowing players to play via a browser. The player side requires no additional operation, only needing a browser, while all logic processing and rendering occurs in the “cloud.” It is not merely a plugin (although there is the PixelStreamingPlugin, which is just one part of the &lt;strong&gt;PixelStreaming&lt;/strong&gt; implementation). Its implementation has a distinct design and organizational approach independent of UE games.&lt;br&gt;This article mainly introduces the basic concepts of PixelStreaming and shares practical experiences with the Demo using PixelStreaming.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="PixelStreaming" scheme="https://en.imzlp.com/categories/UnrealEngine/PixelStreaming/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="Pixel Streaming" scheme="https://en.imzlp.com/tags/Pixel-Streaming/"/>
    
  </entry>
  
  <entry>
    <title>UE Modules:Find the DLL and load it</title>
    <link href="https://en.imzlp.com/posts/31203/"/>
    <id>https://en.imzlp.com/posts/31203/</id>
    <published>2019-07-16T18:23:29.000Z</published>
    <updated>2019-07-16T18:23:29.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;On Windows, UE modules are loaded via DLL lookup in non-&lt;code&gt;IS_MONOLITHIC&lt;/code&gt; (Monolithic) mode, which means they are not packed into a single executable file. You can call functions like &lt;code&gt;LoadModuleWithFailureReason&lt;/code&gt; or &lt;code&gt;LoadModuleChecked&lt;/code&gt; from &lt;code&gt;FModuleManager&lt;/code&gt; to load a module by passing its string name. This article serves as an extension and supplement to &lt;a href=&quot;https://imzlp.com/posts/24007/&quot;&gt;UE4 Modules: Load and Startup&lt;/a&gt;, focusing on the details of DLL lookup and loading for modules rather than the timing and order of engine startup and module loading.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
  </entry>
  
  <entry>
    <title>UE access to SteamSDK and related information</title>
    <link href="https://en.imzlp.com/posts/3231/"/>
    <id>https://en.imzlp.com/posts/3231/</id>
    <published>2019-05-27T23:02:17.000Z</published>
    <updated>2019-05-27T23:02:17.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;To launch a game on &lt;a href=&quot;https://store.steampowered.com/&quot;&gt;Steam&lt;/a&gt;, it is necessary to integrate the &lt;a href=&quot;https://partner.steamgames.com/doc/sdk&quot;&gt;SteamSDK&lt;/a&gt;. This article briefly introduces the method of integrating &lt;a href=&quot;https://partner.steamgames.com/doc/sdk&quot;&gt;SteamSDK&lt;/a&gt; in UE4, with future content related to integrating Steam platform services also included in this article.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The integration of SteamSDK allows the game to connect with the Steam community, which has a robust community ecosystem that Epic’s newly launched &lt;a href=&quot;https://www.epicgames.com/store/e/en-US/&quot;&gt;Epic Games Store&lt;/a&gt; cannot currently compete with~(of course, I support market competition).&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="Steam" scheme="https://en.imzlp.com/tags/Steam/"/>
    
    <category term="SteamSDK" scheme="https://en.imzlp.com/tags/SteamSDK/"/>
    
  </entry>
  
  <entry>
    <title>UE code analysis: GConfig loading</title>
    <link href="https://en.imzlp.com/posts/2386/"/>
    <id>https://en.imzlp.com/posts/2386/</id>
    <published>2019-05-27T22:57:58.000Z</published>
    <updated>2020-05-28T18:02:53.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;The UE4 provides a mature configuration mechanism for INI files, and the engine uses ini as configuration files for both the engine and projects. This article will briefly analyze the loading of GConfig in the engine.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
  </entry>
  
  <entry>
    <title>UE development problem notes and data collection</title>
    <link href="https://en.imzlp.com/posts/25331/"/>
    <id>https://en.imzlp.com/posts/25331/</id>
    <published>2019-05-27T22:07:50.000Z</published>
    <updated>2019-05-27T22:07:50.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In daily development and learning, I have encountered and resolved some issues and collected some materials, which I have casually written down in &lt;a href=&quot;https://imzlp.com/notes/&quot;&gt;notes&lt;/a&gt;. I have accumulated a fair amount related to UE, while other topics are mixed together and relatively chaotic. I have organized them into this article. Unlike the &lt;a href=&quot;https://imzlp.com/posts/3380/&quot;&gt;UE4 and VR Development Technical Notes&lt;/a&gt;, the content here is more focused on actual problem records and material collection within projects.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
  </entry>
  
  <entry>
    <title>HTC Vive Tracker Developer Guide</title>
    <link href="https://en.imzlp.com/posts/2125/"/>
    <id>https://en.imzlp.com/posts/2125/</id>
    <published>2019-04-03T11:41:23.000Z</published>
    <updated>2019-04-10T09:42:32.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;HTC released the Vive accessory &lt;a href=&quot;https://www.vive.com/us/vive-tracker/&quot;&gt;Vive Tracker&lt;/a&gt; to expand devices connected to SteamVR. It also features Pogo pins, allowing users to DIY special function accessories. Recently, I’ve seen some amazing creative uses of the &lt;a href=&quot;https://www.vive.com/us/vive-tracker/&quot;&gt;Vive Tracker&lt;/a&gt;. Relevant materials and technical details are organized in this article.&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="VR" scheme="https://en.imzlp.com/tags/VR/"/>
    
    <category term="HTCVive" scheme="https://en.imzlp.com/tags/HTCVive/"/>
    
    <category term="ViveTracker" scheme="https://en.imzlp.com/tags/ViveTracker/"/>
    
    <category term="MR" scheme="https://en.imzlp.com/tags/MR/"/>
    
  </entry>
  
  <entry>
    <title>Create A Standalone Application in UE4</title>
    <link href="https://en.imzlp.com/posts/31962/"/>
    <id>https://en.imzlp.com/posts/31962/</id>
    <published>2019-03-30T18:14:46.000Z</published>
    <updated>2020-03-18T14:10:55.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Although UE is a &lt;strong&gt;game engine&lt;/strong&gt;, it is not limited to writing games—you can even use it to write Win32 GUI applications 😏. Typically, we create a UE game project using the Editor and build our own classes based on it for use in the game. However, if you don’t want to create a game project, UE also supports Standalone Applications that can construct their own programs autonomously from the &lt;code&gt;main&lt;/code&gt; function, fully controlling which Modules to enable without relying on the engine’s own logical architecture. This can also serve as a lightweight method for learning and testing UE modules.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: UE does not provide a direct method to create a Standalone Application, so I wrote a tool to create a &lt;code&gt;Program&lt;/code&gt; project: &lt;a href=&quot;https://github.com/hxhb/ue4program&quot;&gt;hxhb/ue4program&lt;/a&gt;, and implemented a demo for a standalone tool: &lt;a href=&quot;https://github.com/hxhb/UE4Launcher&quot;&gt;hxhb/UE4Launcher&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="工具开发" scheme="https://en.imzlp.com/categories/UnrealEngine/%E5%B7%A5%E5%85%B7%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="工具开发" scheme="https://en.imzlp.com/tags/%E5%B7%A5%E5%85%B7%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>LaTeX Mathematical Symbols Quick Lookup Table</title>
    <link href="https://en.imzlp.com/posts/23224/"/>
    <id>https://en.imzlp.com/posts/23224/</id>
    <published>2019-03-22T00:27:13.000Z</published>
    <updated>2019-03-22T11:25:15.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Recently, while reading &lt;a href=&quot;https://book.douban.com/subject/30426701/&quot;&gt;The Dragon Book DX12&lt;/a&gt;, I’ve been using LaTeX to document some formulas. To facilitate searching, I’ve compiled a table of commonly used LaTeX mathematical symbols syntax. More symbols can be found at &lt;a href=&quot;https://artofproblemsolving.com/wiki/index.php/LaTeX:Symbols&quot;&gt;LaTeX:Symbols&lt;/a&gt;.&lt;/p&gt;</summary>
    
    
    
    <category term="LaTex" scheme="https://en.imzlp.com/categories/LaTex/"/>
    
    
    <category term="LaTeX" scheme="https://en.imzlp.com/tags/LaTeX/"/>
    
  </entry>
  
  <entry>
    <title>Engine Source Analysis: Module Loading and Startup</title>
    <link href="https://en.imzlp.com/posts/24007/"/>
    <id>https://en.imzlp.com/posts/24007/</id>
    <published>2019-03-19T11:11:57.000Z</published>
    <updated>2019-03-30T15:38:27.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;UE is a modular architecture, where Engine/Game Project/StandaloneApplication/Plugins are all Modules (&lt;a href=&quot;http://api.unrealengine.com/INT/API/index.html&quot;&gt;Unreal Engine API Reference&lt;/a&gt; lists the Modules provided by the Engine). This article analyzes how UE’s Modules are loaded and started via &lt;code&gt;FModuleManager::LoadModule&lt;/code&gt; using the code from &lt;code&gt;FModuleManager&lt;/code&gt;.&lt;/p&gt;</summary>
    
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
  </entry>
  
  <entry>
    <title>Build flow of the Unreal Engine4 project</title>
    <link href="https://en.imzlp.com/posts/6362/"/>
    <id>https://en.imzlp.com/posts/6362/</id>
    <published>2019-03-16T23:09:52.000Z</published>
    <updated>2019-09-16T19:01:45.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;UE builds projects through UBT (whether using Build in VS or Compile in the Editor, it eventually calls UBT). UBT and UHT are the cornerstones of the UE toolchain, and due to the vast amount of content, it is impossible to analyze everything at once. Let’s outline the main points now and supplement them later as time allows.&lt;/p&gt;</summary>
    
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="UBT" scheme="https://en.imzlp.com/tags/UBT/"/>
    
    <category term="UHT" scheme="https://en.imzlp.com/tags/UHT/"/>
    
  </entry>
  
  <entry>
    <title>C++ Polymorphism and Virtual Function Table</title>
    <link href="https://en.imzlp.com/posts/25558/"/>
    <id>https://en.imzlp.com/posts/25558/</id>
    <published>2019-02-26T13:36:47.000Z</published>
    <updated>2019-02-27T11:47:32.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;C++ is a language that supports object-oriented programming (object-oriented Programming), with inheritance and polymorphism (Polymorphic) being its most important features. There has been considerable discussion in previous articles about various aspects of C++ inheritance and class member content. This article primarily investigates one implementation method of C++ polymorphism by the compiler: &lt;strong&gt;virtual function tables&lt;/strong&gt;. &lt;/p&gt;
&lt;p&gt;The C++ standard (&lt;strong&gt;[IOS/IEC 14882:2014]&lt;/strong&gt;) states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Virtual functions support dynamic binding and object-oriented programming. A class that declares or inherits a virtual function is called a polymorphic class.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Note: &lt;strong&gt;The C++ standard does not specify how polymorphism is implemented&lt;/strong&gt;, so the implementation of polymorphism by the compiler is &lt;code&gt;Implementation-defined Behavior&lt;/code&gt;, meaning different compilers may implement polymorphism differently, and &lt;strong&gt;different platforms may yield different experimental results&lt;/strong&gt;.&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="多态" scheme="https://en.imzlp.com/tags/%E5%A4%9A%E6%80%81/"/>
    
    <category term="polymorphic" scheme="https://en.imzlp.com/tags/polymorphic/"/>
    
    <category term="虚函数表" scheme="https://en.imzlp.com/tags/%E8%99%9A%E5%87%BD%E6%95%B0%E8%A1%A8/"/>
    
  </entry>
  
  <entry>
    <title>UE Package Error:ObservedKeyNames.Num()&gt;0</title>
    <link href="https://en.imzlp.com/posts/359/"/>
    <id>https://en.imzlp.com/posts/359/</id>
    <published>2019-01-17T09:50:36.000Z</published>
    <updated>2019-01-17T09:50:36.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Recently, I encountered a very strange error during the project packaging:&lt;/p&gt;
&lt;figure class=&quot;highlight txt&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;// package log&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;Ensure condition failed: ObservedKeyNames.Num() &amp;gt; 0 [File:D:&#92;Build&#92;++UE4+Release-4.18+Compile&#92;Sync&#92;Engine&#92;Source&#92;Runtime&#92;AIModule&#92;Private&#92;BehaviorTree&#92;Decorators&#92;BTDecorator_BlueprintBase.cpp] [Line: 67]&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;&lt;img src=&quot;https://img.imzlp.com/imgs/zlp/blog/posts/359/ue-package-error-ObservedKeyNames-Num.png&quot;&gt;&lt;br&gt;I debugged the UE4 code and analyzed the cause and solution process.&lt;/p&gt;</summary>
    
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
  </entry>
  
  <entry>
    <title>Macro defined by UBT in UE4</title>
    <link href="https://en.imzlp.com/posts/5214/"/>
    <id>https://en.imzlp.com/posts/5214/</id>
    <published>2019-01-09T18:17:35.000Z</published>
    <updated>2019-01-09T18:17:35.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;UE4 Engine defines many macros and some processing logic within the engine, such as &lt;code&gt;WITH_ENGINE&lt;/code&gt;/&lt;code&gt;WITH_EDITOR&lt;/code&gt;, etc. Some of these are defined by UBT through reading the configurations in &lt;code&gt;*.target.cs&lt;/code&gt; files, and some logic is processed by reading configurations in &lt;code&gt;*.Build.cs&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I have read some of the UBT code and extracted part of the configuration files (&lt;code&gt;Target.cs&lt;/code&gt;/&lt;code&gt;Build.cs&lt;/code&gt;) parameters and their mutual definitions with MACROs as a quick reference manual.&lt;br&gt;You can view the parameters in &lt;code&gt;*.Target.cs&lt;/code&gt; here: &lt;a href=&quot;https://docs.unrealengine.com/en-US/Programming/BuildTools/UnrealBuildTool/TargetFiles/index.html&quot;&gt;UnrealBuildSystem/Targets&lt;/a&gt;&lt;br&gt;You can view the parameters in &lt;code&gt;*.Build.cs&lt;/code&gt; here: &lt;a href=&quot;https://docs.unrealengine.com/en-US/Programming/BuildTools/UnrealBuildTool/ModuleFiles/index.html&quot;&gt;UnrealBuildSystem/ModuleFiles&lt;/a&gt;&lt;br&gt;UE’s build system documentation: &lt;a href=&quot;https://docs.unrealengine.com/en-US/Programming/BuildTools/index.html&quot;&gt;Build Tools&lt;/a&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="UBT" scheme="https://en.imzlp.com/categories/UnrealEngine/UBT/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="UBT" scheme="https://en.imzlp.com/tags/UBT/"/>
    
    <category term="构建系统" scheme="https://en.imzlp.com/tags/%E6%9E%84%E5%BB%BA%E7%B3%BB%E7%BB%9F/"/>
    
  </entry>
  
  <entry>
    <title>Extract Tor and build Tor Bridge</title>
    <link href="https://en.imzlp.com/posts/11177/"/>
    <id>https://en.imzlp.com/posts/11177/</id>
    <published>2018-11-04T19:36:04.000Z</published>
    <updated>2018-11-05T10:29:09.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Tor’s Bridge, if widely disseminated, may get blocked within a few days, so frequently changing it can be a hassle (this reminds me of the days when I modified the hosts file to access Google). Today, I tinkered a bit and built a Tor Bridge on my VPS for personal use. Additionally, I extracted tor from the &lt;a href=&quot;https://www.torproject.org/projects/torbrowser.html.en&quot;&gt;Tor Browser&lt;/a&gt; so that it doesn’t rely on the Tor Browser and can be used with other browsers.&lt;br&gt;&lt;strong&gt;Warning&lt;/strong&gt;: Deploying a Bridge &lt;strong&gt;may&lt;/strong&gt; increase the probability of the server being blocked.  &lt;/p&gt;</summary>
    
    
    
    <category term="网络工具" scheme="https://en.imzlp.com/categories/%E7%BD%91%E7%BB%9C%E5%B7%A5%E5%85%B7/"/>
    
    <category term="tor" scheme="https://en.imzlp.com/categories/%E7%BD%91%E7%BB%9C%E5%B7%A5%E5%85%B7/tor/"/>
    
    
    <category term="暗网" scheme="https://en.imzlp.com/tags/%E6%9A%97%E7%BD%91/"/>
    
    <category term="onion" scheme="https://en.imzlp.com/tags/onion/"/>
    
    <category term="Tor" scheme="https://en.imzlp.com/tags/Tor/"/>
    
    <category term="TorBridge" scheme="https://en.imzlp.com/tags/TorBridge/"/>
    
  </entry>
  
  <entry>
    <title>Use of dynamic link libraries: loading and linking</title>
    <link href="https://en.imzlp.com/posts/18949/"/>
    <id>https://en.imzlp.com/posts/18949/</id>
    <published>2018-10-15T20:50:34.000Z</published>
    <updated>2018-10-15T20:50:34.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In some SDK integrations, some platforms provide only the DLL without an import library for us to use. In this case, we can only use code to load the DLL to call functions within it. This article documents two usage methods and analyzes their pros and cons.&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="动态链接库" scheme="https://en.imzlp.com/tags/%E5%8A%A8%E6%80%81%E9%93%BE%E6%8E%A5%E5%BA%93/"/>
    
  </entry>
  
  <entry>
    <title>Crawl UE API and generate Dash documents with indexes</title>
    <link href="https://en.imzlp.com/posts/11515/"/>
    <id>https://en.imzlp.com/posts/11515/</id>
    <published>2018-07-05T23:43:43.000Z</published>
    <updated>2021-11-22T10:55:31.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;不知为何，&lt;a href=&quot;http://api.unrealengine.com/INT/API/index.html&quot;&gt;UE API&lt;/a&gt;现在已经不随引擎发布chm的离线文档了，官方发布的最新版本还是2014年的，UE发展到现在有了很多变化，显然四年前的API文档已经丧失部分参考价值了。但是UE文档站自身的搜索功能就我的体验而言，十分的烂。&lt;br&gt;所以折腾了一下把UE API的所有页面爬了下来，并且生成了Dash支持的文档，检索起来十分酸爽。(文后附下载链接)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;2022.06.07更新：把API文档更新至UE 5.0.2，可在&lt;a href=&quot;#Update&quot;&gt;文末&lt;/a&gt;下载。。&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="Dash" scheme="https://en.imzlp.com/tags/Dash/"/>
    
    <category term="Zeal" scheme="https://en.imzlp.com/tags/Zeal/"/>
    
  </entry>
  
  <entry>
    <title>Use frp to penetrate the intranet</title>
    <link href="https://en.imzlp.com/posts/5050/"/>
    <id>https://en.imzlp.com/posts/5050/</id>
    <published>2018-06-09T11:40:09.000Z</published>
    <updated>2018-11-10T16:19:17.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;最近想到还有块树莓派在吃灰，今天使用&lt;a href=&quot;https://github.com/fatedier/frp&quot;&gt;frp&lt;/a&gt;折腾了一下内网穿透，把放在家里的树莓派也可以通过外网访问。&lt;/p&gt;</summary>
    
    
    
    <category term="折腾记录" scheme="https://en.imzlp.com/categories/%E6%8A%98%E8%85%BE%E8%AE%B0%E5%BD%95/"/>
    
    <category term="内网穿透" scheme="https://en.imzlp.com/categories/%E6%8A%98%E8%85%BE%E8%AE%B0%E5%BD%95/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/"/>
    
    
    <category term="树莓派" scheme="https://en.imzlp.com/tags/%E6%A0%91%E8%8E%93%E6%B4%BE/"/>
    
    <category term="frp" scheme="https://en.imzlp.com/tags/frp/"/>
    
    <category term="内网穿透" scheme="https://en.imzlp.com/tags/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/"/>
    
  </entry>
  
  <entry>
    <title>UE and VR Development Technical Notes</title>
    <link href="https://en.imzlp.com/posts/3380/"/>
    <id>https://en.imzlp.com/posts/3380/</id>
    <published>2018-06-06T08:16:10.000Z</published>
    <updated>2019-01-17T14:00:15.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Some technical notes written in the daily cursive about UE4 and VR development, as well as some related materials. Previously scattered in &lt;a href=&quot;https://imzlp.com/notes/&quot;&gt;imzlp.com/notes&lt;/a&gt;, they have been organized today, and future notes will be placed in this article.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="VR" scheme="https://en.imzlp.com/categories/UnrealEngine/VR/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="VR" scheme="https://en.imzlp.com/tags/VR/"/>
    
  </entry>
  
  <entry>
    <title>Pass Actor To Next Level Through Seamless Travel</title>
    <link href="https://en.imzlp.com/posts/19376/"/>
    <id>https://en.imzlp.com/posts/19376/</id>
    <published>2018-04-28T00:43:40.000Z</published>
    <updated>2018-04-28T00:43:40.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Because Unreal Engine destroys all objects in the current level when switching levels (&lt;code&gt;OpenLevel&lt;/code&gt;), we often need to retain certain objects for the next level. Today, I read some relevant code, and this article will explain how to achieve this. Unreal’s documentation does mention this (&lt;a href=&quot;https://docs.unrealengine.com/en-us/Gameplay/Networking/Travelling&quot;&gt;Travelling in Multiplayer&lt;/a&gt;), and it’s not too complicated to implement. However, the UE documentation is consistently lacking in detail, especially in Chinese, where resources are very scarce (mostly machine-translated and outdated). I couldn’t find any reliable information during my search, so I took some notes while reading the code implementation.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="Seamlesstravel" scheme="https://en.imzlp.com/tags/Seamlesstravel/"/>
    
  </entry>
  
  <entry>
    <title>Build protobuf with MSVC on Windows</title>
    <link href="https://en.imzlp.com/posts/9903/"/>
    <id>https://en.imzlp.com/posts/9903/</id>
    <published>2018-02-27T10:01:32.000Z</published>
    <updated>2018-02-27T10:01:32.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Recently, I have been using Protobuf in VS, and I will briefly record the process of building Protobuf using MSVC.&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="Protobuf" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/Protobuf/"/>
    
    
    <category term="Protobuf" scheme="https://en.imzlp.com/tags/Protobuf/"/>
    
    <category term="序列化" scheme="https://en.imzlp.com/tags/%E5%BA%8F%E5%88%97%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>Reverse proxy Github Pages to enable HTTPS</title>
    <link href="https://en.imzlp.com/posts/18841/"/>
    <id>https://en.imzlp.com/posts/18841/</id>
    <published>2017-09-07T20:49:29.000Z</published>
    <updated>2018-02-05T13:26:38.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Due to &lt;a href=&quot;https://pages.github.com/&quot;&gt;Github Pages&lt;/a&gt; not supporting &lt;code&gt;custom domain&lt;/code&gt; HTTPS, I spent some time today setting up a reverse proxy from &lt;a href=&quot;https://nginx.org/en/&quot;&gt;Nginx&lt;/a&gt; to &lt;a href=&quot;https://pages.github.com/&quot;&gt;Github Pages&lt;/a&gt; on a VPS. I used a certificate issued by &lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let’s Encrypt&lt;/a&gt; to achieve full HTTPS for the entire site (all external resource links were also changed to HTTPS). Here’s a simple record of the process.&lt;/p&gt;</summary>
    
    
    
    <category term="博客管理" scheme="https://en.imzlp.com/categories/%E5%8D%9A%E5%AE%A2%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="Hexo" scheme="https://en.imzlp.com/tags/Hexo/"/>
    
    <category term="博客管理" scheme="https://en.imzlp.com/tags/%E5%8D%9A%E5%AE%A2%E7%AE%A1%E7%90%86/"/>
    
    <category term="Nginx" scheme="https://en.imzlp.com/tags/Nginx/"/>
    
    <category term="反向代理" scheme="https://en.imzlp.com/tags/%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86/"/>
    
  </entry>
  
  <entry>
    <title>Why can&#39;t we override &amp;&amp; and || and , (comma)?</title>
    <link href="https://en.imzlp.com/posts/11306/"/>
    <id>https://en.imzlp.com/posts/11306/</id>
    <published>2017-06-24T22:21:39.000Z</published>
    <updated>2017-06-24T22:21:39.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;C++ provides two logical operators &lt;code&gt;||&lt;/code&gt; and &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; as well as the &lt;code&gt;,&lt;/code&gt; (comma) operator in its basic syntax. We can overload these operators in a class, but we should avoid doing that. In this article, I will outline the standard descriptions and the reasons why they should not be overloaded. &lt;/p&gt;
&lt;p&gt;In summary, because the built-in &lt;code&gt;||&lt;/code&gt; and &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; have short-circuit evaluation semantics, overloading them turns them into regular function calls, yielding semantics that are entirely different from the built-in &lt;code&gt;||&lt;/code&gt; and &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;. Furthermore, the &lt;code&gt;,&lt;/code&gt; operator has left-to-right evaluation semantics, so if you overload it, it will also become a function call and result in semantics that differ from the built-in version.&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="C++技巧" scheme="https://en.imzlp.com/tags/C-%E6%8A%80%E5%B7%A7/"/>
    
  </entry>
  
  <entry>
    <title>C++ Template Metaprogramming Data Collection</title>
    <link href="https://en.imzlp.com/posts/23043/"/>
    <id>https://en.imzlp.com/posts/23043/</id>
    <published>2017-06-17T23:21:33.000Z</published>
    <updated>2017-06-17T23:21:33.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;This article mainly summarizes my insights during the learning process of template metaprogramming, and I will also include some template metaprogramming code I have written here.&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/"/>
    
    <category term="模板元编程" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/%E6%A8%A1%E6%9D%BF%E5%85%83%E7%BC%96%E7%A8%8B/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="模板元编程" scheme="https://en.imzlp.com/tags/%E6%A8%A1%E6%9D%BF%E5%85%83%E7%BC%96%E7%A8%8B/"/>
    
    <category term="Template" scheme="https://en.imzlp.com/tags/Template/"/>
    
  </entry>
  
  <entry>
    <title>operator new: void* to T* conversion</title>
    <link href="https://en.imzlp.com/posts/21564/"/>
    <id>https://en.imzlp.com/posts/21564/</id>
    <published>2017-05-22T18:03:33.000Z</published>
    <updated>2017-05-22T18:03:33.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In the C++14 standard (as well as C++98/11), there is a statement in &lt;strong&gt;Annex C Compatibility&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Change: Converting void* to a pointer-to-object type requires casting&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&quot;highlight cpp&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;type&quot;&gt;char&lt;/span&gt; a[&lt;span class=&quot;number&quot;&gt;10&lt;/span&gt;];&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;type&quot;&gt;void&lt;/span&gt;* b=a;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;type&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;params&quot;&gt;()&lt;/span&gt; &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;type&quot;&gt;char&lt;/span&gt;* c=b;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;blockquote&gt;
&lt;p&gt;ISO C will accept this usage of pointer to void being assigned to a pointer to object type. C++ will not.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But why does &lt;code&gt;operator new()&lt;/code&gt; return &lt;code&gt;void*&lt;/code&gt; and allow assigning to &lt;code&gt;T*&lt;/code&gt; without an explicit conversion to &lt;code&gt;T*&lt;/code&gt;?&lt;/p&gt;</summary>
    
    
    
    <category term="标准解读" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/C-%E6%A0%87%E5%87%86/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="技术笔记" scheme="https://en.imzlp.com/tags/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/tags/C-%E6%A0%87%E5%87%86/"/>
    
  </entry>
  
  <entry>
    <title>How lambda is implemented in the compiler</title>
    <link href="https://en.imzlp.com/posts/19441/"/>
    <id>https://en.imzlp.com/posts/19441/</id>
    <published>2017-05-17T23:35:54.000Z</published>
    <updated>2017-05-17T23:35:54.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In C++, the result of a &lt;code&gt;lambda-expression&lt;/code&gt; is called a &lt;code&gt;closure object&lt;/code&gt;. This article is not intended to introduce the usage of C++ lambdas (this is covered in detail in “TC++PL” and “C++ Primer,” or you can refer to my previous summary &lt;a href=&quot;https://imzlp.com/posts/2441/#lambda%E8%A1%A8%E8%BE%BE%E5%BC%8F&quot;&gt;C++11 Syntactic Sugar #lambda Expressions&lt;/a&gt;), but rather to analyze how &lt;code&gt;lambda-expression&lt;/code&gt; is implemented in Clang from the perspective of LLVM-IR.&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/"/>
    
    <category term="lambda" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/lambda/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="技术笔记" scheme="https://en.imzlp.com/tags/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
    <category term="中间代码" scheme="https://en.imzlp.com/tags/%E4%B8%AD%E9%97%B4%E4%BB%A3%E7%A0%81/"/>
    
    <category term="LLVM-IR" scheme="https://en.imzlp.com/tags/LLVM-IR/"/>
    
    <category term="lambda" scheme="https://en.imzlp.com/tags/lambda/"/>
    
    <category term="闭包" scheme="https://en.imzlp.com/tags/%E9%97%AD%E5%8C%85/"/>
    
  </entry>
  
  <entry>
    <title>Visibility and accessibility of access control mechanisms</title>
    <link href="https://en.imzlp.com/posts/17586/"/>
    <id>https://en.imzlp.com/posts/17586/</id>
    <published>2017-05-13T10:44:06.000Z</published>
    <updated>2017-05-13T10:44:06.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In the previous article &lt;a href=&quot;https://imzlp.com/posts/12080&quot;&gt;Breaking the Access Control Mechanism of C++ Classes&lt;/a&gt;, we briefly mentioned that the member access control of C++ classes (&lt;code&gt;public&lt;/code&gt;/&lt;code&gt;protected&lt;/code&gt;/&lt;code&gt;private&lt;/code&gt;) only limits the &lt;strong&gt;accessibility&lt;/strong&gt; of member names, rather than their &lt;strong&gt;visibility&lt;/strong&gt;. This article mainly analyzes the consequences of this property and how to avoid them.&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="技术笔记" scheme="https://en.imzlp.com/tags/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/tags/C-%E6%A0%87%E5%87%86/"/>
    
    <category term="pimpl" scheme="https://en.imzlp.com/tags/pimpl/"/>
    
  </entry>
  
  <entry>
    <title>Breaking through the access control mechanism of C++ classes</title>
    <link href="https://en.imzlp.com/posts/12080/"/>
    <id>https://en.imzlp.com/posts/12080/</id>
    <published>2017-05-12T11:58:05.000Z</published>
    <updated>2021-05-24T17:28:06.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;It is well known that class members in C++ can have three access specifiers: &lt;code&gt;public&lt;/code&gt;, &lt;code&gt;protected&lt;/code&gt;, and &lt;code&gt;private&lt;/code&gt;:&lt;br&gt;[ISO/IEC 14882:2014] A member of a class can be&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;private&lt;/strong&gt;: that is, its name can be used only by members and friends of the class in which it is declared.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;protected&lt;/strong&gt;: that is, its name can be used only by members and friends of the class in which it is declared, by classes derived from that class, and by their friends (see 11.4).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;public&lt;/strong&gt;: that is, its name can be used anywhere without access restriction.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From the standard’s intention, it aims to hide implementation details and underlying data of a class, which is &lt;strong&gt;encapsulation&lt;/strong&gt;. However, we can also bypass access restrictions through some special means.&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="技术笔记" scheme="https://en.imzlp.com/tags/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/tags/C-%E6%A0%87%E5%87%86/"/>
    
  </entry>
  
  <entry>
    <title>C++ Technical Book Reviews Summary</title>
    <link href="https://en.imzlp.com/posts/15564/"/>
    <id>https://en.imzlp.com/posts/15564/</id>
    <published>2017-05-06T02:57:42.000Z</published>
    <updated>2017-05-06T02:57:42.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Separate an article; previously scattered book reviews were scattered in &lt;a href=&quot;https://imzlp.com/notes&quot;&gt;notes&lt;/a&gt; and &lt;a href=&quot;https://imzlp.com/tweets&quot;&gt;tweets&lt;/a&gt;, and not collected in one place, making indexing inconvenient. In the future, after reading technical books, I will write some comments and put them all here. Since the subjects of the reviews are technical books, mere phrases cannot describe all the technical details. The intent of this article is not “technical notes,” but rather “book reviews,” so I won’t delve too deeply into the technical details described in the books. Instead, I will share my own reading experiences and tips as an ordinary reader. If I express any opinions about certain books, they are my personal evaluations of the books with no intention of demeaning the authors.&lt;/p&gt;</summary>
    
    
    
    <category term="读书笔记" scheme="https://en.imzlp.com/categories/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="读书笔记" scheme="https://en.imzlp.com/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Implicit declaration of special member-func and their standard behavior</title>
    <link href="https://en.imzlp.com/posts/21790/"/>
    <id>https://en.imzlp.com/posts/21790/</id>
    <published>2017-05-04T23:37:05.000Z</published>
    <updated>2017-05-04T23:37:05.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In C++ programming, one of the most frustrating things is that the compiler does too much behind the backs of programmers. This article compiles various situations and actual behaviors of six special member functions: &lt;code&gt;default constructor&lt;/code&gt;, &lt;code&gt;copy/move constructor&lt;/code&gt;, &lt;code&gt;copy/move assignment operator&lt;/code&gt;, and &lt;code&gt;destructor&lt;/code&gt;, as outlined in the C++ Standard ([ISO/IEC 14882:2014]). It can serve as supplementary material for “Inside The C++ Object Model,” enhancing the understanding of compiler implementations through standard descriptions.&lt;/p&gt;
&lt;p&gt;Additionally, “Inside The C++ Object Model” mainly describes things from the perspective of “compiler implementation,” but from the “C++ standard” perspective, many things in the book are dependent on compiler implementation. For example, the virtual function table; the standard does not specify how the compiler should implement polymorphic behavior, thus it cannot describe details about the virtual function table.&lt;/p&gt;
&lt;p&gt;Moreover, many ambiguous interpretations related to the behavior of “compiler-generated” can be addressed here, which is part of the joy of reading the C++ standard—regardless of whether it’s good or bad, the standard &lt;strong&gt;specifications&lt;/strong&gt; cannot be wrong; all implementations that do not adhere to the standard descriptions are unstandard.&lt;/p&gt;</summary>
    
    
    
    <category term="标准解读" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/C-%E6%A0%87%E5%87%86/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="技术笔记" scheme="https://en.imzlp.com/tags/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/tags/C-%E6%A0%87%E5%87%86/"/>
    
  </entry>
  
  <entry>
    <title>Specialization and overloading of C++ function templates</title>
    <link href="https://en.imzlp.com/posts/10380/"/>
    <id>https://en.imzlp.com/posts/10380/</id>
    <published>2017-05-04T00:20:56.000Z</published>
    <updated>2017-05-04T00:20:56.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Unlike class templates, which can have explicit specializations and partial specializations, function templates do not have the concept of “partial specializations”; they only have explicit specializations and overloads.&lt;/p&gt;</summary>
    
    
    
    <category term="标准解读" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/C-%E6%A0%87%E5%87%86/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="技术笔记" scheme="https://en.imzlp.com/tags/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/tags/C-%E6%A0%87%E5%87%86/"/>
    
  </entry>
  
  <entry>
    <title>Pointers to class members in C++ are not pointers</title>
    <link href="https://en.imzlp.com/posts/27615/"/>
    <id>https://en.imzlp.com/posts/27615/</id>
    <published>2017-04-29T21:28:17.000Z</published>
    <updated>2019-04-22T00:38:56.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;“Pointers to members” is a feature in C++ that is not commonly used. However, the use of the term “pointer” is somewhat inaccurate here, as they do not contain an address, and their behavior is not like pointers. This article will analyze how “pointers to class members” are implemented in clang through LLVM-IR, alongside some definitions from the C++14 standard and related LLVM-IR syntax.&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="技术笔记" scheme="https://en.imzlp.com/tags/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/tags/C-%E6%A0%87%E5%87%86/"/>
    
    <category term="中间代码" scheme="https://en.imzlp.com/tags/%E4%B8%AD%E9%97%B4%E4%BB%A3%E7%A0%81/"/>
    
    <category term="LLVM-IR" scheme="https://en.imzlp.com/tags/LLVM-IR/"/>
    
  </entry>
  
  <entry>
    <title>Why is extern &quot;C&quot; needed?</title>
    <link href="https://en.imzlp.com/posts/5392/"/>
    <id>https://en.imzlp.com/posts/5392/</id>
    <published>2017-04-11T22:20:00.000Z</published>
    <updated>2017-04-24T01:14:08.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In the previous article (&lt;a href=&quot;https://imzlp.com/posts/27118/&quot;&gt;C/C++ Compilation Model Analysis&lt;/a&gt;), the reasons and methods for compilation and linking in C and C++ were introduced. Following the issues discussed in the previous article, this article starts with &lt;code&gt;extern &amp;quot;C&amp;quot;&lt;/code&gt; to analyze the differences and causes in the compilation and linking models of C and C++, focusing primarily on &lt;code&gt;function overload&lt;/code&gt;, &lt;code&gt;function signatures&lt;/code&gt;, and &lt;code&gt;name mangling&lt;/code&gt;.&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="编译和链接" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/%E7%BC%96%E8%AF%91%E5%92%8C%E9%93%BE%E6%8E%A5/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="技术笔记" scheme="https://en.imzlp.com/tags/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C语言" scheme="https://en.imzlp.com/tags/C%E8%AF%AD%E8%A8%80/"/>
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
    <category term="编译模型" scheme="https://en.imzlp.com/tags/%E7%BC%96%E8%AF%91%E6%A8%A1%E5%9E%8B/"/>
    
  </entry>
  
  <entry>
    <title>C/C++ compilation and linking model analysis</title>
    <link href="https://en.imzlp.com/posts/27118/"/>
    <id>https://en.imzlp.com/posts/27118/</id>
    <published>2017-04-10T23:05:44.000Z</published>
    <updated>2017-07-02T00:18:53.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;C and C++ both use separate compilation to support a multi-source file modular mechanism, but why this is done and how it is achieved is a topic worth exploring. This article is not about the syntactic rules that create different linking in C and C++, but rather analyzes how C/C++ compilers implement the compilation and linking model.&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="编译和链接" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/%E7%BC%96%E8%AF%91%E5%92%8C%E9%93%BE%E6%8E%A5/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="技术笔记" scheme="https://en.imzlp.com/tags/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C语言" scheme="https://en.imzlp.com/tags/C%E8%AF%AD%E8%A8%80/"/>
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
    <category term="编译模型" scheme="https://en.imzlp.com/tags/%E7%BC%96%E8%AF%91%E6%A8%A1%E5%9E%8B/"/>
    
  </entry>
  
  <entry>
    <title>Array of length zero</title>
    <link href="https://en.imzlp.com/posts/21095/"/>
    <id>https://en.imzlp.com/posts/21095/</id>
    <published>2017-03-30T19:00:01.000Z</published>
    <updated>2017-03-31T11:48:43.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;I looked at the usage of &lt;code&gt;Array of length zero&lt;/code&gt; in C, and I feel quite inspired. However, from a standard perspective (as opposed to compiler extensions), this feature only exists in the C language (after C99) and does not exist in C++. Let’s dig into it.&lt;/p&gt;</summary>
    
    
    
    <category term="标准解读" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/C-%E6%A0%87%E5%87%86/"/>
    
    <category term="C语言标准" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/C-%E6%A0%87%E5%87%86/C%E8%AF%AD%E8%A8%80%E6%A0%87%E5%87%86/"/>
    
    
    <category term="编程技巧" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7/"/>
    
    <category term="标准解读" scheme="https://en.imzlp.com/tags/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C语言标准" scheme="https://en.imzlp.com/tags/C%E8%AF%AD%E8%A8%80%E6%A0%87%E5%87%86/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/tags/C-%E6%A0%87%E5%87%86/"/>
    
  </entry>
  
  <entry>
    <title>Analysis of Virtual Memory Page Fault Exception</title>
    <link href="https://en.imzlp.com/posts/30933/"/>
    <id>https://en.imzlp.com/posts/30933/</id>
    <published>2017-03-22T01:22:02.000Z</published>
    <updated>2017-03-22T01:22:02.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Consider this question: Is it possible to pass the address of an object from process A to process B (where there is no relationship between A and B) through a pipe (fifo), and thus access the object of process A from process B?&lt;/p&gt;</summary>
    
    
    
    <category term="操作系统" scheme="https://en.imzlp.com/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="虚拟存储器" scheme="https://en.imzlp.com/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E8%99%9A%E6%8B%9F%E5%AD%98%E5%82%A8%E5%99%A8/"/>
    
    
    <category term="操作系统" scheme="https://en.imzlp.com/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
    
    <category term="虚拟存储器" scheme="https://en.imzlp.com/tags/%E8%99%9A%E6%8B%9F%E5%AD%98%E5%82%A8%E5%99%A8/"/>
    
  </entry>
  
  <entry>
    <title>Iterator Invalidation of STL Containers</title>
    <link href="https://en.imzlp.com/posts/3276/"/>
    <id>https://en.imzlp.com/posts/3276/</id>
    <published>2017-03-17T11:43:47.000Z</published>
    <updated>2017-03-17T11:43:47.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;The size of a container refers to the number of elements in the container; the capacity of a container refers to the number of elements that the container can hold before reallocating more memory. When resizing or changing capacity, the elements may move to new storage locations. This means that iterators (as well as pointers or references) pointing to the elements may become invalid (i.e., point to the old element locations).&lt;br&gt;Iterators pointing to elements of associative containers only become invalid when the pointed element is removed from the container (erased). In contrast, iterators pointing to elements of sequential containers may become invalid when memory is reallocated (&lt;code&gt;resize()&lt;/code&gt;/&lt;code&gt;reverse()&lt;/code&gt; or &lt;code&gt;push_back()&lt;/code&gt;) or when the pointed element moves within the container (such as by performing an &lt;code&gt;erase()&lt;/code&gt; or &lt;code&gt;insert()&lt;/code&gt; at its previous position). &lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/"/>
    
    <category term="STL" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/STL/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="STL" scheme="https://en.imzlp.com/tags/STL/"/>
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Analyze C++ code semantics through IR code</title>
    <link href="https://en.imzlp.com/posts/20479/"/>
    <id>https://en.imzlp.com/posts/20479/</id>
    <published>2017-03-08T11:46:55.000Z</published>
    <updated>2017-03-08T11:46:55.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;IR code is the &lt;code&gt;Intermediate Code&lt;/code&gt; generated by LLVM. By analyzing the IR code, we can understand how the compiler parses and executes the code we write, making the analysis of code semantics clearer. The syntax and semantics of the IR code can be referenced in the &lt;a href=&quot;http://llvm.org/docs/LangRef.html#store-instruction&quot;&gt;LLVM Language Reference Manual&lt;/a&gt;.&lt;/p&gt;</summary>
    
    
    
    <category term="编程工具" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
    <category term="中间代码" scheme="https://en.imzlp.com/tags/%E4%B8%AD%E9%97%B4%E4%BB%A3%E7%A0%81/"/>
    
    <category term="LLVM-IR" scheme="https://en.imzlp.com/tags/LLVM-IR/"/>
    
  </entry>
  
  <entry>
    <title>A brief discussion on fork/vfork</title>
    <link href="https://en.imzlp.com/posts/2658/"/>
    <id>https://en.imzlp.com/posts/2658/</id>
    <published>2017-03-06T13:40:08.000Z</published>
    <updated>2017-03-06T13:40:08.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In *UNIX, multi-process programming can be implemented using fork/vfork. Here is a summary of the relevant knowledge.&lt;/p&gt;</summary>
    
    
    
    <category term="UNIX" scheme="https://en.imzlp.com/categories/UNIX/"/>
    
    <category term="POSIX" scheme="https://en.imzlp.com/categories/UNIX/POSIX/"/>
    
    
    <category term="Linux" scheme="https://en.imzlp.com/tags/Linux/"/>
    
    <category term="UNIX" scheme="https://en.imzlp.com/tags/UNIX/"/>
    
    <category term="POSIX" scheme="https://en.imzlp.com/tags/POSIX/"/>
    
    <category term="多进程" scheme="https://en.imzlp.com/tags/%E5%A4%9A%E8%BF%9B%E7%A8%8B/"/>
    
    <category term="multi-process" scheme="https://en.imzlp.com/tags/multi-process/"/>
    
  </entry>
  
  <entry>
    <title>Programming skills and concepts in C/C++</title>
    <link href="https://en.imzlp.com/posts/1756/"/>
    <id>https://en.imzlp.com/posts/1756/</id>
    <published>2017-03-05T01:21:25.000Z</published>
    <updated>2017-04-28T07:53:38.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Some examples in C++ that can be confusing or have peculiar usages are recorded.&lt;/p&gt;</summary>
    
    
    
    <category term="编程技巧" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="编程技巧" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7/"/>
    
    <category term="C语言" scheme="https://en.imzlp.com/tags/C%E8%AF%AD%E8%A8%80/"/>
    
    <category term="笔记" scheme="https://en.imzlp.com/tags/%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Main-function prototype verification and program termination behavior</title>
    <link href="https://en.imzlp.com/posts/15272/"/>
    <id>https://en.imzlp.com/posts/15272/</id>
    <published>2017-02-27T15:30:09.000Z</published>
    <updated>2017-02-27T15:30:09.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In C and C++, there are many versions of the &lt;code&gt;main&lt;/code&gt; function prototype that circulate, and different books present different ways of writing it. Today, I will explore what constitutes “standard behavior” from the perspectives of several standards (C89/99/11 and C++98/03/11/14) and what happens after the main function returns.&lt;/p&gt;</summary>
    
    
    
    <category term="标准解读" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/C-%E6%A0%87%E5%87%86/"/>
    
    <category term="C语言标准" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/C-%E6%A0%87%E5%87%86/C%E8%AF%AD%E8%A8%80%E6%A0%87%E5%87%86/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="C语言" scheme="https://en.imzlp.com/tags/C%E8%AF%AD%E8%A8%80/"/>
    
    <category term="标准解读" scheme="https://en.imzlp.com/tags/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C语言标准" scheme="https://en.imzlp.com/tags/C%E8%AF%AD%E8%A8%80%E6%A0%87%E5%87%86/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/tags/C-%E6%A0%87%E5%87%86/"/>
    
  </entry>
  
  <entry>
    <title>Incompatibilities between C and C++</title>
    <link href="https://en.imzlp.com/posts/14446/"/>
    <id>https://en.imzlp.com/posts/14446/</id>
    <published>2017-02-27T15:25:56.000Z</published>
    <updated>2017-05-23T10:46:52.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Previously, it has been mentioned several times that C and C++ are not the same language. Even the part inherited from C in C++ has significant differences from ISO C. I will gradually compile some of their incompatible features here.&lt;/p&gt;</summary>
    
    
    
    <category term="标准解读" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/C-%E6%A0%87%E5%87%86/"/>
    
    <category term="C语言标准" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/C-%E6%A0%87%E5%87%86/C%E8%AF%AD%E8%A8%80%E6%A0%87%E5%87%86/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="C语言" scheme="https://en.imzlp.com/tags/C%E8%AF%AD%E8%A8%80/"/>
    
    <category term="标准解读" scheme="https://en.imzlp.com/tags/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C语言标准" scheme="https://en.imzlp.com/tags/C%E8%AF%AD%E8%A8%80%E6%A0%87%E5%87%86/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/tags/C-%E6%A0%87%E5%87%86/"/>
    
  </entry>
  
  <entry>
    <title>The difference between declaration and define in C++</title>
    <link href="https://en.imzlp.com/posts/21831/"/>
    <id>https://en.imzlp.com/posts/21831/</id>
    <published>2017-02-24T21:09:53.000Z</published>
    <updated>2017-02-24T21:09:53.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Many C++ books do not clearly state the difference between declaration and definition, or they only mention the need to support separate compilation, indicating that using the &lt;code&gt;extern&lt;/code&gt; specifier is a declaration, while without it is a definition. In fact, I think the C++ standard describes the difference between declaration and definition more clearly.&lt;/p&gt;</summary>
    
    
    
    <category term="标准解读" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/C-%E6%A0%87%E5%87%86/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="标准解读" scheme="https://en.imzlp.com/tags/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/tags/C-%E6%A0%87%E5%87%86/"/>
    
  </entry>
  
  <entry>
    <title>C++ object construction and destruction order</title>
    <link href="https://en.imzlp.com/posts/16550/"/>
    <id>https://en.imzlp.com/posts/16550/</id>
    <published>2017-02-19T18:04:24.000Z</published>
    <updated>2017-02-19T18:04:24.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Through a CppQuiz question to describe the order of construction and destruction of C++ objects in the context of inheritance according to the C++14 standard, as well as throwing exceptions during object construction/destruction.&lt;/p&gt;</summary>
    
    
    
    <category term="标准解读" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/C-%E6%A0%87%E5%87%86/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="标准解读" scheme="https://en.imzlp.com/tags/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/tags/C-%E6%A0%87%E5%87%86/"/>
    
    <category term="对象模型" scheme="https://en.imzlp.com/tags/%E5%AF%B9%E8%B1%A1%E6%A8%A1%E5%9E%8B/"/>
    
  </entry>
  
  <entry>
    <title>C++ overload and override</title>
    <link href="https://en.imzlp.com/posts/29726/"/>
    <id>https://en.imzlp.com/posts/29726/</id>
    <published>2017-02-06T05:08:43.000Z</published>
    <updated>2017-02-06T05:08:43.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In C++, &lt;code&gt;overload&lt;/code&gt; and &lt;code&gt;override&lt;/code&gt; are not related, but they are easily confused due to the similarity of the terms.&lt;/p&gt;</summary>
    
    
    
    <category term="标准解读" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/C-%E6%A0%87%E5%87%86/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="标准解读" scheme="https://en.imzlp.com/tags/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/tags/C-%E6%A0%87%E5%87%86/"/>
    
  </entry>
  
  <entry>
    <title>Samba Configuration on Linux</title>
    <link href="https://en.imzlp.com/posts/17347/"/>
    <id>https://en.imzlp.com/posts/17347/</id>
    <published>2017-02-04T05:29:47.000Z</published>
    <updated>2017-02-04T05:29:47.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Through Samba, we can mount folders from Linux to Windows. After deploying Samba on a Linux virtual machine, I can use the remote compilation plugin I wrote a few days ago (&lt;a href=&quot;https://imzlp.com/posts/11793/&quot;&gt;sublimeRemoteCompile&lt;/a&gt;) to write code on Windows! It’s quite enjoyable. Today, I will briefly record how to configure Samba sharing on the server for friends with similar needs.&lt;/p&gt;</summary>
    
    
    
    <category term="Linux环境" scheme="https://en.imzlp.com/categories/Linux%E7%8E%AF%E5%A2%83/"/>
    
    
    <category term="Linux" scheme="https://en.imzlp.com/tags/Linux/"/>
    
    <category term="UNIX" scheme="https://en.imzlp.com/tags/UNIX/"/>
    
    <category term="Samba" scheme="https://en.imzlp.com/tags/Samba/"/>
    
  </entry>
  
  <entry>
    <title>Knowledge collection of tools and development environments</title>
    <link href="https://en.imzlp.com/posts/16793/"/>
    <id>https://en.imzlp.com/posts/16793/</id>
    <published>2017-02-03T23:39:14.000Z</published>
    <updated>2019-01-17T14:15:00.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Some tips on tools and environment configuration or related knowledge concepts are recorded here.&lt;/p&gt;</summary>
    
    
    
    <category term="编程工具" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="编程工具" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/"/>
    
    <category term="笔记" scheme="https://en.imzlp.com/tags/%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Remote compilation plugin for SublimeText</title>
    <link href="https://en.imzlp.com/posts/11793/"/>
    <id>https://en.imzlp.com/posts/11793/</id>
    <published>2017-01-25T01:43:55.000Z</published>
    <updated>2017-01-25T01:43:55.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Running some small test codes on Linux from Windows can be quite tedious, especially since I have to manually execute the compilation commands on Linux. Also, using Samba on my Raspberry Pi to share the code to Windows requires me to SSH and compile it manually, which is a waste of time.&lt;br&gt;These past few days, I wrote a small Sublime Text plugin during my free time to remotely compile C/C++ code on Windows, meaning that I write the code on Windows but it actually executes on Linux. I’ve only implemented the functionality for now, and I plan to optimize it during my break after the holidays.&lt;br&gt;The code is hosted on GitHub: &lt;a href=&quot;https://github.com/hxhb/sublimeRemoteCompile&quot;&gt;sublimeRemoteCompile&lt;/a&gt;, using some &lt;code&gt;C++11&lt;/code&gt; features, and the compiler must be specified during compilation.  &lt;/p&gt;</summary>
    
    
    
    <category term="编程工具" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/"/>
    
    <category term="小项目" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/%E5%B0%8F%E9%A1%B9%E7%9B%AE/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="SublimeText" scheme="https://en.imzlp.com/tags/SublimeText/"/>
    
  </entry>
  
  <entry>
    <title>The logic behind array subscript access</title>
    <link href="https://en.imzlp.com/posts/20449/"/>
    <id>https://en.imzlp.com/posts/20449/</id>
    <published>2017-01-16T00:59:09.000Z</published>
    <updated>2017-01-16T00:59:09.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;For arrays, subscript operations are a way of random reading and writing, and they are also the most common method. However, many textbooks (especially domestic ones) state that the array name is a pointer, which is incorrect. Moreover, there are a set of rules behind array subscript access; familiarizing yourself with these rules can help analyze the actual meaning of the code in some complex semantic situations.&lt;/p&gt;</summary>
    
    
    
    <category term="标准解读" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="标准解读" scheme="https://en.imzlp.com/tags/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C语言标准" scheme="https://en.imzlp.com/tags/C%E8%AF%AD%E8%A8%80%E6%A0%87%E5%87%86/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/tags/C-%E6%A0%87%E5%87%86/"/>
    
  </entry>
  
  <entry>
    <title>Wrap an override member function pointer</title>
    <link href="https://en.imzlp.com/posts/19740/"/>
    <id>https://en.imzlp.com/posts/19740/</id>
    <published>2016-12-31T04:02:13.000Z</published>
    <updated>2017-05-15T16:27:14.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Using variable-length parameter templates and lambda (or using generic lambda) to wrap overloaded member function pointers for convenient usage (like bind binding or other places that require overloaded member function pointers). For more introduction on &lt;strong&gt;member function pointers&lt;/strong&gt;, please see my other article: &lt;a href=&quot;https://imzlp.com/posts/27615&quot;&gt;Pointers to Class Members in C++ Are Not Pointers&lt;/a&gt;.&lt;/p&gt;</summary>
    
    
    
    <category term="编程技巧" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="编程技巧" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7/"/>
    
  </entry>
  
  <entry>
    <title>The C++ Object and Memory Model</title>
    <link href="https://en.imzlp.com/posts/21843/"/>
    <id>https://en.imzlp.com/posts/21843/</id>
    <published>2016-12-15T21:11:24.000Z</published>
    <updated>2016-12-15T21:11:24.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;More documentation:&lt;a href=&quot;http://en.cppreference.com/w/cpp/language/memory_model&quot;&gt;Memory Model&lt;/a&gt; and &lt;a href=&quot;https://imzlp.com/2016/05/18/about-the-compiler-to-generate-the-default-constructor/&quot;&gt;Default Constructor Construction&lt;/a&gt;.&lt;/p&gt;</summary>
    
    
    
    <category term="标准解读" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/C-%E6%A0%87%E5%87%86/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="C++对象模型" scheme="https://en.imzlp.com/tags/C-%E5%AF%B9%E8%B1%A1%E6%A8%A1%E5%9E%8B/"/>
    
    <category term="标准解读" scheme="https://en.imzlp.com/tags/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/tags/C-%E6%A0%87%E5%87%86/"/>
    
  </entry>
  
  <entry>
    <title>Some thoughts on reading</title>
    <link href="https://en.imzlp.com/posts/17446/"/>
    <id>https://en.imzlp.com/posts/17446/</id>
    <published>2016-12-11T20:43:42.000Z</published>
    <updated>2016-12-11T20:43:42.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;How to delineate the most important 20% in an unfamiliar field or book? How to identify trivial details?&lt;br&gt;I hadn’t deeply contemplated these methodologies in my previous reading and studying, thinking they were merely empty talks. However, I now feel that mastering a suitable technique is like having a sharp blade in hand, allowing one to navigate obstacles with ease.&lt;/p&gt;</summary>
    
    
    
    <category term="随笔" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="循迹研究" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="读书笔记" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="随笔" scheme="https://en.imzlp.com/tags/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="循迹研究" scheme="https://en.imzlp.com/tags/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="方法论" scheme="https://en.imzlp.com/tags/%E6%96%B9%E6%B3%95%E8%AE%BA/"/>
    
  </entry>
  
  <entry>
    <title>Reading TC++PL/C++Primer/ISO C++</title>
    <link href="https://en.imzlp.com/posts/4367/"/>
    <id>https://en.imzlp.com/posts/4367/</id>
    <published>2016-12-06T23:16:00.000Z</published>
    <updated>2016-12-06T23:16:00.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Spent a month reading TC++PL4E. Since I had previously read C++ Primer and understood most of the C++ syntax, the reading speed was quite fast. However, by reading alongside the C++ standard, I discovered many things in C++ that I previously didn’t know. From the perspective of the standard and the father of C++, C++ is indeed comprehensive enough. Thus, I’ll compare C++ Primer, TC++PL4E, and the ISO C++ documentation.&lt;/p&gt;</summary>
    
    
    
    <category term="读书笔记" scheme="https://en.imzlp.com/categories/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="读书笔记" scheme="https://en.imzlp.com/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>What is POD in C++?</title>
    <link href="https://en.imzlp.com/posts/1140/"/>
    <id>https://en.imzlp.com/posts/1140/</id>
    <published>2016-12-03T00:04:28.000Z</published>
    <updated>2016-12-03T00:04:28.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;POD is Plain Old Data. In C++, it refers to objects that can be treated as “data only,” where programmers do not need to worry about the complexity of class layout, as well as user-defined constructors, copy, and move semantics.&lt;/p&gt;</summary>
    
    
    
    <category term="标准解读" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/C-%E6%A0%87%E5%87%86/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="标准解读" scheme="https://en.imzlp.com/tags/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/tags/C-%E6%A0%87%E5%87%86/"/>
    
  </entry>
  
  <entry>
    <title>Radical ADL (Argument-dependent lookup)</title>
    <link href="https://en.imzlp.com/posts/25788/"/>
    <id>https://en.imzlp.com/posts/25788/</id>
    <published>2016-11-29T22:39:14.000Z</published>
    <updated>2016-11-29T22:39:14.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;ADL is the abbreviation for &lt;code&gt;Argument-dependent lookup&lt;/code&gt;, which in Chinese translates to 参数依赖查找. ADL is useful for avoiding verbose code, but it can also cause some ambiguity.&lt;/p&gt;</summary>
    
    
    
    <category term="标准解读" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/C-%E6%A0%87%E5%87%86/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="标准解读" scheme="https://en.imzlp.com/tags/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/tags/C-%E6%A0%87%E5%87%86/"/>
    
  </entry>
  
  <entry>
    <title>TC++PL4E Chinese and English Edition Errata</title>
    <link href="https://en.imzlp.com/posts/409/"/>
    <id>https://en.imzlp.com/posts/409/</id>
    <published>2016-11-20T21:46:53.000Z</published>
    <updated>2016-11-20T21:46:53.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;最近在读The C++ Programming Language Fourth Edition(简称TC++PL4E)，由于我入的实体书是中译本(原版好贵)，所以我是对照着英文版PDF看的，发现了一些原版和中译本中的勘误，还有一些我觉得书中歧义的地方，查阅标准(ISO/IEC 14882:2014(E))之后的定义也一并贴出，汇总在这里列出来。&lt;/p&gt;</summary>
    
    
    
    <category term="读书笔记" scheme="https://en.imzlp.com/categories/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    
    <category term="勘误表" scheme="https://en.imzlp.com/categories/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/%E5%8B%98%E8%AF%AF%E8%A1%A8/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="读书笔记" scheme="https://en.imzlp.com/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    
    <category term="勘误表" scheme="https://en.imzlp.com/tags/%E5%8B%98%E8%AF%AF%E8%A1%A8/"/>
    
  </entry>
  
  <entry>
    <title>Some excerpts from the C/C++ standard</title>
    <link href="https://en.imzlp.com/posts/19242/"/>
    <id>https://en.imzlp.com/posts/19242/</id>
    <published>2016-11-12T01:19:51.000Z</published>
    <updated>2017-04-05T15:19:57.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;There are countless resources on C/C++ available online, but I often find that, after reading some articles, it seems the authors themselves don’t fully understand what they wrote (looking back at my own earlier articles, my perspective was too one-sided and superficial at that time). Therefore, for C/C++ materials, I believe it’s essential to refer directly to the standard documentation, as standards do not introduce ambiguities. One should not blindly search the internet and trust second-hand digested materials.&lt;/p&gt;
&lt;p&gt;I think consulting these four documents is enough for understanding the features of the C/C++ languages (click to preview online or download):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://doc.imzlp.com/viewer.html?file=docs/standard/isoc99.pdf&quot;&gt;ISO/IEC 9899:1999 (E)&lt;/a&gt; (C99 standard)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://doc.imzlp.com/viewer.html?file=docs/clang/TCPL2E.pdf&quot;&gt;The C Programming Language Second Edition&lt;/a&gt; (The major work of C language creators Dennis Ritchie and Brian Kernighan)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://doc.imzlp.com/viewer.html?file=docs/standard/isocpp2014.pdf&quot;&gt;ISO/IEC 14882:2014(E)&lt;/a&gt; (C++14 standard)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://doc.imzlp.com/viewer.html?file=docs/cpp/TCPPPL4E.pdf&quot;&gt;The C++ Programming Language Fourth Edition&lt;/a&gt; (Written by the father of C++, based on the C++11 standard)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The reason the C language standard does not follow the latest C11 standard is that the current C++ standard (C++14) references &lt;strong&gt;ISO/IEC 9899:1999&lt;/strong&gt; in its &lt;code&gt;Normative references&lt;/code&gt;, which means TCPL and TC++PL can serve as applicable descriptions for the C/C++ standards and can corroborate each other.&lt;/p&gt;
&lt;p&gt;For more about C++ &lt;code&gt;Normative references&lt;/code&gt;, refer to &lt;a href=&quot;https://o66j3dueo.qnssl.com/Document/ISOIEC.14882.2014%28C++14%29.pdf&quot;&gt;ISO/IEC 14882:2014(E)&lt;/a&gt; §1.2 Normative references.&lt;/p&gt;
&lt;p&gt;I will gradually extract some commonly ambiguous language features from the standard norms here to ensure that what I write is backed by the standard documentation.&lt;/p&gt;</summary>
    
    
    
    <category term="标准解读" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/C-%E6%A0%87%E5%87%86/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="标准解读" scheme="https://en.imzlp.com/tags/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/tags/C-%E6%A0%87%E5%87%86/"/>
    
  </entry>
  
  <entry>
    <title>Some interesting questions and analysis of CppQuiz</title>
    <link href="https://en.imzlp.com/posts/10205/"/>
    <id>https://en.imzlp.com/posts/10205/</id>
    <published>2016-10-24T06:15:05.000Z</published>
    <updated>2016-10-24T06:15:05.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;&lt;a href=&quot;http://cppquiz.org/&quot;&gt;CppQuiz&lt;/a&gt; is a simple online quiz that you can use to test your knowledge of the C++ programming language.&lt;br&gt;It’s quite interesting; I wrote down a few questions I encountered today. I’ll add more here whenever I have time. In fact, many questions in CppQuiz can be explained by “Deep Exploration of C++ Object Model”… If you find yourself struggling with many questions, I recommend buying a copy of “Deep Exploration of C++ Object Model” and reading it thoroughly!&lt;br&gt;In addition, I will try to find relevant descriptions in the C++ standard (ISO/IEC 14882:2014) while answering questions.&lt;/p&gt;</summary>
    
    
    
    <category term="代码分析" scheme="https://en.imzlp.com/categories/%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="C++标准" scheme="https://en.imzlp.com/tags/C-%E6%A0%87%E5%87%86/"/>
    
    <category term="CppQuiz" scheme="https://en.imzlp.com/tags/CppQuiz/"/>
    
  </entry>
  
  <entry>
    <title>Automatically deploy Github/Coding Pages blog using Travis CI</title>
    <link href="https://en.imzlp.com/posts/42318/"/>
    <id>https://en.imzlp.com/posts/42318/</id>
    <published>2016-10-21T06:36:49.000Z</published>
    <updated>2016-10-21T06:36:49.000Z</updated>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;This blog has switched to Github Action for automated deployment.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Using Hexo to generate a static blog and then deploying it to Github/Coding Pages is currently how my blog is hosted. It’s quite enjoyable to use, but there are several issues:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The environment configuration for Hexo is too cumbersome; it’s almost impossible to update the blog when changing to a new computer.&lt;/li&gt;
&lt;li&gt;Each time I modify an article, I have to regenerate everything.&lt;/li&gt;
&lt;li&gt;Additionally, the number of command executions for submitting the blog source files is too high (mainly the first step).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I wasted a lot of time submitting articles, so I optimized the process to almost achieve fully automated submissions.  &lt;/p&gt;</summary>
    
    
    
    <category term="博客管理" scheme="https://en.imzlp.com/categories/%E5%8D%9A%E5%AE%A2%E7%AE%A1%E7%90%86/"/>
    
    <category term="Hexo" scheme="https://en.imzlp.com/categories/%E5%8D%9A%E5%AE%A2%E7%AE%A1%E7%90%86/Hexo/"/>
    
    
    <category term="Github" scheme="https://en.imzlp.com/tags/Github/"/>
    
    <category term="Hexo" scheme="https://en.imzlp.com/tags/Hexo/"/>
    
    <category term="工具集锦" scheme="https://en.imzlp.com/tags/%E5%B7%A5%E5%85%B7%E9%9B%86%E9%94%A6/"/>
    
    <category term="持续集成" scheme="https://en.imzlp.com/tags/%E6%8C%81%E7%BB%AD%E9%9B%86%E6%88%90/"/>
    
  </entry>
  
  <entry>
    <title>Boost source code analysis notes</title>
    <link href="https://en.imzlp.com/posts/18194/"/>
    <id>https://en.imzlp.com/posts/18194/</id>
    <published>2016-10-19T21:39:33.000Z</published>
    <updated>2016-10-19T21:39:33.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Recently, I’ve been reading the Boost code and writing some analyses on the usage and implementation of useful modules in the Boost libraries, with updates to come periodically.  &lt;/p&gt;</summary>
    
    
    
    <category term="编程笔记" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
    <category term="Boost" scheme="https://en.imzlp.com/tags/Boost/"/>
    
  </entry>
  
  <entry>
    <title>Configure SublimeText for Boost dev-environment</title>
    <link href="https://en.imzlp.com/posts/49268/"/>
    <id>https://en.imzlp.com/posts/49268/</id>
    <published>2016-10-13T09:24:16.000Z</published>
    <updated>2016-10-13T09:24:16.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Recently, I would like to study the &lt;a href=&quot;http://www.boost.org/&quot;&gt;Boost&lt;/a&gt; library. Most tutorials available online are based on using IDEs (such as VS/Code::Blocks), but I find it frustrating to have to open a bloated IDE just to write some test code. Today, I fiddled around and managed to compile/link code that uses the Boost library in SublimeText. I also organized the process/tools I worked with, so if others have similar needs and happen to see this article, they can save some time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2016.11.01 Update&lt;/strong&gt;&lt;br&gt;I used the latest version of MinGW64-GCC6.2 (x86_64-6.2.0-posix-seh-rt_v5-rev1) to compile LLVM/Clang 3.9, and then I used the compiled Clang to compile Boost1.62. The error messages that occurred when linking the Boost library in Clang are gone now.&lt;br&gt;&lt;strong&gt;Note: When compiling Boost with Clang, it is best to ensure that the current version of clang is compiled from the version of gcc in the current system; otherwise, when linking the static libraries produced by clang, strange issues might arise.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You can download my compiled versions here: &lt;a href=&quot;http://pan.baidu.com/s/1i5PpoB7&quot;&gt;MinGW62-GCC6.2(x86_64-6.2.0-posix-seh-rt_v5-rev1)&lt;/a&gt;, &lt;a href=&quot;http://pan.baidu.com/s/1pKLyZ7H&quot;&gt;LLVM/Clang3.9 compiled with GCC6.2 (above MinGW version)&lt;/a&gt;, and &lt;a href=&quot;http://pan.baidu.com/s/1eRZU26u&quot;&gt;Boost(MinGW64-GCC6.2/LLVM3.9/VC14-ALL)&lt;/a&gt;. You can choose the version of the linked library (debug/release/static, etc.) as needed.&lt;br&gt;You can &lt;a href=&quot;http://pan.baidu.com/s/1pKN0TPh&quot;&gt;download the full compilation toolchain here&lt;/a&gt;.&lt;/p&gt;</summary>
    
    
    
    <category term="编程工具" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/"/>
    
    <category term="SublimeText" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/SublimeText/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="SublimeText" scheme="https://en.imzlp.com/tags/SublimeText/"/>
    
    <category term="编程工具" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/"/>
    
    <category term="Boost" scheme="https://en.imzlp.com/tags/Boost/"/>
    
  </entry>
  
  <entry>
    <title>Deploy shadowsocks service using Docker</title>
    <link href="https://en.imzlp.com/posts/354/"/>
    <id>https://en.imzlp.com/posts/354/</id>
    <published>2016-10-10T22:10:01.000Z</published>
    <updated>2016-10-10T22:10:01.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;&lt;a href=&quot;https://app.arukas.io/&quot;&gt;Arukas&lt;/a&gt; is a Japanese &lt;a href=&quot;https://www.docker.com/&quot;&gt;Docker&lt;/a&gt; service provider that is currently in the testing phase and can be used for free. We can easily use &lt;a href=&quot;https://www.docker.com/&quot;&gt;Docker&lt;/a&gt; to do some interesting (useful) things, such as deploying our own blog or shadowsocks server.&lt;/p&gt;</summary>
    
    
    
    <category term="Docker" scheme="https://en.imzlp.com/categories/Docker/"/>
    
    
    <category term="Shadowsocks" scheme="https://en.imzlp.com/tags/Shadowsocks/"/>
    
    <category term="Docker" scheme="https://en.imzlp.com/tags/Docker/"/>
    
  </entry>
  
  <entry>
    <title>Using Git for version control in UE4</title>
    <link href="https://en.imzlp.com/posts/7647/"/>
    <id>https://en.imzlp.com/posts/7647/</id>
    <published>2016-10-07T23:31:01.000Z</published>
    <updated>2016-10-07T23:31:01.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;The Source Control provided in Unreal Editor allows you to implement basic functions such as &lt;strong&gt;version submission/version comparison/reverting changes&lt;/strong&gt; through Git for blueprint projects, which is far less powerful than Git Bash, but the Diff between BluePrints is still very useful.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    <category term="Git" scheme="https://en.imzlp.com/categories/UnrealEngine/Git/"/>
    
    
    <category term="Git" scheme="https://en.imzlp.com/tags/Git/"/>
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="SourceControl" scheme="https://en.imzlp.com/tags/SourceControl/"/>
    
    <category term="版本控制" scheme="https://en.imzlp.com/tags/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6/"/>
    
  </entry>
  
  <entry>
    <title>Git Quick Start Guide</title>
    <link href="https://en.imzlp.com/posts/53696/"/>
    <id>https://en.imzlp.com/posts/53696/</id>
    <published>2016-09-29T22:19:37.000Z</published>
    <updated>2018-08-15T00:57:19.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Our company recently set up an intranet server. From now on, all projects will use Git for version control. I’m documenting some common operations here for easy reference.&lt;/p&gt;</summary>
    
    
    
    <category term="版本控制" scheme="https://en.imzlp.com/categories/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6/"/>
    
    <category term="Git" scheme="https://en.imzlp.com/categories/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6/Git/"/>
    
    
    <category term="Git" scheme="https://en.imzlp.com/tags/Git/"/>
    
    <category term="SourceControl" scheme="https://en.imzlp.com/tags/SourceControl/"/>
    
    <category term="版本控制" scheme="https://en.imzlp.com/tags/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6/"/>
    
  </entry>
  
  <entry>
    <title>Add case string matching to C++ switch</title>
    <link href="https://en.imzlp.com/posts/1494/"/>
    <id>https://en.imzlp.com/posts/1494/</id>
    <published>2016-09-24T22:43:23.000Z</published>
    <updated>2016-09-24T22:43:23.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;The &lt;code&gt;switch&lt;/code&gt; in the C++ standard cannot implement string case matching, but we often have this need, so let’s implement it.&lt;/p&gt;</summary>
    
    
    
    <category term="编程技巧" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="编程技巧" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7/"/>
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Summarize some of my coding habits</title>
    <link href="https://en.imzlp.com/posts/35673/"/>
    <id>https://en.imzlp.com/posts/35673/</id>
    <published>2016-09-13T07:26:09.000Z</published>
    <updated>2016-09-13T07:26:09.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;At the beginning when writing code, I always rolled up my sleeves and got to work as soon as I encountered a problem, essentially writing code while debugging and simultaneously designing the solution flow. However, this approach is simply too slow, often leading to writing and deleting code, effectively resulting in a poorly designed code structure requiring refactoring, which wastes a lot of time.&lt;/p&gt;</summary>
    
    
    
    <category term="编程技巧" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7/"/>
    
    
    <category term="编程技巧" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7/"/>
    
  </entry>
  
  <entry>
    <title>Reading &quot;D&amp;E&quot; and answers to some questions</title>
    <link href="https://en.imzlp.com/posts/30227/"/>
    <id>https://en.imzlp.com/posts/30227/</id>
    <published>2016-09-09T08:15:46.000Z</published>
    <updated>2016-09-09T08:15:46.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;&lt;a href=&quot;https://book.douban.com/subject/1096216/&quot;&gt;C++ Language Design and Evolution&lt;/a&gt; is a book written by C++ author Bjarne Stroustrup, discussing the thought process and trade-offs from the conception and design to the actual implementation of C++. It is arguably the only book on the market written from the perspective of a &lt;strong&gt;language designer&lt;/strong&gt; on &lt;strong&gt;language design&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;There are many issues where we should not only know &lt;strong&gt;How&lt;/strong&gt;, but also understand &lt;strong&gt;Why&lt;/strong&gt;, as this allows for a deeper comprehension of the subject. Fortunately, “C++ Language Design and Evolution” is precisely that kind of book. Recently, I realized many aspects of C++ that I only knew &lt;strong&gt;How&lt;/strong&gt; but did not understand &lt;strong&gt;Why&lt;/strong&gt; (too much was sacrificed for compatibility with C), and this article serves as a reading note and a record of &lt;strong&gt;Why&lt;/strong&gt;, which I will gradually organize.&lt;/p&gt;</summary>
    
    
    
    <category term="读书笔记" scheme="https://en.imzlp.com/categories/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="读书笔记" scheme="https://en.imzlp.com/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Capturing 360° panoramic video with Unreal Engine 4</title>
    <link href="https://en.imzlp.com/posts/64044/"/>
    <id>https://en.imzlp.com/posts/64044/</id>
    <published>2016-09-05T19:44:11.000Z</published>
    <updated>2016-09-05T19:44:11.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;This article excerpts some content from the official Unreal Engine blog post: &lt;a href=&quot;https://www.unrealengine.com/zh-CN/blog/capturing-stereoscopic-360-screenshots-videos-movies-unreal-engine-4&quot;&gt;Capturing Stereoscopic 360 Screenshots, Videos, Movies in Unreal Engine 4&lt;/a&gt;, while the rest corrects errors in that article and provides a ready-to-use solution.&lt;/p&gt;</summary>
    
    
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/categories/UnrealEngine/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="全景视频" scheme="https://en.imzlp.com/tags/%E5%85%A8%E6%99%AF%E8%A7%86%E9%A2%91/"/>
    
    <category term="UnrealEngine" scheme="https://en.imzlp.com/tags/UnrealEngine/"/>
    
    <category term="VR" scheme="https://en.imzlp.com/tags/VR/"/>
    
    <category term="虚拟现实" scheme="https://en.imzlp.com/tags/%E8%99%9A%E6%8B%9F%E7%8E%B0%E5%AE%9E/"/>
    
  </entry>
  
  <entry>
    <title>Reading CSAPP: Comparison with Modern Operating Systems</title>
    <link href="https://en.imzlp.com/posts/33213/"/>
    <id>https://en.imzlp.com/posts/33213/</id>
    <published>2016-08-30T01:32:15.000Z</published>
    <updated>2016-08-30T01:32:15.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;These past few days, I’ve been enthusiastic about reading &lt;strong&gt;CSAPP&lt;/strong&gt;, and I even posted yesterday that reading &lt;strong&gt;CSAPP&lt;/strong&gt; is more enjoyable than reading &lt;strong&gt;Modern Operating Systems&lt;/strong&gt; (haha).  &lt;/p&gt;</summary>
    
    
    
    <category term="读书笔记" scheme="https://en.imzlp.com/categories/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="读书笔记" scheme="https://en.imzlp.com/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Dynamic memory and smart pointers</title>
    <link href="https://en.imzlp.com/posts/4280/"/>
    <id>https://en.imzlp.com/posts/4280/</id>
    <published>2016-08-25T08:18:53.000Z</published>
    <updated>2016-08-25T08:18:53.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Smart pointers, as one of the most important features of C++11, were originally recorded in &lt;a href=&quot;https://imzlp.com/2016/05/12/cpp11-new-features/&quot;&gt;C++11 Syntactic Sugar&lt;/a&gt;, but this part is so important that I have recently been relatively free (逃) and decided to summarize it in detail separately. &lt;/p&gt;</summary>
    
    
    
    <category term="编程笔记" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Source Insight plugin and configuration</title>
    <link href="https://en.imzlp.com/posts/42068/"/>
    <id>https://en.imzlp.com/posts/42068/</id>
    <published>2016-08-14T08:08:31.000Z</published>
    <updated>2016-08-14T08:08:31.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Recently, I’ve been experimenting with a few development-related tools that can be considered artifacts. As the saying goes, “A workman must sharpen his tools before he can work well.” I’ll take some time to organize and write about it.&lt;/p&gt;</summary>
    
    
    
    <category term="编程工具" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="编程工具" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/"/>
    
    <category term="CodeReview" scheme="https://en.imzlp.com/tags/CodeReview/"/>
    
  </entry>
  
  <entry>
    <title>Use VisualGDB to write Linux programs on VS</title>
    <link href="https://en.imzlp.com/posts/9932/"/>
    <id>https://en.imzlp.com/posts/9932/</id>
    <published>2016-08-08T00:53:42.000Z</published>
    <updated>2016-08-08T00:53:42.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;As a C++ developer and Linux user, I often write code on Linux. Recently, I discovered VisualGDB (a VS plugin), which is a fantastic tool that allows me to write and run programs directly on Linux from Windows! The debugging experience is even better!&lt;/p&gt;</summary>
    
    
    
    <category term="编程工具" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="Linux" scheme="https://en.imzlp.com/tags/Linux/"/>
    
    <category term="UNIX" scheme="https://en.imzlp.com/tags/UNIX/"/>
    
    <category term="编程工具" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/"/>
    
    <category term="VisualGDB" scheme="https://en.imzlp.com/tags/VisualGDB/"/>
    
    <category term="VisualStudio" scheme="https://en.imzlp.com/tags/VisualStudio/"/>
    
  </entry>
  
  <entry>
    <title>Deploy shadowsocks service on VPS</title>
    <link href="https://en.imzlp.com/posts/31145/"/>
    <id>https://en.imzlp.com/posts/31145/</id>
    <published>2016-07-27T20:34:32.000Z</published>
    <updated>2016-07-27T20:34:32.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In the past few days, I helped a colleague set up a VPS for proxy use and organized some related materials along the way. This article is not aimed at beginners. Before reading the following content, you should first have a VPS that can access the external network (foreign network), and secondly, you should have some basic knowledge of Linux operations. &lt;/p&gt;</summary>
    
    
    
    <category term="Linux环境" scheme="https://en.imzlp.com/categories/Linux%E7%8E%AF%E5%A2%83/"/>
    
    <category term="Shadowsocks" scheme="https://en.imzlp.com/categories/Linux%E7%8E%AF%E5%A2%83/Shadowsocks/"/>
    
    
    <category term="Shadowsocks" scheme="https://en.imzlp.com/tags/Shadowsocks/"/>
    
    <category term="Linux" scheme="https://en.imzlp.com/tags/Linux/"/>
    
    <category term="UNIX" scheme="https://en.imzlp.com/tags/UNIX/"/>
    
    <category term="VPS" scheme="https://en.imzlp.com/tags/VPS/"/>
    
  </entry>
  
  <entry>
    <title>Some books and tools for learning C/C++</title>
    <link href="https://en.imzlp.com/posts/64054/"/>
    <id>https://en.imzlp.com/posts/64054/</id>
    <published>2016-06-12T12:08:43.000Z</published>
    <updated>2016-06-12T12:08:43.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;From the time I began learning C language to now, it has been five or six years, during which I have read quite a few good and bad books, tried many tools (the holy war of compilers/editors), and here I will summarize everything in detail. After messing around for a long time, I have come to a kind of thought, which is different from the “take-it-for-granted” mindset; it is an experience of “doing it yourself.”&lt;/p&gt;</summary>
    
    
    
    <category term="资源分享" scheme="https://en.imzlp.com/categories/%E8%B5%84%E6%BA%90%E5%88%86%E4%BA%AB/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E8%B5%84%E6%BA%90%E5%88%86%E4%BA%AB/C/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="C语言" scheme="https://en.imzlp.com/tags/C%E8%AF%AD%E8%A8%80/"/>
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>2016: Future Plans</title>
    <link href="https://en.imzlp.com/posts/52122/"/>
    <id>https://en.imzlp.com/posts/52122/</id>
    <published>2016-06-10T09:52:32.000Z</published>
    <updated>2016-06-10T09:52:32.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://img.imzlp.com/imgs/zlp/blog/posts/52122/future-plans.webp&quot;&gt;&lt;br&gt;It’s hard to believe that I will soon graduate from university. Although I have learned (and struggled with) quite a lot during my time at university, I still feel that I need to improve and keep working hard.&lt;br&gt;I have a few thoughts about the future, and I will write them down at this moment to motivate myself.  &lt;/p&gt;</summary>
    
    
    
    <category term="思想感悟" scheme="https://en.imzlp.com/categories/%E6%80%9D%E6%83%B3%E6%84%9F%E6%82%9F/"/>
    
    
    <category term="思想感悟" scheme="https://en.imzlp.com/tags/%E6%80%9D%E6%83%B3%E6%84%9F%E6%82%9F/"/>
    
  </entry>
  
  <entry>
    <title>Talk about the college entrance examination</title>
    <link href="https://en.imzlp.com/posts/27665/"/>
    <id>https://en.imzlp.com/posts/27665/</id>
    <published>2016-06-08T07:44:11.000Z</published>
    <updated>2016-06-08T07:44:11.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;These days are the time for the college entrance examination, and it reminds me of a few years ago when I took the exam. Back then, I was still too young, thinking that if I had something I wanted to pursue, I should go for it, wasting a lot of time learning programming. But looking back now, it’s important to study hard in high school, as a degree is indeed a threshold for just graduating.&lt;/p&gt;</summary>
    
    
    
    <category term="思想感悟" scheme="https://en.imzlp.com/categories/%E6%80%9D%E6%83%B3%E6%84%9F%E6%82%9F/"/>
    
    
    <category term="思想感悟" scheme="https://en.imzlp.com/tags/%E6%80%9D%E6%83%B3%E6%84%9F%E6%82%9F/"/>
    
  </entry>
  
  <entry>
    <title>Pthread multithreaded programming</title>
    <link href="https://en.imzlp.com/posts/58408/"/>
    <id>https://en.imzlp.com/posts/58408/</id>
    <published>2016-06-04T17:08:48.000Z</published>
    <updated>2016-06-04T17:08:48.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;&lt;a href=&quot;https://zh.wikipedia.org/wiki/POSIX%E7%BA%BF%E7%A8%8B&quot;&gt;POSIX Threads&lt;/a&gt; (English: POSIX Threads, commonly abbreviated as Pthreads) is the POSIX thread standard that defines a set of APIs for creating and manipulating threads.&lt;/p&gt;</summary>
    
    
    
    <category term="UNIX" scheme="https://en.imzlp.com/categories/UNIX/"/>
    
    <category term="POSIX" scheme="https://en.imzlp.com/categories/UNIX/POSIX/"/>
    
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
    <category term="多线程" scheme="https://en.imzlp.com/tags/%E5%A4%9A%E7%BA%BF%E7%A8%8B/"/>
    
    <category term="Pthread" scheme="https://en.imzlp.com/tags/Pthread/"/>
    
  </entry>
  
  <entry>
    <title>Memory leak caused by deleting void* pointer</title>
    <link href="https://en.imzlp.com/posts/6978/"/>
    <id>https://en.imzlp.com/posts/6978/</id>
    <published>2016-06-04T10:51:47.000Z</published>
    <updated>2016-06-04T10:51:47.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;When a &lt;code&gt;void*&lt;/code&gt; points to a class object, performing a &lt;code&gt;delete&lt;/code&gt; operation on it will lead to undefined behavior—it is certain that this &lt;code&gt;delete&lt;/code&gt; operation will not call the object’s destructor, resulting in a memory leak.&lt;/p&gt;</summary>
    
    
    
    <category term="编程技巧" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="C语言" scheme="https://en.imzlp.com/tags/C%E8%AF%AD%E8%A8%80/"/>
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Memory alignment problem of structure members</title>
    <link href="https://en.imzlp.com/posts/61962/"/>
    <id>https://en.imzlp.com/posts/61962/</id>
    <published>2016-06-02T10:12:34.000Z</published>
    <updated>2025-01-14T09:23:34.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Before discussing memory alignment, let’s first introduce a related concept—&lt;a href=&quot;http://www.baike.com/wiki/%E5%81%8F%E7%A7%BB%E9%87%8F&amp;prd=so_1_doc&quot;&gt;offset&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The distance between the actual address of a storage unit and the segment address where it is located is called the intra-segment offset, also known as the “effective address or offset.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In simple terms, in a structure, the offset refers to the difference between the address of a member in a structure variable and the address of the structure.&lt;/p&gt;</summary>
    
    
    
    <category term="编程笔记" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="C语言" scheme="https://en.imzlp.com/tags/C%E8%AF%AD%E8%A8%80/"/>
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>C language does not have a native bool type</title>
    <link href="https://en.imzlp.com/posts/20582/"/>
    <id>https://en.imzlp.com/posts/20582/</id>
    <published>2016-06-01T19:46:55.000Z</published>
    <updated>2016-06-01T19:46:55.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;It seems a bit clickbaity; to be precise, there is no &lt;code&gt;bool&lt;/code&gt; keyword in the C language standard to represent boolean types. In C++, we usually use &lt;code&gt;bool&lt;/code&gt; variables to store logical values. However, there is no &lt;code&gt;bool&lt;/code&gt; type in C; C only has the &lt;code&gt;_Bool&lt;/code&gt; type. Today, when discussing this issue with someone, it can indeed be confusing, so I’m writing it down for future reference.&lt;/p&gt;</summary>
    
    
    
    <category term="标准解读" scheme="https://en.imzlp.com/categories/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    
    <category term="标准解读" scheme="https://en.imzlp.com/tags/%E6%A0%87%E5%87%86%E8%A7%A3%E8%AF%BB/"/>
    
    <category term="C语言标准" scheme="https://en.imzlp.com/tags/C%E8%AF%AD%E8%A8%80%E6%A0%87%E5%87%86/"/>
    
  </entry>
  
  <entry>
    <title>Turning the Raspberry Pi into a portable Linux compilation environment</title>
    <link href="https://en.imzlp.com/posts/15989/"/>
    <id>https://en.imzlp.com/posts/15989/</id>
    <published>2016-05-25T09:04:52.000Z</published>
    <updated>2016-05-25T09:04:52.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;I have a Raspberry Pi 2B+ that has been collecting dust for quite a while. Due to frequent power outages at school, I haven’t used it for running scripts or downloads. However, recently, the SSH connection to the VPS has been dropping due to power/network issues, which has been quite frustrating. So I’ve decided to turn the Raspberry Pi into a portable compiling environment.&lt;/p&gt;</summary>
    
    
    
    <category term="Linux环境" scheme="https://en.imzlp.com/categories/Linux%E7%8E%AF%E5%A2%83/"/>
    
    
    <category term="Linux" scheme="https://en.imzlp.com/tags/Linux/"/>
    
    <category term="UNIX" scheme="https://en.imzlp.com/tags/UNIX/"/>
    
    <category term="编程工具" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/"/>
    
    <category term="树莓派" scheme="https://en.imzlp.com/tags/%E6%A0%91%E8%8E%93%E6%B4%BE/"/>
    
  </entry>
  
  <entry>
    <title>Some misunderstandings about compiler-generated default constructors</title>
    <link href="https://en.imzlp.com/posts/7666/"/>
    <id>https://en.imzlp.com/posts/7666/</id>
    <published>2016-05-18T19:38:50.000Z</published>
    <updated>2016-05-18T19:38:50.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;When a class we write does not explicitly provide a constructor but the &lt;code&gt;compiler needs a constructor&lt;/code&gt; (be sure to note this phrase), the compiler will generate one for us. However, the default constructor generated by the compiler does not meet our expectations of what it can accomplish.&lt;/p&gt;</summary>
    
    
    
    <category term="编程笔记" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++对象模型" scheme="https://en.imzlp.com/tags/C-%E5%AF%B9%E8%B1%A1%E6%A8%A1%E5%9E%8B/"/>
    
  </entry>
  
  <entry>
    <title>Operating system interprocess communication</title>
    <link href="https://en.imzlp.com/posts/58483/"/>
    <id>https://en.imzlp.com/posts/58483/</id>
    <published>2016-05-17T19:48:04.000Z</published>
    <updated>2016-05-17T19:48:04.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;The methods for achieving inter-process/thread communication include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Inter-process communication methods: file mapping, shared memory, anonymous pipes, named pipes, message slots, clipboard, dynamic data exchange, object linking and embedding, dynamic link libraries, remote procedure calls, etc.&lt;/li&gt;
&lt;li&gt;Thread synchronization methods: events, critical sections, mutexes, semaphores.&lt;/li&gt;
&lt;/ol&gt;</summary>
    
    
    
    <category term="读书笔记" scheme="https://en.imzlp.com/categories/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="进程间通信" scheme="https://en.imzlp.com/tags/%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1/"/>
    
    <category term="操作系统" scheme="https://en.imzlp.com/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
    
  </entry>
  
  <entry>
    <title>C++11 syntactic sugar</title>
    <link href="https://en.imzlp.com/posts/2441/"/>
    <id>https://en.imzlp.com/posts/2441/</id>
    <published>2016-05-12T22:30:19.000Z</published>
    <updated>2016-05-12T22:30:19.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;From C language to C++03, the OO features feel absolutely great. Recently, I focused on the new features of C++11 and found many fantastic syntactic sugars! It’s also very enjoyable to use.&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="C++11" scheme="https://en.imzlp.com/tags/C-11/"/>
    
  </entry>
  
  <entry>
    <title>Memory leak caused by STL releasing pointer elements</title>
    <link href="https://en.imzlp.com/posts/50773/"/>
    <id>https://en.imzlp.com/posts/50773/</id>
    <published>2016-05-08T13:51:13.000Z</published>
    <updated>2016-05-08T13:51:13.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;When we delete a pointer, the object it points to will be deleted. However, this does not happen when pointer objects are stored in an STL container.&lt;/p&gt;</summary>
    
    
    
    <category term="编程笔记" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="编程笔记" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Use Gprof to analyze code performance bottlenecks</title>
    <link href="https://en.imzlp.com/posts/34573/"/>
    <id>https://en.imzlp.com/posts/34573/</id>
    <published>2016-05-07T13:32:34.000Z</published>
    <updated>2016-05-07T13:32:34.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Using &lt;strong&gt;profiler&lt;/strong&gt; to analyze the performance of code is more efficient, detailed, and intuitive than pure cognitive analysis.&lt;/p&gt;</summary>
    
    
    
    <category term="编程工具" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/"/>
    
    <category term="Profiler" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/Profiler/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="编程工具" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/"/>
    
    <category term="C语言" scheme="https://en.imzlp.com/tags/C%E8%AF%AD%E8%A8%80/"/>
    
    <category term="Gprof" scheme="https://en.imzlp.com/tags/Gprof/"/>
    
    <category term="Profiler" scheme="https://en.imzlp.com/tags/Profiler/"/>
    
  </entry>
  
  <entry>
    <title>Detailed analysis of type conversion in C++</title>
    <link href="https://en.imzlp.com/posts/27258/"/>
    <id>https://en.imzlp.com/posts/27258/</id>
    <published>2016-05-04T19:35:17.000Z</published>
    <updated>2016-05-04T19:35:17.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In C++, when the operand types of an operator are inconsistent, these operands will be converted to the same type. Type conversion is divided into &lt;strong&gt;implicit conversion&lt;/strong&gt; and &lt;strong&gt;explicit conversion&lt;/strong&gt;.&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="技术笔记" scheme="https://en.imzlp.com/tags/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="读书笔记" scheme="https://en.imzlp.com/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Summary of some object-oriented knowledge in C++</title>
    <link href="https://en.imzlp.com/posts/34569/"/>
    <id>https://en.imzlp.com/posts/34569/</id>
    <published>2016-04-16T17:31:49.000Z</published>
    <updated>2016-04-16T17:31:49.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;近期准备求职面试。&lt;br&gt;将C++中面向对象部分的基础知识复习整理一下。&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="技术笔记" scheme="https://en.imzlp.com/tags/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Select member and non-member impl of operator-override</title>
    <link href="https://en.imzlp.com/posts/34001/"/>
    <id>https://en.imzlp.com/posts/34001/</id>
    <published>2016-03-21T16:54:58.000Z</published>
    <updated>2016-03-21T16:54:58.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;When designing classes to overload operators, it is essential to choose whether to implement the operator as a member or as a regular non-member function.&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="技术笔记" scheme="https://en.imzlp.com/tags/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Reading &quot;Life&quot; and discussing the choices we face</title>
    <link href="https://en.imzlp.com/posts/54010/"/>
    <id>https://en.imzlp.com/posts/54010/</id>
    <published>2016-03-20T14:07:26.000Z</published>
    <updated>2016-03-20T14:07:26.000Z</updated>
    
    
    <summary type="html">&quot;please enter the password before reading.&quot;</summary>
    
    
    
    <category term="随笔" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="循迹研究" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="思想感悟" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/%E6%80%9D%E6%83%B3%E6%84%9F%E6%82%9F/"/>
    
    
    <category term="思想感悟" scheme="https://en.imzlp.com/tags/%E6%80%9D%E6%83%B3%E6%84%9F%E6%82%9F/"/>
    
    <category term="随笔" scheme="https://en.imzlp.com/tags/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="循迹研究" scheme="https://en.imzlp.com/tags/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="读书笔记" scheme="https://en.imzlp.com/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Usage of placeholder modifier * in C/C++</title>
    <link href="https://en.imzlp.com/posts/16506/"/>
    <id>https://en.imzlp.com/posts/16506/</id>
    <published>2016-03-19T11:49:16.000Z</published>
    <updated>2016-03-19T11:49:16.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;In the process of solving problems, I came across this code snippet for formatting output: &lt;code&gt;printf(&amp;quot;%*s%s%*s&#92;n&amp;quot;,__________);&lt;/code&gt;&lt;br&gt;The required output format is: &lt;code&gt;________123456________&lt;/code&gt;//The underscores represent spaces&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="技术笔记" scheme="https://en.imzlp.com/tags/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Ambiguity caused by incorrect use of macro definitions in C++</title>
    <link href="https://en.imzlp.com/posts/38656/"/>
    <id>https://en.imzlp.com/posts/38656/</id>
    <published>2016-03-14T19:07:46.000Z</published>
    <updated>2016-03-14T19:07:46.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;When writing code, the macro (#define) command is often used. Recently, I encountered two instances where macros were misused, so I’ll analyze them here.&lt;/p&gt;</summary>
    
    
    
    <category term="编程技巧" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="编程技巧" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E6%8A%80%E5%B7%A7/"/>
    
  </entry>
  
  <entry>
    <title>Configure SublimeText as a lightweight IDE for C/C++</title>
    <link href="https://en.imzlp.com/posts/14596/"/>
    <id>https://en.imzlp.com/posts/14596/</id>
    <published>2015-12-26T21:54:01.000Z</published>
    <updated>2017-04-10T18:18:34.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;As a C++ programmer, I have long been accustomed to using tools like GCC, but I must say that GCC’s error messages are terrible. Although there are error prompts, it often requires manual debugging to understand them… Now, the good news is here, the accuracy of &lt;code&gt;Clang&lt;/code&gt;‘s messages is incomparably better than that of GCC.&lt;/p&gt;</summary>
    
    
    
    <category term="编程工具" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/"/>
    
    <category term="SublimeText" scheme="https://en.imzlp.com/categories/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/SublimeText/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="SublimeText" scheme="https://en.imzlp.com/tags/SublimeText/"/>
    
    <category term="Clang" scheme="https://en.imzlp.com/tags/Clang/"/>
    
    <category term="编程工具" scheme="https://en.imzlp.com/tags/%E7%BC%96%E7%A8%8B%E5%B7%A5%E5%85%B7/"/>
    
  </entry>
  
  <entry>
    <title>Using Wolfram|Alpha to Evaluate Integrals</title>
    <link href="https://en.imzlp.com/posts/8531/"/>
    <id>https://en.imzlp.com/posts/8531/</id>
    <published>2015-12-24T20:52:35.000Z</published>
    <updated>2015-12-24T20:52:35.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Actually, using &lt;a href=&quot;http://www.wolframalpha.com/&quot;&gt;WolframAlpha&lt;/a&gt; to compute integrals is quite overkill (but it’s also a strict requirement for laziness). Recently, I’ve been studying Wolfram Language and slowly discovering new ways to play with it.  &lt;/p&gt;</summary>
    
    
    
    <category term="网络工具" scheme="https://en.imzlp.com/categories/%E7%BD%91%E7%BB%9C%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="工具集锦" scheme="https://en.imzlp.com/tags/%E5%B7%A5%E5%85%B7%E9%9B%86%E9%94%A6/"/>
    
    <category term="Wolfram|Alpha" scheme="https://en.imzlp.com/tags/Wolfram-Alpha/"/>
    
    <category term="数学" scheme="https://en.imzlp.com/tags/%E6%95%B0%E5%AD%A6/"/>
    
  </entry>
  
  <entry>
    <title>Use Koding to manage static blogs online</title>
    <link href="https://en.imzlp.com/posts/58862/"/>
    <id>https://en.imzlp.com/posts/58862/</id>
    <published>2015-11-27T13:16:33.000Z</published>
    <updated>2015-11-27T13:16:33.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Previously, I would complete articles on local and then publish them, having already set up a bunch of things like node.js, hexo, git, etc. on my own computer. So, it’s very convenient to use on my computer, but if I switch to another computer, it’s tragic; everything needs to be configured by myself, so I almost end up in a non-usable state whenever I change computers.&lt;/p&gt;</summary>
    
    
    
    <category term="博客管理" scheme="https://en.imzlp.com/categories/%E5%8D%9A%E5%AE%A2%E7%AE%A1%E7%90%86/"/>
    
    <category term="Hexo" scheme="https://en.imzlp.com/categories/%E5%8D%9A%E5%AE%A2%E7%AE%A1%E7%90%86/Hexo/"/>
    
    
    <category term="Hexo" scheme="https://en.imzlp.com/tags/Hexo/"/>
    
    <category term="Koding" scheme="https://en.imzlp.com/tags/Koding/"/>
    
  </entry>
  
  <entry>
    <title>Reading &quot;The Beauty of Mathematics&quot;</title>
    <link href="https://en.imzlp.com/posts/19425/"/>
    <id>https://en.imzlp.com/posts/19425/</id>
    <published>2015-10-24T18:22:02.000Z</published>
    <updated>2015-10-24T18:22:02.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;I have had “The Beauty of Mathematics” for some time now, and as a book I’ve been reading during my leisure time, it has indeed piqued my interest a great deal. Since I don’t allocate much time to reading, averaging only one or two chapters a day, I finished all the chapters yesterday and was left wanting more.&lt;/p&gt;</summary>
    
    
    
    <category term="随笔" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="读书笔记" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="随笔" scheme="https://en.imzlp.com/tags/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="数学之美" scheme="https://en.imzlp.com/tags/%E6%95%B0%E5%AD%A6%E4%B9%8B%E7%BE%8E/"/>
    
    <category term="读书笔记" scheme="https://en.imzlp.com/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Analyzing the Mathematical Principles in Cryptography</title>
    <link href="https://en.imzlp.com/posts/30891/"/>
    <id>https://en.imzlp.com/posts/30891/</id>
    <published>2015-09-09T18:19:26.000Z</published>
    <updated>2015-09-09T18:19:26.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Recently, I’ve been intrigued by the mathematical models in computers discussed in “The Beauty of Mathematics” and the &lt;code&gt;number theory&lt;/code&gt; from “What is Mathematics.” Today, I managed to suppress my laziness for a moment, and I’m going to analyze the mathematical models in cryptography!&lt;/p&gt;</summary>
    
    
    
    <category term="随笔" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="循迹研究" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="读书笔记" scheme="https://en.imzlp.com/categories/%E9%9A%8F%E7%AC%94/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="随笔" scheme="https://en.imzlp.com/tags/%E9%9A%8F%E7%AC%94/"/>
    
    <category term="循迹研究" scheme="https://en.imzlp.com/tags/%E5%BE%AA%E8%BF%B9%E7%A0%94%E7%A9%B6/"/>
    
    <category term="算法" scheme="https://en.imzlp.com/tags/%E7%AE%97%E6%B3%95/"/>
    
    <category term="密码学" scheme="https://en.imzlp.com/tags/%E5%AF%86%E7%A0%81%E5%AD%A6/"/>
    
  </entry>
  
  <entry>
    <title>Deploy Shadowsocks service on Linux</title>
    <link href="https://en.imzlp.com/posts/23429/"/>
    <id>https://en.imzlp.com/posts/23429/</id>
    <published>2015-08-26T17:31:57.000Z</published>
    <updated>2015-08-26T17:31:57.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;These past few days, I reinstalled Linux and wanted to avoid using GUI for SS. The information online wasn’t very useful, so I experimented a bit.&lt;/p&gt;</summary>
    
    
    
    <category term="Linux环境" scheme="https://en.imzlp.com/categories/Linux%E7%8E%AF%E5%A2%83/"/>
    
    <category term="Shadowsocks" scheme="https://en.imzlp.com/categories/Linux%E7%8E%AF%E5%A2%83/Shadowsocks/"/>
    
    
    <category term="Shadowsocks" scheme="https://en.imzlp.com/tags/Shadowsocks/"/>
    
    <category term="Linux" scheme="https://en.imzlp.com/tags/Linux/"/>
    
    <category term="UNIX" scheme="https://en.imzlp.com/tags/UNIX/"/>
    
  </entry>
  
  <entry>
    <title>Extract the RSS source of Youku subscription videos</title>
    <link href="https://en.imzlp.com/posts/23354/"/>
    <id>https://en.imzlp.com/posts/23354/</id>
    <published>2015-08-19T14:56:12.000Z</published>
    <updated>2015-08-19T14:56:12.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;I’ve been tinkering with RSS these past few days and have collected quite a few RSS sources. For lazy people like us, knowing the news without opening a webpage is what RSS is truly about. Recently, I managed to get the RSS output for QQ Space (not very practical…) as well as for Sina Weibo and Sina Blog. However, I still prefer Logic Thinking (on Youku), which does not provide an RSS subscription. So far, I haven’t discovered any particularly effective methods to extract Youku subscription RSS feeds. Various online conversion sites are mostly useless, and I can’t tolerate the hassle of having to open a webpage to do this. So, I decided to dive into how to turn Youku subscriptions into an RSS feed, and I succeeded! It was very satisfying.&lt;/p&gt;</summary>
    
    
    
    <category term="网络工具" scheme="https://en.imzlp.com/categories/%E7%BD%91%E7%BB%9C%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="RSS" scheme="https://en.imzlp.com/tags/RSS/"/>
    
  </entry>
  
  <entry>
    <title>Customize Dvorak keyboard layout under Windows</title>
    <link href="https://en.imzlp.com/posts/50343/"/>
    <id>https://en.imzlp.com/posts/50343/</id>
    <published>2015-08-19T11:01:32.000Z</published>
    <updated>2015-08-19T11:01:32.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;After several twists and turns, I finally sorted out the Dvorak layout in Windows (though with some modifications).&lt;br&gt;Let’s start with the layout diagram of Dvorak.&lt;br&gt;&lt;img src=&quot;https://img.imzlp.com/imgs/zlp/blog/posts/50343/dvorakpsb.webp&quot;&gt;  &lt;/p&gt;</summary>
    
    
    
    <category term="折腾记录" scheme="https://en.imzlp.com/categories/%E6%8A%98%E8%85%BE%E8%AE%B0%E5%BD%95/"/>
    
    
    <category term="工具集锦" scheme="https://en.imzlp.com/tags/%E5%B7%A5%E5%85%B7%E9%9B%86%E9%94%A6/"/>
    
    <category term="Dvorak" scheme="https://en.imzlp.com/tags/Dvorak/"/>
    
  </entry>
  
  <entry>
    <title>Chrome plugin recommendation</title>
    <link href="https://en.imzlp.com/posts/841/"/>
    <id>https://en.imzlp.com/posts/841/</id>
    <published>2015-08-18T14:50:26.000Z</published>
    <updated>2015-08-18T14:50:26.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;&lt;code&gt;LastPass&lt;/code&gt;: Free Password Manager&lt;br&gt;A powerful password manager, from now on you only need to remember one password.&lt;br&gt;&lt;code&gt;Momentum&lt;/code&gt;&lt;br&gt;On how to elegantly use Chrome, a beautiful wallpaper every day.&lt;br&gt;&lt;img src=&quot;https://img.imzlp.com/imgs/zlp/blog/posts/841/Momentum.webp&quot;&gt;&lt;br&gt;&lt;code&gt;Pocket&lt;/code&gt;&lt;br&gt;Read later, better organization on the computer after shopping on mobile.  &lt;/p&gt;</summary>
    
    
    
    <category term="网络工具" scheme="https://en.imzlp.com/categories/%E7%BD%91%E7%BB%9C%E5%B7%A5%E5%85%B7/"/>
    
    
    <category term="工具集锦" scheme="https://en.imzlp.com/tags/%E5%B7%A5%E5%85%B7%E9%9B%86%E9%94%A6/"/>
    
  </entry>
  
  <entry>
    <title>Constructors of containers in STL</title>
    <link href="https://en.imzlp.com/posts/42105/"/>
    <id>https://en.imzlp.com/posts/42105/</id>
    <published>2015-08-18T12:44:55.000Z</published>
    <updated>2015-08-18T12:44:55.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;&lt;strong&gt;&lt;code&gt;Note&lt;/code&gt;&lt;/strong&gt;: All initializations in this document are based on the following container&lt;/p&gt;
&lt;figure class=&quot;highlight cc&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;// Create vector&amp;lt;int&amp;gt; container test and assign values to it&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;vector&amp;lt;&lt;span class=&quot;type&quot;&gt;int&lt;/span&gt;&amp;gt; test;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;for&lt;/span&gt;(&lt;span class=&quot;type&quot;&gt;int&lt;/span&gt; i=&lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;;i&amp;lt;&lt;span class=&quot;number&quot;&gt;10&lt;/span&gt;;i++)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;	test.&lt;span class=&quot;built_in&quot;&gt;push_back&lt;/span&gt;(i);&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/"/>
    
    <category term="STL" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/STL/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="技术笔记" scheme="https://en.imzlp.com/tags/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="STL" scheme="https://en.imzlp.com/tags/STL/"/>
    
  </entry>
  
  <entry>
    <title>C++ floating point rounding</title>
    <link href="https://en.imzlp.com/posts/15409/"/>
    <id>https://en.imzlp.com/posts/15409/</id>
    <published>2015-08-18T12:39:17.000Z</published>
    <updated>2015-08-18T12:39:17.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Recently, while organizing my notes, I discovered a strange issue:&lt;br&gt;&lt;img src=&quot;https://img.imzlp.com/imgs/zlp/blog/posts/15409/1.webp&quot;&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="技术笔记" scheme="https://en.imzlp.com/tags/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Sequential and associative containers in C++</title>
    <link href="https://en.imzlp.com/posts/33878/"/>
    <id>https://en.imzlp.com/posts/33878/</id>
    <published>2015-02-18T13:26:31.000Z</published>
    <updated>2015-02-18T13:26:31.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;C++ STL’s concepts and usage of sequential containers and associative containers.&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/"/>
    
    <category term="STL" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/STL/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="技术笔记" scheme="https://en.imzlp.com/tags/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="STL" scheme="https://en.imzlp.com/tags/STL/"/>
    
  </entry>
  
  <entry>
    <title>Basic C++ syntax</title>
    <link href="https://en.imzlp.com/posts/42362/"/>
    <id>https://en.imzlp.com/posts/42362/</id>
    <published>2015-01-20T11:50:59.000Z</published>
    <updated>2015-01-20T11:50:59.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;C++ Basic Syntax Concepts Organization.&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="技术笔记" scheme="https://en.imzlp.com/tags/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>C/C++ Cheat Sheet</title>
    <link href="https://en.imzlp.com/posts/14660/"/>
    <id>https://en.imzlp.com/posts/14660/</id>
    <published>2015-01-15T23:56:13.000Z</published>
    <updated>2015-01-15T23:56:13.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;A sorted C/C++ cheat sheet, regularly organized and placed here for convenient reference.&lt;/p&gt;</summary>
    
    
    
    <category term="技术笔记" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/C/"/>
    
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
    <category term="语言" scheme="https://en.imzlp.com/tags/%E8%AF%AD%E8%A8%80/"/>
    
  </entry>
  
  <entry>
    <title>Write some of my own feelings: my software major</title>
    <link href="https://en.imzlp.com/posts/44216/"/>
    <id>https://en.imzlp.com/posts/44216/</id>
    <published>2015-01-04T22:32:01.000Z</published>
    <updated>2015-01-04T22:32:01.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;This article is a post previously published at my school, discussing my past experiences and views on learning programming, intended to provide some insights for junior students in the software major. It was recently dug up, and since I almost forgot about it, I’ll tidy it up and share it here.&lt;/p&gt;</summary>
    
    
    
    <category term="思想感悟" scheme="https://en.imzlp.com/categories/%E6%80%9D%E6%83%B3%E6%84%9F%E6%82%9F/"/>
    
    
    <category term="思想感悟" scheme="https://en.imzlp.com/tags/%E6%80%9D%E6%83%B3%E6%84%9F%E6%82%9F/"/>
    
    <category term="C++" scheme="https://en.imzlp.com/tags/C/"/>
    
  </entry>
  
  <entry>
    <title>Use Github to manage blog source files</title>
    <link href="https://en.imzlp.com/posts/55550/"/>
    <id>https://en.imzlp.com/posts/55550/</id>
    <published>2014-11-20T23:52:01.000Z</published>
    <updated>2014-11-20T23:52:01.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Hosting the source files of the blog (non-hexo generated files) on GitHub for easy synchronization and version control.  &lt;/p&gt;</summary>
    
    
    
    <category term="博客管理" scheme="https://en.imzlp.com/categories/%E5%8D%9A%E5%AE%A2%E7%AE%A1%E7%90%86/"/>
    
    <category term="Hexo" scheme="https://en.imzlp.com/categories/%E5%8D%9A%E5%AE%A2%E7%AE%A1%E7%90%86/Hexo/"/>
    
    
    <category term="Github" scheme="https://en.imzlp.com/tags/Github/"/>
    
    <category term="Hexo" scheme="https://en.imzlp.com/tags/Hexo/"/>
    
    <category term="Git" scheme="https://en.imzlp.com/tags/Git/"/>
    
  </entry>
  
  <entry>
    <title>Deploy an independent blog using Github Pages and Hexo</title>
    <link href="https://en.imzlp.com/posts/58952/"/>
    <id>https://en.imzlp.com/posts/58952/</id>
    <published>2014-11-18T11:11:11.000Z</published>
    <updated>2014-11-18T11:11:11.000Z</updated>
    
    
    <summary type="html">&lt;p&gt;Previously, I found using Blog Garden quite unsatisfactory, and I also tried building my own blog. WordPress is too bloated, and other options don’t have strong functionality (the interface doesn’t look good). After thinking it over, I decided to use GitHub Pages + Hexo to build a static blog, focusing on writing.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As of 2021.03.23, I have been using Hexo to deploy my blog for nearly six years. During these six years, I have written more than a hundred articles, and the way I deployed using Hexo has undergone many changes; writing blogs has gradually become a habit. I vaguely remember one day in college when I wanted to build my own blog, so I spent a day working on this article, and the history of this site began from there. I hope I can continue to use Hexo to write for ten years or twenty years!&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="博客管理" scheme="https://en.imzlp.com/categories/%E5%8D%9A%E5%AE%A2%E7%AE%A1%E7%90%86/"/>
    
    <category term="Hexo" scheme="https://en.imzlp.com/categories/%E5%8D%9A%E5%AE%A2%E7%AE%A1%E7%90%86/Hexo/"/>
    
    
    <category term="Github" scheme="https://en.imzlp.com/tags/Github/"/>
    
    <category term="Hexo" scheme="https://en.imzlp.com/tags/Hexo/"/>
    
    <category term="Git" scheme="https://en.imzlp.com/tags/Git/"/>
    
  </entry>
  
  <entry>
    <title>BulletinBoard</title>
    <link href="https://en.imzlp.com/posts/1/"/>
    <id>https://en.imzlp.com/posts/1/</id>
    <published>2014-01-01T00:00:00.000Z</published>
    <updated>2014-01-01T00:00:00.000Z</updated>
    
    
      
      
        
        
    <summary type="html">&lt;p&gt;Welcome to my blog. This is a technical site focused on game development. My open-source projects on GitHub: &lt;a</summary>
        
      
    
    
    
    
  </entry>
  
</feed>
