<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel>
<title><![CDATA[MingSme]]></title> 
<atom:link href="http://www.mingsme.com/rss.php" rel="self" type="application/rss+xml" />
<description><![CDATA[明算软件|鸿蒙应用|游戏开发]]></description>
<link>http://www.mingsme.com/</link>
<language>zh-cn</language>
<generator>emlog</generator>

<item>
    <title>ArkTS高性能编程最佳实践</title>
    <link>http://www.mingsme.com/?post=111</link>
    <description><![CDATA[<h3>ArkTS作为鸿蒙应用开发主力语言，高性能编程直接影响用户体验（流畅度、响应速度）与设备资源利用（内存、CPU）。</h3>
<h3>优化后应用启动速度提升，UI渲染帧率提升，内存占用减少。</h3>
<ol>
<li>
<p>const声明不变变量<br />
不变的变量推荐使用const声明。</p>
<pre><code class="language-javascript">const index = 10000; // 该 变 量 在 后 续 过 程 中 未 发 生 改 变 ， 建 议 声 明 成 常 量</code></pre>
</li>
<li>
<p>避免数值类型混用<br />
引擎类型动态切换会导致性能损耗。</p>
<pre><code class="language-javascript">let intNum = 1;
intNum = 1.1; // 该 变 量 在 声 明 时 为 整 型 数 据 ， 建 议 后 续 不 要 赋 值 浮 点 型数 据
let doubleNum = 1.1;
doubleNum = 1; // 该 变 量 在 声 明 时 为 浮 点 型 数 据 ， 建 议 后 续 不要 赋 值 整 型 数据</code></pre>
</li>
<li>
<p>循环常量提取<br />
原理：减少循环体内重复访问对象属性、数组元素或调用方法的开销，将不变的引用提取到循环外部。<br />
优化前（性能较差）</p>
<pre><code class="language-javascript">class Time {
static start: number = 0;
static info: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
}
function getNum(num: number): number {
let total: number = 348;
for (let index: number = 0x8000; index &gt; 0x8; index &gt;&gt;= 1) {
/ / 多 次 对 T ime 的 in f o 及 s t a r t 进 行 查 找 ， 并 且 每 次 查找 出 来 的 值 是相 同 的
total += ((Time.info[num - Time.start] &amp; index) !== 0) ? 1 : 0;
}
return total;
}</code></pre>
<p>可以将Time.info[num - Time.start]提取为常量，这样可以显著减少属性访问次数，提升性能。</p>
<pre><code class="language-javascript">class Time {
static start: number = 0;
static info: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
}
function getNum(num: number): number {
let total: number = 348;
const info = Time.info[num - Time.start]; / / 从 循 环 中 提 取 不 变 量
for (let index: number = 0x8000; index &gt; 0x8; index &gt;&gt;= 1) {
if ((info &amp; index) != 0) {
    total++;
}
}
return total;
}</code></pre>
</li>
<li>
<p>闭包性能瓶颈<br />
作用域链延长，内存占用增加，易导致泄漏。在性能敏感场景中，建议使用参数传递函数外的变量替代。<br />
使用闭包会造成额外的开销。在性能敏感场景中，建议使用参数传递函数外的变量替代。</p>
<pre><code class="language-javascript">let arr = [0, 1, 2]
function foo(): number {
return arr[0] + arr[1]
}
foo()</code></pre>
<p>建议使用参数传递函数外部的变量，以替代使用闭包。</p>
<pre><code class="language-javascript">let arr = [0, 1, 2];
function foo(array: number[]): number {
return array[0] + array[1];
}
foo(arr);</code></pre>
</li>
<li>
<p>可选参数性能影响<br />
引擎需要处理 <code>undefined</code> 值，这会增加额外的分支判断和类型检查开销，降低函数执行效率。<br />
优化前（使用可选参数）</p>
<pre><code class="language-javascript">function add(left?: number, right?:
number): number | undefined {
if (left != undefined &amp;&amp; right !=
undefined) {
return left + right;
}
return undefined;
}</code></pre>
<p>优化后（必选参数）</p>
<pre><code class="language-javascript">function add(left: number = 0, right:
number = 0): number {
return left + right;
}</code></pre>
<p>根据业务需求，将函数参数声明为必选参数。考虑使用默认参数。</p>
</li>
<li>
<p>TypedArray核心价值<br />
针对采用二进制缓冲区（ArrayBuffer）进行存储，元素类型固定（如int8Array、Uint16Array、Float32Array等）。这使得它非常适合进行数值计算和大数据处理，因为它可以直接操作内存，避免了JavaScript动态类型带来的开销。</p>
<pre><code class="language-javascript">const typedArray1 = Int8Array.from([1, 2, 3]);
const typedArray2 = Int8Array.from([4, 5, 6]);
let res = new Int8Array(3);
for (let i = 0; i &lt; 3; i++) {
res[i] = typedArray1[i] + typedArray2[i];
}</code></pre>
</li>
<li>
<p>稀疏数组问题<br />
内存浪费（空元素会浪费空间），且遍历效率低下（使用 <code>forEach</code> 时耗时比密集数组更高）。<br />
数组元素类型不统一（如 <code>(number | string)[]</code>）会导致类型检查开销增大，并且JavaScript引擎难以进行有效的优化。</p>
</li>
<li>
<p>异常处理性能代价<br />
中断正常的执行流程，进行堆栈展开和异常对象构造，是一项昂贵的操作。在高频调用或循环中频繁抛出和捕获异常，会显著导致主线程阻塞，降低应用响应速度。<br />
提前条件判断： 在可能出错的操作前进行检查，避免异常发生。错误码代替异常： 建议使用错误码（如-1, null）来表示失败，而非抛出异常。<br />
优化前</p>
<pre><code class="language-javascript">function div(a: number, b: number):
number {
if (a &lt;= 0 || b &lt;= 0) {
    throw new Error('Invalid numbers.');
}
    return a / b;
}
function sum(num: number): number {
    let sum = 0
    try {
        for (let t = 1; t &lt; 100; t++) {
            sum += div(t, num);
        }
    } catch (e) {
    console.log(e.message);
    }
return sum;
}</code></pre>
<p>优化后</p>
<pre><code class="language-javascript">function div(a: number, b: number): number {
if (a &lt;= 0 || b &lt;= 0) {
    return NaN;
}
return a / b;
}
function sum(num: number): number {
let sum = 0
for (let t = 1; t &lt; 100; t++) {
    if (t &lt;= 0 || num &lt;= 0) {
        console.log('Invalid numbers.')
    }
    sum += div(t, num);
}
return sum;
}</code></pre>
</li>
<li>
<p>长列表优化效果对比<br />
在实际应用开发中，长列表渲染（如商品列表、消息列表）是常见的性能瓶颈。当列表项数量庞大或内容复杂时，容易出现卡顿、掉帧甚至应用崩溃。</p>
<pre><code class="language-javascript">@State data: ArticleListData | null = null;
List({ space: Constants.SPACE_16 }) {
if (this.data !== null) {
    LazyForEach(this.data, (item: LearningResource) =&gt; {
        ListItem() {
        // 完 成 列 表 项 渲 染
            ....
        }
        .reuseId('article')
    },
(item: LearningResource) =&gt; item.id)
}
}</code></pre>
<p>优化策略：<br />
• 列表：只渲染可视区域内的列表项。<br />
• 数据懒加载：滚动到底部时再加载更多数据。<br />
• 组件复用：避免频繁创建和销毁列表项组件。<br />
• 减少重绘：优化列表项布局，避免复杂计算。</p>
</li>
</ol>]]></description>
    <pubDate>Sat, 27 Dec 2025 14:08:40 +0800</pubDate>
    <dc:creator>钱满满</dc:creator>
    <guid>http://www.mingsme.com/?post=111</guid>
