<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on 白山羊</title><link>https://weissgoat.pages.dev/post/</link><description>Recent content in Posts on 白山羊</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 07 Mar 2026 16:16:33 +0800</lastBuildDate><atom:link href="https://weissgoat.pages.dev/post/index.xml" rel="self" type="application/rss+xml"/><item><title>Lua String</title><link>https://weissgoat.pages.dev/p/lua-string/</link><pubDate>Sat, 07 Mar 2026 16:16:33 +0800</pubDate><guid>https://weissgoat.pages.dev/p/lua-string/</guid><description>&lt;p&gt;Lua 中的字符串（String）实现非常精巧，它兼顾了执行效率和内存管理的便利性。自 Lua 5.2.1 版本起，Lua 对字符串的底层实现进行了重大优化，将其明确区分为了短字符串（Short String）和长字符串（Long String）。&lt;/p&gt;</description></item><item><title>AOI</title><link>https://weissgoat.pages.dev/p/aoi/</link><pubDate>Sun, 01 Mar 2026 16:14:32 +0800</pubDate><guid>https://weissgoat.pages.dev/p/aoi/</guid><description>&lt;p&gt;&lt;strong&gt;AOI 就是只把玩家可视范围（或感兴趣范围）内需要的数据同步给客户端&lt;/strong&gt;。它通过空间划分和过滤，剔除掉玩家根本看不到的实体更新，从而优化了服务器cpu处理以及网络层的通讯传输。&lt;/p&gt;</description></item><item><title>Flatbuffers</title><link>https://weissgoat.pages.dev/p/flatbuffers/</link><pubDate>Sat, 28 Feb 2026 15:48:39 +0800</pubDate><guid>https://weissgoat.pages.dev/p/flatbuffers/</guid><description>&lt;p&gt;FlatBuffers 也是 Google 出的序列化库，但理念和应用场景和Protobuf不同。它最初是为游戏开发和其他对性能（CPU 和内存）要求极高的应用而设计的。&lt;/p&gt;
&lt;p&gt;在探讨高性能网络通信和数据存储时，我们经常会遇到各种序列化协议（如 JSON、Protobuf）。但在对延迟要求极其苛刻的场景下，这些协议的“解析耗时”和“内存分配”往往会成为瓶颈。&lt;/p&gt;</description></item><item><title>Sproto</title><link>https://weissgoat.pages.dev/p/sproto/</link><pubDate>Fri, 27 Feb 2026 18:14:15 +0800</pubDate><guid>https://weissgoat.pages.dev/p/sproto/</guid><description>&lt;p&gt;Sproto 是一个高效的 C 序列化库，专注于 lua 绑定。类似 Protobuf，但实际跑起来，在 Lua 环境下它的速度往往要快得多。&lt;/p&gt;
&lt;h2 id="为什么用-sproto"&gt;为什么用 Sproto？
&lt;/h2&gt;&lt;p&gt;序列化方式业内标杆通常是 Protobuf。那为什么还要造 Sproto 这个“轮子”呢？我觉得可以归结为以下三个原因：&lt;/p&gt;</description></item><item><title>Protocol Buffers</title><link>https://weissgoat.pages.dev/p/protocol-buffers/</link><pubDate>Fri, 27 Feb 2026 16:30:17 +0800</pubDate><guid>https://weissgoat.pages.dev/p/protocol-buffers/</guid><description>&lt;p&gt;Protocol Buffers。作为 Google 开源的一款轻便高效的结构化数据存储格式，它在 RPC 数据交换和高性能数据存储领域几乎是“标配”。&lt;/p&gt;
&lt;h2 id="核心优势"&gt;核心优势
&lt;/h2&gt;&lt;p&gt;在接触 Protobuf 之前，最常用的序列化格式莫过于 JSON 和 XML。但在高并发、对带宽和延迟极其敏感的场景（例如微服务内部的 RPC 调用、高频的网络状态同步）下，纯文本格式的瓶颈就会显现。Protobuf 的优势，主要归功于以下三点：&lt;/p&gt;</description></item><item><title>RPC 框架</title><link>https://weissgoat.pages.dev/p/rpc-%E6%A1%86%E6%9E%B6/</link><pubDate>Mon, 23 Feb 2026 17:42:37 +0800</pubDate><guid>https://weissgoat.pages.dev/p/rpc-%E6%A1%86%E6%9E%B6/</guid><description>&lt;p&gt;在分布式系统的开发中，经常会听到或者使用到 RPC（Remote Procedure Call，远程过程调用）。RPC 的核心目标：&lt;strong&gt;让你调用远程服务器上的函数，就像调用本地函数一样&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Lua 增量GC 演进：从阈值模型到 Debt (债务) 模型</title><link>https://weissgoat.pages.dev/p/lua-%E5%A2%9E%E9%87%8Fgc-%E6%BC%94%E8%BF%9B%E4%BB%8E%E9%98%88%E5%80%BC%E6%A8%A1%E5%9E%8B%E5%88%B0-debt-%E5%80%BA%E5%8A%A1-%E6%A8%A1%E5%9E%8B/</link><pubDate>Sat, 21 Feb 2026 11:04:22 +0800</pubDate><guid>https://weissgoat.pages.dev/p/lua-%E5%A2%9E%E9%87%8Fgc-%E6%BC%94%E8%BF%9B%E4%BB%8E%E9%98%88%E5%80%BC%E6%A8%A1%E5%9E%8B%E5%88%B0-debt-%E5%80%BA%E5%8A%A1-%E6%A8%A1%E5%9E%8B/</guid><description>&lt;p&gt;从 Lua 5.1 到 Lua 5.4，GC 的核心驱动力发生了一次重要的转变：从原先的 &lt;strong&gt;“阈值模型”（Threshold）&lt;/strong&gt; 转向了 &lt;strong&gt;“债务模型”（Debt）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这是为了解决增量 GC 在实际运行中遇到的步长控制和内存飙升问题。&lt;/p&gt;</description></item><item><title>Lua 分代 GC</title><link>https://weissgoat.pages.dev/p/lua-%E5%88%86%E4%BB%A3-gc/</link><pubDate>Sun, 08 Feb 2026 18:32:29 +0800</pubDate><guid>https://weissgoat.pages.dev/p/lua-%E5%88%86%E4%BB%A3-gc/</guid><description>&lt;p&gt;Lua 5.4 引入的&lt;strong&gt;分代垃圾回收（Generational GC）&lt;/strong&gt;,相比于 Lua 5.3 的增量式 GC 专注于“降低停顿时间（Latency）”，Lua 5.4 的分代 GC 旨在解决“高吞吐量（Throughput）”场景下的性能瓶颈。特别是对于那些每一帧都产生大量临时对象（Short-lived objects）的游戏或高并发服务，分代 GC 能带来巨大的性能提升。&lt;/p&gt;</description></item><item><title>Lua Table</title><link>https://weissgoat.pages.dev/p/lua-table/</link><pubDate>Thu, 05 Feb 2026 18:00:00 +0800</pubDate><guid>https://weissgoat.pages.dev/p/lua-table/</guid><description>&lt;h2 id="核心数据结构"&gt;核心数据结构
&lt;/h2&gt;&lt;p&gt;Lua Table 的高效由其底层的 &lt;code&gt;struct Table&lt;/code&gt; 决定。从源码中我们可以清晰地看到，它并非单纯的哈希表，而是&lt;strong&gt;数组&lt;/strong&gt;与&lt;strong&gt;哈希表&lt;/strong&gt;的结合体。&lt;/p&gt;
&lt;h3 id="table-结构体定义"&gt;Table 结构体定义
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;typedef struct Table {
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; CommonHeader;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; lu_byte flags; /* 1&amp;lt;&amp;lt;p means tagmethod(p) is not present (元方法缓存) */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; lu_byte lsizenode; /* 哈希表长度的对数，即 hash_size = 2^lsizenode */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; unsigned int alimit;/* 数组部分的“逻辑”大小 (即 sizearray) */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; TValue *array; /* 数组部分指针 */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Node *node; /* 哈希桶数组起始指针 */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Node *lastfree; /* 指向哈希部分最后一个空闲位置，用于快速插入 */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; struct Table *metatable; /* 元表 */
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; GCObject *gclist;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;} Table;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;设计解读：&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Lua 数据类型与GC对象</title><link>https://weissgoat.pages.dev/p/lua-%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E4%B8%8Egc%E5%AF%B9%E8%B1%A1/</link><pubDate>Thu, 05 Feb 2026 18:00:00 +0800</pubDate><guid>https://weissgoat.pages.dev/p/lua-%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E4%B8%8Egc%E5%AF%B9%E8%B1%A1/</guid><description>&lt;h2 id="tvalue"&gt;TValue
&lt;/h2&gt;&lt;p&gt;在 Lua 虚拟机中，并没有“整数变量”或“字符串变量”的概念。无论是全局变量、局部变量，还是 Table 中的一个槽位，在底层 C 源码中，它们都由一个统一的数据结构表示：&lt;strong&gt;&lt;code&gt;TValue&lt;/code&gt;&lt;/strong&gt;。&lt;/p&gt;</description></item><item><title>Lua 增量 GC</title><link>https://weissgoat.pages.dev/p/lua-%E5%A2%9E%E9%87%8F-gc/</link><pubDate>Thu, 05 Feb 2026 18:00:00 +0800</pubDate><guid>https://weissgoat.pages.dev/p/lua-%E5%A2%9E%E9%87%8F-gc/</guid><description>&lt;h1 id="lua-gc-三色标记增量回收与写屏障"&gt;Lua GC ：三色标记、增量回收与写屏障
&lt;/h1&gt;&lt;h2 id="从-stop-the-world-到增量"&gt;从 Stop-the-World 到增量
&lt;/h2&gt;&lt;h3 id="lua-50简单的代价"&gt;Lua 5.0：简单的代价
&lt;/h3&gt;&lt;p&gt;在 Lua 5.0 时代，GC 算法非常朴素：&lt;strong&gt;双倍阈值，全量回收&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;逻辑&lt;/strong&gt;：当内存使用量达到上次 GC 后的两倍时，虚拟机暂停所有业务逻辑，跑一遍完整的“标记-清除”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后果&lt;/strong&gt;：这就是著名的 &lt;strong&gt;Stop-the-World (STW)&lt;/strong&gt;。如果你的 Lua 内存占用了 1GB，GC 触发的那一瞬间，整个游戏或服务可能会卡顿几百毫秒甚至更久。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="lua-51三色增量标记tri-color-incremental-mark--sweep"&gt;Lua 5.1+：三色增量标记（Tri-color Incremental Mark &amp;amp; Sweep）
&lt;/h3&gt;&lt;p&gt;为了解决卡顿，Lua 5.1 引入了增量 GC。GC 过程与业务代码交替运行。&lt;/p&gt;</description></item><item><title>hello world</title><link>https://weissgoat.pages.dev/p/hello-world/</link><pubDate>Mon, 29 Jan 2024 00:00:00 +0000</pubDate><guid>https://weissgoat.pages.dev/p/hello-world/</guid><description>&lt;p&gt;很幸运生活在一个技术爆炸的时代, 感觉未来充满着可能性&lt;/p&gt;
&lt;p&gt;在这里展示我的生活, 我的思考, 我的成长&lt;/p&gt;</description></item></channel></rss>