<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[说码解字]]></title><description><![CDATA[分享关于计算机理论和技术的研究，欢迎探讨。]]></description><link>https://blog.youkuaiyun.com/cmder1000</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; cmder1000]]></copyright><item><title><![CDATA[Kotlin 内联函数]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/149651216</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/149651216</guid><author>cmder1000</author><pubDate>Fri, 25 Jul 2025 22:37:55 +0800</pubDate><description><![CDATA[正常函数调用会产生函数对象、栈帧和跳转指令，但内联函数会在编译时将函数代码插入到调用点，避免这些开销。block()函数体会“复制粘贴”到调用点。]]></description><category></category></item><item><title><![CDATA[C++ 协程]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/149616123</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/149616123</guid><author>cmder1000</author><pubDate>Thu, 24 Jul 2025 21:36:03 +0800</pubDate><description><![CDATA[C++20 引入了协程（Coroutines），协程是一种可以在执行过程中暂停和恢复的函数，允许在特定点挂起（suspend）执行，并将控制权交还给调用者，稍后可以从暂停点恢复执行。]]></description><category></category></item><item><title><![CDATA[Android MediaCodec 的使用和源码实现分析]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/149586055</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/149586055</guid><author>cmder1000</author><pubDate>Wed, 23 Jul 2025 23:42:23 +0800</pubDate><description><![CDATA[MediaCodec是 Android 提供的底层多媒体编解码 API，允许开发者使用系统硬件编解码器对音视频数据进行压缩/解压。]]></description><category></category></item><item><title><![CDATA[Kotlin 作用域函数 let 的实现原理]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/149550751</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/149550751</guid><author>cmder1000</author><pubDate>Tue, 22 Jul 2025 23:42:55 +0800</pubDate><description><![CDATA[Kotlin 中的let是一个，它广泛用于作用域函数（Scope Functions）中，尤其适用于对可空对象（nullable）做非空判断并执行代码块的场景。]]></description><category></category></item><item><title><![CDATA[Kotlin 属性委托 observable 的实现原理]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/149416332</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/149416332</guid><author>cmder1000</author><pubDate>Thu, 17 Jul 2025 10:41:42 +0800</pubDate><description><![CDATA[返回实例实现了接口Kotlin编译器在by后会将属性访问转发给getValue()和setValue()中自动触发onChange()回调。]]></description><category></category></item><item><title><![CDATA[Kotlin lazy 委托的底层实现原理]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/149153313</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/149153313</guid><author>cmder1000</author><pubDate>Sun, 06 Jul 2025 15:04:23 +0800</pubDate><description><![CDATA[属性委托（by）将get操作转发给Lazy。lazy委托通过实现延迟初始化。使用双重检查锁确保线程安全，首次访问执行，后续返回缓存值。编译器将lazyVal转换为Lazy对象的value访问。lazy适合昂贵初始化的场景（如数据库连接、配置加载）。注意线程安全模式的选择（默认适合多数场景）。通过lazy委托，Kotlin 提供了一种高效、线程安全的延迟初始化机制。]]></description><category></category></item><item><title><![CDATA[C++ 实现环形缓冲区]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/148553250</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/148553250</guid><author>cmder1000</author><pubDate>Tue, 10 Jun 2025 09:23:06 +0800</pubDate><description><![CDATA[因为环形缓冲区使用的场景大多为性能敏感的场景，我们采用数组的数据结构和位运算来实现，以提高代码效率。位运算的效率要高于模运算，但是用位运算替代模运算的前提是缓冲区的大小必须为 2 的整数次幂，因为对于 2 的幂来说，模运算就是屏蔽高位，这个在下面展示代码的时候细说。因为要适配不同的类型，在头文件中使用模板，由于模板类和模板函数是在使用时才实例化的，编译器需要在包含模板的地方就能看到其完整实现，如果编译器看不到它的实现，在链接时就会报错（undefined reference），通常不能将模板的实现写在。]]></description><category></category></item><item><title><![CDATA[如何训练意志力]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/148288009</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/148288009</guid><author>cmder1000</author><pubDate>Wed, 28 May 2025 17:15:14 +0800</pubDate><description><![CDATA[需要从小的即使在情绪低落的状态下也可以完成的任务开始，比如看书30分钟太困难，那就改成看书1分钟，每天只看1分钟，哪怕这1分钟内有50秒都在发呆或者消沉也没问题，重要的是有行动，行动就是一切，不必关注行动之外的东西。一开始是每天看一分钟的书，坚持30天后感觉很轻松的时候再叠加10个俯卧撑，再坚持30天后继续叠加别的计划，从单一计划逐步叠加为组合计划，并将其作为一个整体融入生活，如果觉得吃力，就回退到上一轮计划，坚持一段时间后觉得不用花费意志力也可以很轻松完成时再加上新的计划，可以调整为更小的新计划。]]></description><category></category></item><item><title><![CDATA[Kotlin 协程]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/148074257</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/148074257</guid><author>cmder1000</author><pubDate>Mon, 19 May 2025 20:50:46 +0800</pubDate><description><![CDATA[它在概念上类似于线程，因为它需要运行一个代码块，该代码块与其他代码并发运行。它可以在一个线程中暂停执行，并在另一个线程中恢复执行。在实际应用中，会启动大量协程。根据操作系统、JDK 版本及其设置，要么会抛出内存不足错误，要么会缓慢启动线程，以确保并发运行的线程数量不会过多。修饰符的新函数，这是一个暂停函数，暂停函数可以像普通函数一样在协程内部使用，但它们的额外特性是，它们可以反过来使用其他暂停函数（如。通常用在应用程序的最顶层，但在实际代码中很少见，因为线程是昂贵的资源，阻塞它们会导致效率低下。]]></description><category></category></item><item><title><![CDATA[ExoPlayer 如何实现音画同步]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/147928694</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/147928694</guid><author>cmder1000</author><pubDate>Tue, 13 May 2025 16:55:33 +0800</pubDate><description><![CDATA[ExoPlayer 的音画同步实现采用音频作为主时钟，通过精确计算视频帧与音频位置的时间差来决定视频帧的处理方式。此外，还有其他一些特性如跳过静音、速度调整等，但这些是音频处理的功能，而不是基本的输出模式。第二种是直通模式（Passthrough Mode），对于编码音频格式（如杜比数字、DTS），编码音频直接传递给兼容的音频硬件，无需解码。还有一种模式是隧道模式（Tunnel Mode），它是一种特殊的播放方式，它使用AV同步标头来确保音视频同步。第一种是PCM模式（普通播放模式）。]]></description><category></category></item><item><title><![CDATA[如何读懂《纯粹理性批判》]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/147879046</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/147879046</guid><author>cmder1000</author><pubDate>Sun, 11 May 2025 21:05:54 +0800</pubDate><description><![CDATA[最后给出一些具体的学习建议。《纯》是对理性主义和经验主义的综合与批判，因此必须了解这两大流派的核心观点，尤其是休谟对因果性的怀疑，这是康德写作的直接触发点。之前的哲学家作品包括休谟《人类理解研究》（尤其是关于因果性和怀疑主义的部分），笛卡尔的《第一哲学沉思集》（了解理性主义的基本立场），洛克的《人类理解论》（经验主义的起点）。康德的入门作品包括《未来形而上学导论》（这是康德对《纯粹理性批判》的简化版，语言更通俗，适合初学者），《实践理性批判》和《道德形而上学基础》（可以帮助理解康德哲学的整体框架）。]]></description><category></category></item><item><title><![CDATA[如何从播放器构造角度研究 Media3 源码]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/147806754</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/147806754</guid><author>cmder1000</author><pubDate>Thu, 08 May 2025 22:57:56 +0800</pubDate><description><![CDATA[构建一个播放器，通常需要加载媒体源、解码、渲染、播放控制这几个关键环节。Media3 通过构建一个 ExoPlayer 实例来协调这些环节。Jetpack Media3 是 Android 提供的现代化媒体播放库。Media3 的模块化设计和扩展能力。管理播放器的生命周期和组件：通过入口类。）负责抽象不同类型的数据。解码和渲染：Media3 中通过。负责从不同渠道获取数据。播放控制与状态管理：核心类是。]]></description><category></category></item><item><title><![CDATA[Media3 中 Window 的时间相关属性详解]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/147774019</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/147774019</guid><author>cmder1000</author><pubDate>Wed, 07 May 2025 20:47:20 +0800</pubDate><description><![CDATA[类中，与时间相关的属性描述了媒体播放窗口（window）在时间维度上的关键信息。这些属性帮助开发者理解媒体的播放范围、起始点、持续时间以及与设备时间或直播流的同步关系。）表示时间未设置，常用于直播或未完全加载的媒体。AndroidX Media3 的。（相对于 Unix 纪元，如。（相对于窗口内部，如。]]></description><category></category></item><item><title><![CDATA[如何系统学习音视频]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/147620886</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/147620886</guid><author>cmder1000</author><pubDate>Tue, 29 Apr 2025 22:19:46 +0800</pubDate><description><![CDATA[学习音视频技术涉及多个领域，包括音频处理、视频处理、编码解码、流媒体传输等。]]></description><category></category></item><item><title><![CDATA[ExoPlayer 中的 Timeline、Period 和 Window]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/147596969</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/147596969</guid><author>cmder1000</author><pubDate>Mon, 28 Apr 2025 22:30:49 +0800</pubDate><description><![CDATA[表示窗口内的一个逻辑分段，通常对应媒体内容的子部分（如 DASH 的一个 Period 或 HLS 的一个片段组）。表示时间轴上的一个逻辑时间窗口，通常对应一个连续的播放内容段。每个窗口有自己的时间范围（开始时间、持续时间）和元数据（如是否动态、是否可寻址）。），新窗口或周期会随时间添加，旧周期可能被移除（滑动窗口）。可以是静态的（如点播视频，固定时长）或动态的（如直播流，窗口随时间滑动）。定期更新，反映新的窗口或周期（例如，HLS 播放列表刷新）。定义窗口内的细粒度分段（如流的一个片段）。]]></description><category></category></item><item><title><![CDATA[C++ RAII]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/147565618</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/147565618</guid><author>cmder1000</author><pubDate>Sun, 27 Apr 2025 17:52:09 +0800</pubDate><description><![CDATA[它通过将资源的生命周期绑定到对象的生命周期，利用 C++ 的自动对象管理机制（主要是栈对象的构造和析构），确保资源在使用完毕后被正确释放，避免资源泄漏。禁用异常的场景包括极小型系统（内存不足，如 2K），硬实时系统（无法保证异常处理时间），遗留代码（指针使用复杂，缺乏所有权策略），异常实现效率低（慢、内存占用大或动态链接库支持差），管理决策（需挑战传统观念）。通常用于确保资源在代码块结束时释放，但 RAII 通过将资源管理封装在对象中，析构函数自动释放资源实现相同的目标，且更简洁。）需明确定义拷贝语义。]]></description><category></category></item><item><title><![CDATA[C++ 同步原语]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/147542120</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/147542120</guid><author>cmder1000</author><pubDate>Sat, 26 Apr 2025 20:25:16 +0800</pubDate><description><![CDATA[同步原语（Synchronization Primitives）是操作系统和编程语言提供的基本工具，用于在多线程或并发环境中协调线程（或进程）之间的执行顺序，管理共享资源的访问，以避免数据竞争（data race）、死锁（deadlock）等问题。（C++11）：RAII 封装，构造时加锁，析构时解锁，不支持手动解锁。（C++11）：允许同一线程多次锁定（递归加锁），但其他线程仍被阻塞，适合需要递归调用的场景。作用：提供无锁（lock-free）的线程安全的原子操作，适合简单变量（如计数器）的并发访问。]]></description><category></category></item><item><title><![CDATA[C++ Lambda 表达式]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/147493233</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/147493233</guid><author>cmder1000</author><pubDate>Thu, 24 Apr 2025 21:53:18 +0800</pubDate><description><![CDATA[在 C++11 到 C++17 中，Lambda 表达式生成的闭包类型没有默认构造函数，且不能直接赋值（即使 Lambda 是无状态的，即不捕获任何变量）。Lambda 表达式的捕获列表是 []，表示空捕获，即不捕获任何外部变量，既不是按值捕获也不是按引用捕获。如果 Lambda 捕获变量（有状态 Lambda），则无法使用默认构造或赋值，因为它们的行为依赖捕获的变量。是全局的，不需要捕获，而 x 是 Lambda 的参数，不是外部作用域的变量。捕获列表决定了 Lambda 如何访问外部作用域的变量。]]></description><category></category></item><item><title><![CDATA[C++ 完美转发]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/147464571</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/147464571</guid><author>cmder1000</author><pubDate>Wed, 23 Apr 2025 22:15:21 +0800</pubDate><description><![CDATA[完美转发（Perfect Forwarding）是 C++11 引入的一项重要特性，用于在函数模板中将参数以原始值类别（左值或右值）无损地传递给另一个函数，而不引入额外的拷贝或类型变化。如果参数是左值（lvalue），则以左值形式转发。如果参数是右值（rvalue），则以右值形式转发。完美转发的优势在于它将参数传递的责任从调用者转移到了模板函数（如 wrapper），从而避免了为每种参数类型或值类别编写多个重载版本。它的作用是将参数按原始值类别（左值或右值）传递给目标函数。（右值引用折叠为右值引用）]]></description><category></category></item><item><title><![CDATA[C++ 实现无锁线程安全栈]]></title><link>https://blog.youkuaiyun.com/cmder1000/article/details/147432353</link><guid>https://blog.youkuaiyun.com/cmder1000/article/details/147432353</guid><author>cmder1000</author><pubDate>Tue, 22 Apr 2025 22:16:54 +0800</pubDate><description><![CDATA[进行深拷贝也不合理，深拷贝需要遍历链表并创建新节点，但遍历过程中链表可能被其他线程修改，导致不一致，深拷贝需要复制整个链表，性能开销很大，在并发环境中难以实现，需要锁住整个链表。遍历时看到的是链表的“快照”，可能不反映最新状态，例如，线程 A 在遍历到某个节点时，线程 B 可能在头部插入一个符合条件的节点，线程 A 不会看到它。），而是通过原子操作实现线程安全，避免了锁的阻塞，提高了并发性能，但是在高竞争场景（多个线程同时压入），最终，所有线程的元素都会被正确插入，链表结构不会损坏。自动释放链表中的节点。]]></description><category></category></item></channel></rss>