</item>
<item>
    <title>重磅发布 | 仓颉编程语言LTS版本正式登场</title>
    <link>http://www.mingsme.com/?post=110</link>
    <description><![CDATA[<p><strong>仓颉编程语言的首个长期支持（Long-Term Support, LTS）版本正式发布！  这不仅是仓颉发展史上的里程碑，更是为承载核心业务系统的开发者铸就的稳定性基石。</strong></p>
<p><strong>1. LTS (长期支持版本) - 稳定运行的基石</strong></p>
<p>LTS 版本专为追求系统稳定性、可靠性的企业级开发、大型工程类项目打造，避免频繁变动影响项目稳健运行。<br />
<strong>核心价值：</strong> 超长稳定期，无忧维护！ 每两年发布一次，提供长达三年的官方维护支持。最大限度降低因语言版本迭代带来的系统风险。<br />
<strong>维护内容：</strong> 在维护周期内，仓颉团队将持续提供：<br />
安全漏洞修复（尤其是高危漏洞，承诺快速响应）<br />
关键功能优化<br />
核心Bug补丁<br />
<strong>兼容性承诺：</strong> LTS版本在整个支持周期内的更新将严格保持兼容性，最大程度避免因语言升级带来的意外风险，是生产环境部署的安心之选。</p>
<p><strong>2. STS (短期支持版本) - 探索前沿的先锋</strong></p>
<p>STS 版本聚焦前沿技术探索与快速功能迭代，适用于实验性项目、技术预研及对新特性需求迫切的开发场景，为开发者提供灵活的尝鲜机会。<br />
<strong>核心价值： </strong>快速迭代，第一时间拥抱创新！ 在最新的LTS基础上，融入最新语言特性、性能优化与创新功能，发布周期不超过6个月。<br />
<strong>维护周期：</strong> 在下一个STS或LTS版本发布时终止，维护周期结束后将不再对该版本提供维护与更新。<br />
建议仅将STS版本用于临时性或对新技术响应要求高的项目。</p>
<p><img src="http://www.mingsme.com/content/uploadfile/202507/b64a1751429141.png" alt="" /></p>]]></description>
    <pubDate>Wed, 02 Jul 2025 11:54:42 +0800</pubDate>
    <dc:creator>钱满满</dc:creator>
    <guid>http://www.mingsme.com/?post=110</guid>
