关于一部分weasel的用户卡顿的原因和改进建议
上报前请检查
- [ ] 我遇到的问题没有其他人在 issue 里提到过
- [ ] 我的小狼毫版本于 rime/weasel 下载
- [ ] 我在使用小狼毫的最新发布版本,或最新发布版本后的 CI 构建
操作系统信息
- OS 详细版本:Windows10操作系统及几个其他的操作系统
- 小狼毫版本: 0.16.0.0版、0.15.0.0版
描述遇到的问题 使用weasel进行输入时,输入和选词均存在较大的延迟。 原因在于系统对CPU功耗优化,使CPU在低强度运行时频率较低。
复现步骤 正常输入时,按键后选词框弹出的速度明显缓慢。 打开任务管理器->性能->CPU。 可以看到,此时查看CPU频率在1ghz以下(在我的电脑上是0.5ghz),使用输入法输入时,CPU频率并没有增加多少,几个存在卡顿的朋友也是如此。 我的笔记本电脑切换到高性能模式(此时CPU稳定在2.4ghz),群友的台式机锁频到2ghz以上,并在任务管理器->详细信息中将WeaselServer.exe的优先级设置成实时。 此时再使用Rime进行输入时,可以看到已经完全没有卡顿的现象出现。 综上所述,我推测部分weasel用户卡顿的原因在于系统对CPU功耗优化。
预期行为 希望weasel加入如下功能: 设置一个选项,如果用户存在上述问题造成weasel卡顿时,可以开启该选项。 开启后,用户可以根据需要设置CPU频率。 当输入文字时,weasel自动将CPU频率提升至用户设置的频率。当用户不再输入文字一定时间后(可以设置为用户自定义),weasel放弃控制CPU频率,使其回复默认。如此可以减少笔记本电脑用户的电池能耗,不必担心干扰续航。 如果该功能确实难以实现,希望weasel可以先将该问题通告一下,方便存在卡顿的用户使用、调整。
用户文件 请于此附上 weasel 用户文件夹下的内容,方便开发者调试问题
截图 如果问题需要,可附上 GIF 图片
其他补充说明 如果有其他补充说明,可以写在这里
报卡顿的同学,大概应该是对整体窗体做了阴影,在节能模式下,CPU不满足快速响应阴影计算的要求吧。阴影是添头,不要盲上。
我这里应该和窗体阴影的关系不大,我的系统是刚装的,并且安装时就已经关闭了Windows窗体阴影。
在输入第一个字符时,rime会花费150ms左右的时间创建候选框窗体,后续继续输入计算仍然要100ms左右时间进行响应,应该至少有70ms的时间在做内容方面的运算,应该和窗体关系不大。
之前我测试了一下微软拼音输入法做对比,在使用微软拼音进行输入的时候,在第一下卡顿之后,在持续输入时,微软拼音会让cpu频率保持在1ghz以上。这个CPU频率正巧可以使微软输入法不至于卡顿。
相比较使用rime输入法进行输入时,CPU频率一直在0.5ghz和0.7ghz之间波动,在这个频率进行使用,卡顿的感觉就十分明显了。
并且和输入方案应该也没有关系,我用过一台更老的电脑,2011年的probook6450b,使用的是32nm制程的i5-520m,进行长期的Word编辑工作、视频弹幕编辑和QQ聊天。在测试时没有见到任何卡顿的现象。
报卡顿的同学,大概应该是对整体窗体做了阴影,在节能模式下,CPU不满足快速响应阴影计算的要求吧。阴影是添头,不要盲上。
刚刚发错了,忘了加回复了.... :-) 应该和阴影无关,我在后面的楼层写了一些图文解释。
小狼毫没有一次很多,每次只有page_size 个(后端给多少就是多少),要优化的话空间在后端上
候选框出现慢:第一个编码上屏后,候选框延迟 1 秒才出现,后续未见卡顿(某字符所对应的候选过多,例如十万个 v 开头的候选)
关于这个问题,奇怪的是,fcitx5-rime 和 Squirrel 未报告卡顿,是不是客户端内做了限制出词的逻辑,比如一次 query 只出 1000 个词。
如果是的话,希望小狼毫也做一个。因为这可以保证大词库,简拼的正常运行,而且对实际使用没有影响,1000 词需要翻 200 页,根本用不上。
@fxliang
报卡顿的同学,大概应该是对整体窗体做了阴影,在节能模式下,CPU不满足快速响应阴影计算的要求吧。阴影是添头,不要盲上。
刚刚发错了,忘了加回复了.... :-) 应该和阴影无关,我在后面的楼层写了一些图文解释。
我指的是小狼毫的候选窗口阴影特性;
另外可以试试#1253 提高了进程的优先级,可能有一点点改善
报卡顿的同学,大概应该是对整体窗体做了阴影,在节能模式下,CPU不满足快速响应阴影计算的要求吧。阴影是添头,不要盲上。
刚刚发错了,忘了加回复了.... :-) 应该和阴影无关,我在后面的楼层写了一些图文解释。
我指的是小狼毫的候选窗口阴影特性;
另外可以试试#1253 提高了进程的优先级,可能有一点点改善
感觉我这个应该没有开窗口阴影特效。
优先级的话,我之前有做过尝试,即便是调整成实时也没有太大的改变。我以前也试着推荐让几个遇见过这个问题的朋友尝试,但都没有明显的改善。
但是将CPU频率拉起来,确实能得到很明显的提升。即便是一些由于本身lua算法设计问题造成的延迟也能得到不小的改善。
所以希望设计一个这样的功能,即便用户可能因为设置或方案设计问题造成卡顿,也能通过拉高CPU频率这样的方法,将问题掩盖掉。
我现在遇到的问题是隔一段时间Windows会整个卡上2、3秒钟,键盘没有反应,鼠标点任何窗口都没有响应。
不知道什么原因。
安装了b1aebe8,目前最新的nightly,但出现了卡一下然后后台崩溃的情况,添加的守护进程没有生效,需要手动重启服务才行。
经过这次崩溃后正常运行的时间里,日志里有看到守护进程拉起后台的日志
安装了b1aebe8,目前最新的nightly,但出现了卡一下然后后台崩溃的情况,添加的守护进程没有生效,需要手动重启服务才行。
经过这次崩溃后正常运行的时间里,日志里有看到守护进程拉起后台的日志
守护不是一崩就拉起,如果连续6次按键消息无响应后拉起
另外卡一下之后,应该会在日志目录里面生成dmp崩溃文件,右击->日志文件夹可以看到
安装了b1aebe8,目前最新的nightly,但出现了卡一下然后后台崩溃的情况,添加的守护进程没有生效,需要手动重启服务才行。 经过这次崩溃后正常运行的时间里,日志里有看到守护进程拉起后台的日志
守护不是一崩就拉起,如果连续6次按键消息无响应后拉起
另外卡一下之后,应该会在日志目录里面生成dmp崩溃文件,右击->日志文件夹可以看到
确实有dmp文件,需要发上来吗
安装了b1aebe8,目前最新的nightly,但出现了卡一下然后后台崩溃的情况,添加的守护进程没有生效,需要手动重启服务才行。 经过这次崩溃后正常运行的时间里,日志里有看到守护进程拉起后台的日志
守护不是一崩就拉起,如果连续6次按键消息无响应后拉起 另外卡一下之后,应该会在日志目录里面生成dmp崩溃文件,右击->日志文件夹可以看到
确实有dmp文件,需要发上来吗
看这个吧,自行消化一部分 https://github.com/rime/weasel/issues/1259
安装了b1aebe8,目前最新的nightly,但出现了卡一下然后后台崩溃的情况,添加的守护进程没有生效,需要手动重启服务才行。 经过这次崩溃后正常运行的时间里,日志里有看到守护进程拉起后台的日志
守护不是一崩就拉起,如果连续6次按键消息无响应后拉起 另外卡一下之后,应该会在日志目录里面生成dmp崩溃文件,右击->日志文件夹可以看到
确实有dmp文件,需要发上来吗
看这个吧,自行消化一部分 #1259
消化不了...
关闭用户词典大概率就不太崩了
关闭用户词典大概率就不太崩了
但以往版本不会这么能感知崩溃
+1
非常感谢了。 我之前也是这样,一旦开始打长文字,很快就会出现卡顿,在之前带团的时候问题非常严重(就算是CPU此时已经处于高频率也是这样) 看了issue后我改了优先级,现在非常跟手了。 所以其实我觉得核心问题和CPU的频率无关,主要问题还是Weasel的CPU调用有问题,可能是由于什么原因,让系统分配的CPU时间少……
我长时间运行之后也会变得越来越卡,重启算法服务之后会好一点
一个比较详细的临时方案,通过反复询问GPT4-o和GPT4-o1得到
设置优先级
打开任务管理器:
- 按下
Ctrl + Shift + Esc或右键单击任务栏并选择“任务管理器”。切换到“详细信息”选项卡:
- 如果任务管理器显示的是简化视图,点击左下角的“更多详细信息”。
- 然后切换到“详细信息”选项卡。
找到目标进程:
- 在列表中找到
WeaselServer.exe。设置优先级:
- 右键单击
WeaselServer.exe,选择“设置优先级”。- 选择“实时”或“高”。
确认更改:
- 系统会弹出提示框,确认设置后即可。
注意问了ChatGPT这个设置是临时的,所以加了一个开机自动设置
开机自动设置(Win11)
创建一个WeaselServerLauncher.vbs(先创建.txt,然后修改后缀)可以放到你的程序文件夹下
内容为:
Option Explicit Dim WshShell, cmd Set WshShell = CreateObject("WScript.Shell") ' 程序路径(确保包含双引号以正确处理空格) Dim progPath progPath = """D:\Program Files\Rime\weasel-0.16.3\WeaselServer.exe""" ' 构造命令行: ' 原代码使用 /HIGH,以高优先级启动: ' cmd = "cmd.exe /c start ""Weasel"" /HIGH " & progPath ' ' 如果需要使用实时优先级,将 /HIGH 修改为 /REALTIME: ' 注意:实时优先级对系统影响较大,请谨慎使用。 cmd = "cmd.exe /c start ""Weasel"" /HIGH " & progPath ' 使用 WshShell.Run 执行命令: ' 参数说明: ' - cmd:要执行的命令 ' - 0:隐藏窗口(不显示cmd窗口) ' - False:不等待命令执行完成立即返回 WshShell.Run cmd, 0, False Set WshShell = Nothing然后win+R,regedit,打开后地址输入为:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
定位到开机启动项,找到WeaselServer,把数值数据改为刚刚创建.vbs的启动命令,注意替换地址
wscript.exe "地址前缀\WeaselServerLauncher.vbs"
不少用户在用很重的复杂的librime-lua组件,很多时候很可能是有问题的。如果试试明月拼音不用那些奇奇怪怪的lua组件一段时间,说不定服务就不卡了。
我最近也在经历rime的卡顿问题,它总是不经意地出现,然后在某个场景下好像又能自己恢复正常状态,就比如我现在在浏览器里打这段字,性能表现就非常正常,但是我刚刚在TG里回消息,它就很卡。不排除这是使用了第三方词库的原因(白霜词库),但是,如果说禁用了第三方词库换来rime正常的性能表现,那我估计自己可能会逃离rime。前文提到的,把WeaselServer.exe在任务管理器里改成实时或者高,确实能改善当前卡顿的状态。还是希望开发者能优化一下吧,非常感谢!
你们卡顿发生时,%Temp%\rime.weasel目录下有新增崩溃转储DMP文件或者ERROR日志吗。
我禁用包含Notifier的Lua脚本后,崩溃现象似乎消失。未看出为什么那些Lua导致KeyEvent期间偶发崩溃。错误日志有多种。崩溃时偶尔也看到level_db.cc:259] Error opening db 'rime_mint': IO error: C:\Users\[用户名]\AppData\Roaming\Rime\rime_mint.userdb/LOCK: 另一个程序正在使用此文件,进程无法访问。
你们卡顿发生时,
%Temp%\rime.weasel目录下有新增崩溃转储DMP文件或者ERROR日志吗。我禁用包含
Notifier的Lua脚本后,崩溃现象似乎消失。未看出为什么那些Lua导致KeyEvent期间偶发崩溃。错误日志有多种。崩溃时偶尔也看到level_[db.cc:259](http://db.cc:259)] Error opening db 'rime_mint': IO error: C:\Users\[用户名]\AppData\Roaming\Rime\rime_mint.userdb/LOCK: 另一个程序正在使用此文件,进程无法访问。
我找到了今天rime卡顿时候的一个dump日志文件了,可能真的跟contributor说的那样,使用了比较繁重的第三方词库就会出现类似的问题,但是更改进程的cpu优先级又能变得流畅……这让我很纠结,我是打算主力使用rime的,现在不得不重新考虑了。
儘量用預設的方案和配置吧。性能穩定。
我找到了今天rime卡顿时候的一个dump日志文件了,可能真的跟contributor说的那样,使用了比较繁重的第三方词库就会出现类似的问题,但是更改进程的cpu优先级又能变得流畅……这让我很纠结,我是打算主力使用rime的,现在不得不重新考虑了。
若執行腳本程序,那就得取決於腳本的作者怎麼寫了。不是 Rime 能控制的。
librime-lua插件实际是通过lua的形式写cpp代码,写得不好的话,那是没有办法的
加上custom之后很卡,win11上通过任务栏点图标切应用,点几个直接就卡死个3-5秒这种状态。配置用的五笔拼音混输。把windows defender设置了实时保护白名单,把rime目录还有WeaselServer.exe进程都加去了,都没有用
把custom去掉又不卡了,这个custom配置有严重问题么
wubi_pinyin.schema.yaml
# Rime schema settings
# encoding: utf-8
schema:
schema_id: wubi_pinyin
name: "五笔·拼音"
version: "0.9"
author:
- 發明人 王永民先生
description: |
五筆字型86版+漢語拼音混合輸入。
碼表源自 ibus-table
dependencies:
- pinyin_simp
switches:
- name: ascii_mode
reset: 1
states: [ 中文, 西文 ]
- name: full_shape
states: [ 半角, 全角 ]
- name: extended_charset
states: [ 常用, 增廣 ]
- name: ascii_punct
states: [ 。,, ., ]
engine:
processors:
- ascii_composer
- recognizer
- key_binder
- speller
- punctuator
- selector
- navigator
- express_editor
segmentors:
- ascii_segmentor
- matcher
- abc_segmentor
- punct_segmentor
- fallback_segmentor
translators:
- punct_translator
- reverse_lookup_translator
- table_translator
speller:
delimiter: " ;'"
#max_code_length: 4 # 四碼頂字上屏
translator:
dictionary: wubi86
prism: wubi_pinyin
enable_charset_filter: true
enable_sentence: true
enable_encoder: true
encode_commit_history: true
max_phrase_length: 4
disable_user_dict_for_patterns:
- "^z.*$"
abc_segmentor:
extra_tags:
- reverse_lookup
reverse_lookup:
dictionary: pinyin_simp
prefix: "`"
suffix: "'"
tips: 〔拼音〕
preedit_format:
- xform/([nl])v/$1ü/
- xform/([nl])ue/$1üe/
- xform/([jqxy])v/$1u/
punctuator:
import_preset: default
key_binder:
import_preset: default
recognizer:
import_preset: default
patterns:
reverse_lookup: "`[a-z]*'?$"
wubi_pinyin.custom.yaml
# Rime schema settings
# encoding: utf-8
patch:
switches/@next:
name: emoji_suggestion
reset: 1
states: ["🈚︎", "🈶️"]
"engine/filters/@before 0": simplifier@emoji_suggestion
emoji_suggestion:
opencc_config: emoji.json
option_name: emoji_suggestion
tips: all
inherit_comment: false
"engine/filters/@before 2": uniquifier
# engine/translators/+:
# - script_translator
# librime-lua 输入动态时间和日期
# "engine/translators/@6": lua_translator@date_translator
# 快捷表情和符号
punctuator:
import_preset: symbols
symbols:
"/fs": [ ½, ‰, ¼, ⅓, ⅔, ¾, ⅒ ]
"/xh": [ *, ×, ✱, ★, ☆, ✩, ✧, ❋, ❊, ❉, ❈, ❅, ✿, ✲ ]
"/dq": [ 🌍, 🌎, 🌏, 🌐, 🌑, 🌒, 🌓, 🌔, 🌕, 🌖, 🌗, 🌘 ]
"/sg": [ 🍇, 🍉, 🍌, 🍍, 🍎, 🍏, 🍑, 🍒, 🍓, 🍗, 🍦, 🎂, 🍺, 🍻 ]
"/dw": [ 🙈, 🐵, 🐈, 🐷, 🐨, 🐼, 🐾, 🐔, 🐬, 🐠, 🦋 ]
"/bq": [ 😀, 😁, 😂, 😃, 😄, 😅, 😆, 😉, 😊, 😋, 😎, 😍, 😘, 😗 ]
"/ss": [ 💪, 👈, 👉, 👆, 👇, ✋, 👌, 👍, 👎, ✊, 👊, 👋, 👏, 👐 ]
half_shape:
"#": "#"
"*": "*"
"`": "`"
"~": "~"
"@": "@"
"=": "="
'\': "、"
"%": "%"
"$": [ "¥", "$" ]
"|": [ "|", "|", "·" ]
"/": [ "/", "÷" ]
"'": { pair: [ "「", "」" ] }
"[": "【"
"]": "】"
"<": "《"
">": "》"
recognizer/patterns/punct: "^/([a-z]+|[0-9]0?)$"
"engine/filters/@before 2": uniquifier
這是在幹什麼。方案里沒有 filter 啊。
我建議用默認的配置。
默認沒有問題的話,就不能斷定是前端的問題了,很有可能是自定義配置的問題。
"engine/filters/@before 2": uniquifier
這是在幹什麼。方案里沒有 filter 啊。
这套配置在mac上也使用,测试的时候发现候选词和emoji有重复,就加了这条。可能别的配置导致了重复,这个uniquifier最后删掉了 默认用着是好的 纯新手,使用rime还不到一星期 😄️
加上custom之后很卡,win11上通过任务栏点图标切应用,点几个直接就卡死个3-5秒这种状态。配置用的五笔拼音混输。把windows defender设置了实时保护白名单,把rime目录还有WeaselServer.exe进程都加去了,都没有用
把custom去掉又不卡了,这个custom配置有严重问题么
wubi_pinyin.schema.yaml
# Rime schema settings # encoding: utf-8 schema: schema_id: wubi_pinyin name: "五笔·拼音" version: "0.9" author: - 發明人 王永民先生 description: | 五筆字型86版+漢語拼音混合輸入。 碼表源自 ibus-table dependencies: - pinyin_simp switches: - name: ascii_mode reset: 1 states: [ 中文, 西文 ] - name: full_shape states: [ 半角, 全角 ] - name: extended_charset states: [ 常用, 增廣 ] - name: ascii_punct states: [ 。,, ., ] engine: processors: - ascii_composer - recognizer - key_binder - speller - punctuator - selector - navigator - express_editor segmentors: - ascii_segmentor - matcher - abc_segmentor - punct_segmentor - fallback_segmentor translators: - punct_translator - reverse_lookup_translator - table_translator speller: delimiter: " ;'" #max_code_length: 4 # 四碼頂字上屏 translator: dictionary: wubi86 prism: wubi_pinyin enable_charset_filter: true enable_sentence: true enable_encoder: true encode_commit_history: true max_phrase_length: 4 disable_user_dict_for_patterns: - "^z.*$" abc_segmentor: extra_tags: - reverse_lookup reverse_lookup: dictionary: pinyin_simp prefix: "`" suffix: "'" tips: 〔拼音〕 preedit_format: - xform/([nl])v/$1ü/ - xform/([nl])ue/$1üe/ - xform/([jqxy])v/$1u/ punctuator: import_preset: default key_binder: import_preset: default recognizer: import_preset: default patterns: reverse_lookup: "`[a-z]*'?$"wubi_pinyin.custom.yaml
# Rime schema settings # encoding: utf-8 patch: switches/@next: name: emoji_suggestion reset: 1 states: ["🈚︎", "🈶️"] "engine/filters/@before 0": simplifier@emoji_suggestion emoji_suggestion: opencc_config: emoji.json option_name: emoji_suggestion tips: all inherit_comment: false "engine/filters/@before 2": uniquifier # engine/translators/+: # - script_translator # librime-lua 输入动态时间和日期 # "engine/translators/@6": lua_translator@date_translator # 快捷表情和符号 punctuator: import_preset: symbols symbols: "/fs": [ ½, ‰, ¼, ⅓, ⅔, ¾, ⅒ ] "/xh": [ *, ×, ✱, ★, ☆, ✩, ✧, ❋, ❊, ❉, ❈, ❅, ✿, ✲ ] "/dq": [ 🌍, 🌎, 🌏, 🌐, 🌑, 🌒, 🌓, 🌔, 🌕, 🌖, 🌗, 🌘 ] "/sg": [ 🍇, 🍉, 🍌, 🍍, 🍎, 🍏, 🍑, 🍒, 🍓, 🍗, 🍦, 🎂, 🍺, 🍻 ] "/dw": [ 🙈, 🐵, 🐈, 🐷, 🐨, 🐼, 🐾, 🐔, 🐬, 🐠, 🦋 ] "/bq": [ 😀, 😁, 😂, 😃, 😄, 😅, 😆, 😉, 😊, 😋, 😎, 😍, 😘, 😗 ] "/ss": [ 💪, 👈, 👉, 👆, 👇, ✋, 👌, 👍, 👎, ✊, 👊, 👋, 👏, 👐 ] half_shape: "#": "#" "*": "*" "`": "`" "~": "~" "@": "@" "=": "=" '\': "、" "%": "%" "$": [ "¥", "$" ] "|": [ "|", "|", "·" ] "/": [ "/", "÷" ] "'": { pair: [ "「", "」" ] } "[": "【" "]": "】" "<": "《" ">": "》" recognizer/patterns/punct: "^/([a-z]+|[0-9]0?)$"
我也是这个问题,win10,困挠我很久了,没打字,只是点击状态栏电脑就会卡住几秒