</item>
<item>
    <title>华为鸿蒙PC发布</title>
    <link>http://www.mingsme.com/?post=109</link>
    <description><![CDATA[<p><img src="http://www.mingsme.com/content/uploadfile/202505/302b1746762907.jpg" alt="" /></p>
<p>首款鸿蒙电脑采用麒麟X90处理器，性能相当于12代i7处理器，能效比相较于x86提升40%。</p>
<p><img src="http://www.mingsme.com/content/uploadfile/202505/94811746762743.png" alt="" /></p>
<p>鸿蒙PC终端叫HIshell，打开开发者模式就可以使用了。</p>]]></description>
    <pubDate>Fri, 09 May 2025 11:52:00 +0800</pubDate>
    <dc:creator>钱满满</dc:creator>
    <guid>http://www.mingsme.com/?post=109</guid>
</item>
<item>
    <title>CodeArts IDE for Cangjie</title>
    <link>http://www.mingsme.com/?post=108</link>
    <description><![CDATA[<ul>
<li>支持仓颉工程的快速创建</li>
<li>提供仓颉语言服务，包括语法高亮、自动补全、定义跳转、查找引用、诊断报错、选中高亮、悬浮提示、签名帮助和重命名等</li>
<li>支持仓颉工程的编译构建</li>
<li>提供可视化调试服务，方便开发者快速调试仓颉程序</li>
<li>提供仓颉文件的格式化，以及代码覆盖率统计等能力</li>
</ul>
<h1>支持仓颉语言开发</h1>
<p>仓颉语言内嵌AgentDSL的编程框架，自然语言&amp;编程语言有机融合；多Agent协同，简化符号表达，模式自由组合，支持各类智能应用开发；轻量化可缩放运行时，模块化分层设计，内存再小也能装得下；全场景领域扩展，元编程和eDSL技术，支持面向领域声明式开发；终端场景首款全并发 GC ，应用线程更流畅，响应更快。轻量化线程，并发性能更好，开销更少；安全DNA融入语言设计，帮助开发者专注于业务逻辑，免于将太多精力投入到防御性编程中，编码即安全，漏洞无处藏。</p>
<h1>便捷的仓颉编辑器</h1>
<p>CodeArts IDE for Cangjie 提供便捷易用的仓颉代码编辑服务，包括语法高亮、诊断报错、自动补全等。这些功能提供实时反馈，提升开发效率。用户还可以自定义配置以适应个人需求，增强代码可读性和可维护性，为开发者提供便捷的编程环境。</p>
<h1>丰富的仓颉工具集</h1>
<p>CodeArts IDE for Cangjie 提供了一系列命令行工具供开发者使用，包括包管理工具cjpm、命令行调试工具cjdb、代码自动格式化工具cjfmt、覆盖率统计工具cjcov、性能分析工具cjprof以及异常堆栈信息还原工具cjtrace-recover，开发者可以对这些工具进行个性化的使用。</p>
<h1>反向调试</h1>
<p>支持反向调优，开发者可以在反向调试模式下查看历史调试信息，无需反复重新启动调试，包括堆栈信息和变量信息的记录。反向调试模式下提供调试时间线，展示历史停止点在仓颉线程的分布，开发者可以直接在时间线上进行记录点之间的跳转。</p>
<p><img src="http://www.mingsme.com/content/uploadfile/202502/77841740478202.png" alt="" /></p>]]></description>
    <pubDate>Tue, 25 Feb 2025 18:05:13 +0800</pubDate>
    <dc:creator>钱满满</dc:creator>
    <guid>http://www.mingsme.com/?post=108</guid>
</item>
<item>
    <title>仓颉编程语言-cjc基本使用方法</title>
    <link>http://www.mingsme.com/?post=107</link>
    <description><![CDATA[<p>cjc的使用方法如下：<br />
<code>cjc [option] file...</code></p>
<p>假如有一个名为hello.cj的仓颉文件：</p>
<pre><code>main() {
    println("Hello, World!")
}</code></pre>
<p>可以使用以下命令来编译此文件：<br />
<code>cjc hello.cj</code></p>
<p>此工作目录下会增加main文件，cjc默认将源代码文件编译成可执行文件，文件名为main。</p>]]></description>
    <pubDate>Mon, 25 Nov 2024 21:19:53 +0800</pubDate>
    <dc:creator>钱满满</dc:creator>
    <guid>http://www.mingsme.com/?post=107</guid>
</item>
<item>
    <title>COCOS消除透明伪影</title>
    <link>http://www.mingsme.com/?post=106</link>
    <description><![CDATA[<p><img src="http://www.mingsme.com/content/uploadfile/202411/bbe71730966315.png" alt="" /><br />
游戏运行的时候，背景图片有竖线。</p>
<p><img src="http://www.mingsme.com/content/uploadfile/202411/b5a01730966324.png" alt="" /><br />
编辑的时候，图片边缘有阴影。</p>
<p>有可能是素材的问题，<br />
在素材属性检查其里，<strong>消除透明伪影</strong>。</p>]]></description>
    <pubDate>Thu, 07 Nov 2024 15:58:20 +0800</pubDate>
    <dc:creator>钱满满</dc:creator>
    <guid>http://www.mingsme.com/?post=106</guid>
</item>
<item>
    <title>仓颉编程语言-值类型和引用类型变量</title>
    <link>http://www.mingsme.com/?post=105</link>
    <description><![CDATA[<p>在仓颉编程语言中，class 和 Array 等类型属于引用类型，其他基础数据类型和 struct 等类型属于值类型。</p>
<ul>
<li>在给值类型变量赋值时，一般会产生拷贝操作，且原来绑定的数据/存储空间被覆写。在给引用类型变量赋值时，只是改变了引用关系，原来绑定的数据/存储空间不会被覆写。</li>
<li>用 let 定义的变量，要求变量被初始化后都不能再赋值。对于引用类型，这只是限定了引用关系不可改变，但是所引用的数据是可以被修改的。</li>
</ul>
<pre><code>struct Copy {
    var data = 2012
}

class Share {
    var data = 2012
}

main() {
    let c1 = Copy()
    var c2 = c1
    c2.data = 2023
    println("${c1.data}, ${c2.data}")

    let s1 = Share()
    let s2 = s1
    s2.data = 2023
    println("${s1.data}, ${s2.data}")
}</code></pre>
<p>运行结果：<br />
2021，2023<br />
2023，2023</p>]]></description>
    <pubDate>Sat, 02 Nov 2024 20:42:45 +0800</pubDate>
    <dc:creator>钱满满</dc:creator>
    <guid>http://www.mingsme.com/?post=105</guid>
</item>
<item>
    <title>仓颉语言的If表达式基本形式</title>
    <link>http://www.mingsme.com/?post=104</link>
    <description><![CDATA[<pre><code>    package Hello
    import std.random.*

    main() {
        let speed = Random().nextFloat64() * 20.0
        println("${speed} km/s")
        if (speed &gt; 16.7) {
            println("第三宇宙速度，鹊桥相会")
        } else if (speed &gt; 11.2) {
            println("第二宇宙速度，嫦娥本月")
        } else if (speed &gt; 7.9) {
            println("第一宇宙速度，腾云架雾")
        } else {
            println("脚踏实地，仰望星空")
        }
    }</code></pre>]]></description>
    <pubDate>Tue, 03 Sep 2024 19:27:00 +0800</pubDate>
    <dc:creator>钱满满</dc:creator>
    <guid>http://www.mingsme.com/?post=104</guid>
</item>
<item>
    <title>一摞Python风格的纸牌</title>
    <link>http://www.mingsme.com/?post=103</link>
    <description><![CDATA[<pre><code class="language-python">import collections
from random import choice

# namedtuple 是一个可命名的元祖，它可以让你使用属性式的标签来访问元祖中的元素，而不是通过索引
Card = collections.namedtuple('Card', ['rank', 'suit'])

class FrenchDesk:
    ranks = [str(n) for n in range(2, 11)] + list('JQKA')
    suite = '黑桃 方块 梅花 红星'.split()

    def __init__(self):
        self._cards = [Card(rank, suit) for suit in self.suite
                       for rank in self.ranks]

    def __len__(self):
        return len(self._cards)

    def __getitem__(self, position):
        return self._cards[position]

# 手工设置一张牌
beer_card = Card('7', '方块')
print("手工设置一张牌：")
print(beer_card.rank, beer_card.suit)

deck = FrenchDesk()
print(f"总共有 {len(deck)} 张牌。")

print(deck[0])
print(deck[-1])

# 随机选一张牌
# 函数random.choice 可以从序列中随机获取一项的函数
print("随机获取的牌：")
print(choice(deck))
print(choice(deck))
print(choice(deck))</code></pre>
<p>Fluent Python 1-1</p>]]></description>
    <pubDate>Sun, 28 Apr 2024 21:58:00 +0800</pubDate>
    <dc:creator>钱满满</dc:creator>
    <guid>http://www.mingsme.com/?post=103</guid>
</item>
<item>
    <title>打印输出所有事件</title>
    <link>http://www.mingsme.com/?post=102</link>
    <description><![CDATA[<p>在pygame窗口中输出事件队列中的所有事件。</p>
<pre><code class="language-python">import random
import pygame
import sys

SIZE = WIDTH, HEIGHT = 640, 396
FPS = 60

pygame.init()
screen = pygame.display.set_mode(SIZE, 0, 32)
pygame.display.set_caption("Event")
clock = pygame.time.Clock()
font = pygame.font.SysFont(None, 25)
font_height = font.get_linesize()
event_list = []
line_num = SIZE[1]

running = True

while running:
    event = pygame.event.wait()
    event_list.append(str(event))
    event_text = event_list[-line_num:]

    if event.type == pygame.QUIT:
        sys.exit()
    screen.fill((54, 59, 64))

    y = SIZE[1] - font_height
    for text in reversed(event_list):
        rgb = tuple((random.randint(0,255) for i in range(3)))
        screen.blit(font.render(text, True, rgb), (0, y))
        y -= font_height

    pygame.display.update()</code></pre>
<p><img src="http://www.mingsme.com/content/uploadfile/202404/4a7a1713258541.jpg" alt="" /></p>]]></description>
    <pubDate>Tue, 16 Apr 2024 16:57:00 +0800</pubDate>
    <dc:creator>钱满满</dc:creator>
    <guid>http://www.mingsme.com/?post=102</guid>
</item>
</channel>
</rss>