<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Mac版卡组编辑器问题</title>
<link>https://ygobbs2.com/t/mac%E7%89%88%E5%8D%A1%E7%BB%84%E7%BC%96%E8%BE%91%E5%99%A8%E9%97%AE%E9%A2%98/583496</link>
<description>
**使用的萌卡平台:** <Mac版>
**使用的YGOPro:** <YGOPro>
**使用的服务器:** N/A
**第几回合:** N/A
**进行的操作:** 卡组编辑器右侧的卡片列表使用鼠标滚轮或触控板向下滚动后,会出现列表又反向向上滚动的情况。
已确认的代码缺陷
macOS 的 Irrlicht 后端把 NSEvent.deltaY 转为 Wheel 并发送滚轮事件,没有过滤纵向位移为零的事件。
卡片列表原逻辑为“Wheel < 0 时向下,否则向上”,因此 Wheel 为 +0.0 或 -0.0 时也会错误向上移动一行。
这条零值事件到错误向上滚动的代码路径已经确认;未捕获用户出现问题时的原始硬件事件,所以不能认定其每次反向滚动都一定由零值事件触发。
修复内容
忽略卡片列表的零值滚轮输入,保留正常向上、向下滚动及列表边界行为。没有修改系统的自然滚动或惯性设置。
源码对照(仅示意卡片列表的方向分支)
原逻辑:
if (Wheel < 0) { 向下移动一行; }
else { 向上移动一行; }
修复后等价逻辑:
if (Wheel < 0) { 向下移动一行; }
else if (Wheel != 0) { 向上移动一行; }
本地二进制补丁仅替换 ARM64 切片的一条四字节指令:
地址:0x1000340f4
原指令:cmp w20, #1
新指令:ccmp w20, #1, #8, ne
原字节:9f 06 00 71
新字节:88 1a 41 7a
该替换利用前面的浮点比较结果,使正零、负零跳过列表移动;非零输入保留原有处理。
源码参考
卡片列表处理:gframe/deck_con.cpp,EMIE_MOUSE_WHEEL 分支。
https://github.com/purerosefallen/ygopro/blob/a681a2004decfd3e87801c8d7e55d39634966333/gframe/deck_con.cpp
macOS 滚轮事件:source/Irrlicht/CIrrDeviceOSX.mm,NSScrollWheel 分支。
https://github.com/mercury233/irrlicht/blob/main/source/Irrlicht/CIrrDeviceOSX.mm
验证结果
1. 源逻辑离线回归:9 组场景、5,610 个输入/位置/边界组合全部通过,覆盖连续下滚或上滚后接零值、正负零、小数和边界。
2. 原生 ARM64 指令回归:11,220 个组合全部通过,覆盖正负零、正负小数、次正规数、边界、无穷值和 NaN;确认零值不再移动,非零行为保持一致。
3. 界面滚动验证:连续向下 6 次、向上 6 次,列表按预期方向滚动。
离线测试验证逻辑和 CPU 指令;界面测试验证应用中的滚动表现。它们均不等同于捕获用户原始硬件事件。</description>
<language>zh-CN</language>
<lastBuildDate>Sun, 06 Sep 2026 23:26:34 +0000</lastBuildDate>
<category>问题反馈</category>
<atom:link href="https://ygobbs2.com/t/mac%E7%89%88%E5%8D%A1%E7%BB%84%E7%BC%96%E8%BE%91%E5%99%A8%E9%97%AE%E9%A2%98/583496.rss" rel="self" type="application/rss+xml" />
<item>
<title>Mac版卡组编辑器问题</title>
<dc:creator><![CDATA[星光pokeboy]]></dc:creator>
<description><![CDATA[
<p>谢谢你的提议,这部分用的人和维护的人太少了。请提交一个PR吧</p>
<p><a href="https://ygobbs2.com/t/mac%E7%89%88%E5%8D%A1%E7%BB%84%E7%BC%96%E8%BE%91%E5%99%A8%E9%97%AE%E9%A2%98/583496/5">阅读整个主题</a></p>
]]></description>
<link>https://ygobbs2.com/t/mac%E7%89%88%E5%8D%A1%E7%BB%84%E7%BC%96%E8%BE%91%E5%99%A8%E9%97%AE%E9%A2%98/583496/5</link>
<pubDate>Sun, 06 Sep 2026 18:55:43 +0000</pubDate>
<guid isPermaLink="false">ygobbs2.com-post-583496-5</guid>
<source url="https://ygobbs2.com/t/mac%E7%89%88%E5%8D%A1%E7%BB%84%E7%BC%96%E8%BE%91%E5%99%A8%E9%97%AE%E9%A2%98/583496.rss">Mac版卡组编辑器问题</source>
</item>
<item>
<title>Mac版卡组编辑器问题</title>
<dc:creator><![CDATA[Elder]]></dc:creator>
<description><![CDATA[
<p>MyCard“编辑”入口导致 KoishiPro 闪退:问题说明与临时处理</p>
<p>问题发生于 2026 年 9 月 6 日。环境为 macOS 26.6.2、Apple Silicon 原生 ARM64,客户端为 MyCard 内安装的 KoishiPro Mesmerizer。</p>
<p>一、现象与复现条件</p>
<p>点击 MyCard 的“编辑”按钮后,KoishiPro 在启动约 2.66 秒后退出。同一份游戏程序通过普通入口启动,再手动进入卡组编辑器,可以正常使用。</p>
<p>MyCard 的 macOS 卡组编辑动作使用“-d”参数直接打开编辑器。本次安装同时存在根目录 lflist.conf 与 expansions/lflist.conf;二者各包含 102 张禁限表,规则内容完全一致,仅扩展副本末尾多一个换行。</p>
<p>可用于定位的原始崩溃记录:ygopro-2026-09-06-220857.ips。记录显示游戏于 22:08:19.365 启动、22:08:22.028 崩溃;退出的是由 MyCard Helper 启动的 ygopro 子进程。主线程异常为 EXC_BAD_ACCESS / SIGSEGV,首帧位于 ygopro 的偏移 0x529a4。已核对安装程序的 ARM64 UUID 与该报告一致。</p>
<p>二、原因定位</p>
<p>崩溃位置是绘制卡片缩略图后、查询该卡禁限数量的步骤。反汇编显示程序读取禁限表哈希桶时使用了无效地址;当时查询的官方卡号为 43096270(紫翠玉龙)。该卡号只是触发当帧查询的数据,没有证据表明这张卡本身有问题。</p>
<p>KoishiPro 官方源码中存在以下启动顺序:</p>
<ol>
<li>初始化时先读取根目录禁限表。</li>
<li>处理“-d”参数时,立即打开编辑器;编辑器保存当前禁限表对象的地址。</li>
<li>随后进入 MainLoop,才读取扩展目录。</li>
<li>expansions/lflist.conf 中的列表被插入禁限表 vector,先前保存的对象地址因此失效。</li>
<li>RefreshLFList 只刷新下拉框,没有重新绑定编辑器持有的禁限表指针。之后绘制禁限标志时访问旧地址,触发崩溃。</li>
</ol>
<p>普通启动先完成扩展加载,再由用户进入编辑器,因此取得的是加载完成后的有效地址。这与本次“快捷编辑闪退、普通启动正常”的实际差异一致。</p>
<p>源码依据为官方仓库 purerosefallen/ygopro 的固定提交 a681a2004decfd3e87801c8d7e55d39634966333。相关函数参数和绘制逻辑与本机反汇编匹配;未取得安装包对应的完整构建记录,因此不将该提交宣称为安装包的精确构建源码。</p>
<p>三、本次实际处理与验证</p>
<p>本次采用的是可逆的配置处理:确认两份禁限表仅末尾换行不同后,将重复的 expansions/lflist.conf 移到扩展扫描路径之外,保留根目录 lflist.conf。没有修改游戏二进制,也没有修复或重新编译游戏源码。补丁脚本应默认只检查;两份文件的规则内容不同时拒绝处理,避免移走有效的独立规则。</p>
<p>当时扩展扫描路径中没有其他包含禁限表的 ZIP/YPK 包,默认仅扫描 expansions;配置选择的是第 0 张禁限表,根目录与扩展副本的首表均为 2026.7。移开重复副本后,规则仍由根目录文件提供,并消除了本次启动时再次插入重复列表的触发条件。</p>
<p>处理后已连续两次通过 MyCard 的实际“编辑”按钮成功打开编辑器;原崩溃中出现的紫翠玉龙也已完成正常查卡验证。</p>
<p>四、适用边界与上游修复方向</p>
<p>这是针对当前安装内容的临时处理,尚未消除程序中的启动顺序缺陷。后续自动更新如果重新生成 expansions/lflist.conf,或新增其他扩展路径、包含禁限表的 ZIP/YPK 包,问题仍可能复发。规则内容不相同的扩展禁限表不能直接按此方法移除。</p>
<p>上游修复应让扩展加载先于快捷编辑器初始化,或在禁限表容器发生改变后安全地重新绑定编辑器指针;同时验证“-d”启动、普通启动、多个扩展表以及压缩包内禁限表等入口。恢复本次移开的副本后,原触发条件也会恢复。</p>
<p>公开源码链接:<br>
<aside class="onebox githubblob">
<header class="source">
<a href="https://github.com/purerosefallen/ygopro/blob/a681a2004decfd3e87801c8d7e55d39634966333/gframe/gframe.cpp#L142" target="_blank" rel="noopener nofollow ugc">github.com</a>
</header>
<article class="onebox-body">
<h4><a href="https://github.com/purerosefallen/ygopro/blob/a681a2004decfd3e87801c8d7e55d39634966333/gframe/gframe.cpp#L142" target="_blank" rel="noopener nofollow ugc">purerosefallen/ygopro/blob/a681a2004decfd3e87801c8d7e55d39634966333/gframe/gframe.cpp#L142</a></h4>
<pre class="onebox"><code class="lang-cpp"><ol class="start lines" start="132" style="counter-reset: li-counter 131 ;">
<li> ygo::mainGame->exit_on_return = false;</li><li> keep_on_return = true;</li><li> } else if(!std::wcscmp(wargv[i], L"--auto-watch")) { // Auto watch mode</li><li> auto_watch_mode = true;</li><li> } else if(!std::wcscmp(wargv[i], L"--deck-category")) {</li><li> ++i;</li><li> if(i < wargc) {</li><li> deckCategorySpecified = true;</li><li> BufferIO::CopyWideString(wargv[i], ygo::mainGame->gameConf.lastcategory);</li><li> }</li><li class="selected"> } else if(!std::wcscmp(wargv[i], L"-d")) { // Deck</li><li> ++i;</li><li> if(!deckCategorySpecified)</li><li> ygo::mainGame->gameConf.lastcategory[0] = 0;</li><li> if(i + 1 < wargc) { // select deck</li><li> BufferIO::CopyWideString(wargv[i], ygo::mainGame->gameConf.lastdeck);</li><li> continue;</li><li> } else { // open deck</li><li> ygo::mainGame->exit_on_return = !keep_on_return;</li><li> if(i < wargc) {</li><li> ygo::mainGame->open_file = true;</li>
</ol></code></pre>
</article>
<div class="onebox-metadata">
</div>
<div style="clear: both"></div>
</aside>
<br>
<aside class="onebox githubblob">
<header class="source">
<a href="https://github.com/purerosefallen/ygopro/blob/a681a2004decfd3e87801c8d7e55d39634966333/gframe/deck_con.cpp#L82" target="_blank" rel="noopener nofollow ugc">github.com</a>
</header>
<article class="onebox-body">
<h4><a href="https://github.com/purerosefallen/ygopro/blob/a681a2004decfd3e87801c8d7e55d39634966333/gframe/deck_con.cpp#L82" target="_blank" rel="noopener nofollow ugc">purerosefallen/ygopro/blob/a681a2004decfd3e87801c8d7e55d39634966333/gframe/deck_con.cpp#L82</a></h4>
<pre class="onebox"><code class="lang-cpp"><ol class="start lines" start="72" style="counter-reset: li-counter 71 ;">
<li> mainGame->wCardImg->setVisible(true);</li><li> mainGame->wDeckEdit->setVisible(true);</li><li> mainGame->wFilter->setVisible(true);</li><li> mainGame->wSort->setVisible(true);</li><li> mainGame->btnLeaveGame->setVisible(true);</li><li> mainGame->btnLeaveGame->setText(dataManager.GetSysString(1306));</li><li> mainGame->btnSideOK->setVisible(false);</li><li> mainGame->btnSideShuffle->setVisible(false);</li><li> mainGame->btnSideSort->setVisible(false);</li><li> mainGame->btnSideReload->setVisible(false);</li><li class="selected"> if (mainGame->gameConf.use_lflist) {</li><li> filterList = &deckManager._lfList[mainGame->gameConf.default_lflist];</li><li> }</li><li> else {</li><li> filterList = &deckManager._lfList.back();</li><li> }</li><li> ClearSearch();</li><li> mouse_pos.set(0, 0);</li><li> hovered_code = 0;</li><li> hovered_pos = 0;</li><li> hovered_seq = -1;</li>
</ol></code></pre>
</article>
<div class="onebox-metadata">
</div>
<div style="clear: both"></div>
</aside>
<br>
<a href="https://github.com/purerosefallen/ygopro/blob/a681a2004decfd3e87801c8d7e55d39634966333/gframe/game.cpp#L1113" class="onebox" target="_blank" rel="noopener nofollow ugc">https://github.com/purerosefallen/ygopro/blob/a681a2004decfd3e87801c8d7e55d39634966333/gframe/game.cpp#L1113</a><br>
<aside class="onebox githubblob">
<header class="source">
<a href="https://github.com/purerosefallen/ygopro/blob/a681a2004decfd3e87801c8d7e55d39634966333/gframe/deck_manager.cpp#L114" target="_blank" rel="noopener nofollow ugc">github.com</a>
</header>
<article class="onebox-body">
<h4><a href="https://github.com/purerosefallen/ygopro/blob/a681a2004decfd3e87801c8d7e55d39634966333/gframe/deck_manager.cpp#L114" target="_blank" rel="noopener nofollow ugc">purerosefallen/ygopro/blob/a681a2004decfd3e87801c8d7e55d39634966333/gframe/deck_manager.cpp#L114</a></h4>
<pre class="onebox"><code class="lang-cpp"><ol class="start lines" start="104" style="counter-reset: li-counter 103 ;">
<li> char* countPos = pos;</li><li> int count = std::strtol(pos, &pos, 10);</li><li> if(errno || countPos == pos)</li><li> continue;</li><li> if(count < 0 || count > 2)</li><li> continue;</li><li> cur->content[code] = count;</li><li> cur->hash = cur->hash ^ ((code << 18) | (code >> 14)) ^ ((code << (27 + count)) | (code >> (5 - count)));</li><li> }</li><li> }</li><li class="selected"> if(insert)</li><li> _lfList.insert(_lfList.begin(), loadedLists.begin(), loadedLists.end());</li><li> else</li><li> _lfList.insert(_lfList.end(), loadedLists.begin(), loadedLists.end());</li><li>}</li><li>void DeckManager::LoadLFListSingle(const char* path, bool insert) {</li><li> FILE* fp = myfopen(path, "r");</li><li> if (!fp) return;</li><li> LoadLFListFromLineProvider([&](char* buf, size_t sz) {</li><li> return std::fgets(buf, sz, fp) != nullptr;</li><li> }, insert);</li>
</ol></code></pre>
</article>
<div class="onebox-metadata">
</div>
<div style="clear: both"></div>
</aside>
</p>
<p><a href="https://ygobbs2.com/t/mac%E7%89%88%E5%8D%A1%E7%BB%84%E7%BC%96%E8%BE%91%E5%99%A8%E9%97%AE%E9%A2%98/583496/4">阅读整个主题</a></p>
]]></description>
<link>https://ygobbs2.com/t/mac%E7%89%88%E5%8D%A1%E7%BB%84%E7%BC%96%E8%BE%91%E5%99%A8%E9%97%AE%E9%A2%98/583496/4</link>
<pubDate>Sun, 06 Sep 2026 17:20:05 +0000</pubDate>
<guid isPermaLink="false">ygobbs2.com-post-583496-4</guid>
<source url="https://ygobbs2.com/t/mac%E7%89%88%E5%8D%A1%E7%BB%84%E7%BC%96%E8%BE%91%E5%99%A8%E9%97%AE%E9%A2%98/583496.rss">Mac版卡组编辑器问题</source>
</item>
<item>
<title>Mac版卡组编辑器问题</title>
<dc:creator><![CDATA[Elder]]></dc:creator>
<description><![CDATA[
<p>还有一个Mac版Koshipro的问题</p>
<p>已定位:<strong>MyCard 的“编辑”入口触发了当前 KoishiPro 内核的启动顺序缺陷。</strong></p>
<p>你的 YGOPro 项目实际运行的是 <strong>KoishiPro Mesmerizer</strong>。点击“编辑”后:</p>
<ol>
<li>程序先进入编辑器,保存禁限表的内存引用。</li>
<li>随后加载扩展禁限表,导致原引用失效。</li>
<li>绘制卡片禁限标志时访问失效内存,于是闪退。这个顺序可在<a href="https://github.com/purerosefallen/ygopro/blob/master/gframe/gframe.cpp" rel="noopener nofollow ugc">启动源码</a>和<a href="https://github.com/purerosefallen/ygopro/blob/master/gframe/deck_manager.cpp" rel="noopener nofollow ugc">禁限表加载源码</a>中对应到。</li>
</ol>
<p>本机 <strong>22:08 的崩溃记录</strong>恰好发生在这处查询,报错为 <code>EXC_BAD_ACCESS / SIGSEGV</code>。实际退出的是游戏进程,MyCard 本身仍在运行。</p>
<p><strong>临时绕过方法:先单独打开 KoishiPro,再从游戏主菜单进入卡组编辑。</strong> 我已确认当前独立启动的编辑器能正常显示卡组和禁限图标;程序尚未修改。</p>
<p><a href="https://ygobbs2.com/t/mac%E7%89%88%E5%8D%A1%E7%BB%84%E7%BC%96%E8%BE%91%E5%99%A8%E9%97%AE%E9%A2%98/583496/3">阅读整个主题</a></p>
]]></description>
<link>https://ygobbs2.com/t/mac%E7%89%88%E5%8D%A1%E7%BB%84%E7%BC%96%E8%BE%91%E5%99%A8%E9%97%AE%E9%A2%98/583496/3</link>
<pubDate>Sun, 06 Sep 2026 17:04:29 +0000</pubDate>
<guid isPermaLink="false">ygobbs2.com-post-583496-3</guid>
<source url="https://ygobbs2.com/t/mac%E7%89%88%E5%8D%A1%E7%BB%84%E7%BC%96%E8%BE%91%E5%99%A8%E9%97%AE%E9%A2%98/583496.rss">Mac版卡组编辑器问题</source>
</item>
<item>
<title>Mac版卡组编辑器问题</title>
<dc:creator><![CDATA[Elder]]></dc:creator>
<description><![CDATA[
<p>我个人用ChatGPT跑的补丁,环境为- KoishiPro 1.036.2 Mesmerizer,Apple Silicon / ARM64 原生运行,目前来说已经解决了问题</p>
<p>— a/gframe/deck_con.cpp<br>
+++ b/gframe/deck_con.cpp<br>
@@ -1304,7 +1304,7 @@<br>
if(event.MouseInput.Wheel < 0) {<br>
if(mainGame->scrFilter->getPos() < mainGame->scrFilter->getMax())<br>
mainGame->scrFilter->setPos(mainGame->scrFilter->getPos() + 1);</p>
<ul>
<li>
<pre><code> } else {
</code></pre>
</li>
</ul>
<ul>
<li>
<pre><code> } else if(event.MouseInput.Wheel != 0.0f) {
if(mainGame->scrFilter->getPos() > 0)
mainGame->scrFilter->setPos(mainGame->scrFilter->getPos() - 1);
}</code></pre>
</li>
</ul>
<p><a href="https://ygobbs2.com/t/mac%E7%89%88%E5%8D%A1%E7%BB%84%E7%BC%96%E8%BE%91%E5%99%A8%E9%97%AE%E9%A2%98/583496/2">阅读整个主题</a></p>
]]></description>
<link>https://ygobbs2.com/t/mac%E7%89%88%E5%8D%A1%E7%BB%84%E7%BC%96%E8%BE%91%E5%99%A8%E9%97%AE%E9%A2%98/583496/2</link>
<pubDate>Sun, 06 Sep 2026 16:57:55 +0000</pubDate>
<guid isPermaLink="false">ygobbs2.com-post-583496-2</guid>
<source url="https://ygobbs2.com/t/mac%E7%89%88%E5%8D%A1%E7%BB%84%E7%BC%96%E8%BE%91%E5%99%A8%E9%97%AE%E9%A2%98/583496.rss">Mac版卡组编辑器问题</source>
</item>
<item>
<title>Mac版卡组编辑器问题</title>
<dc:creator><![CDATA[Elder]]></dc:creator>
<description><![CDATA[
<p><strong>使用的萌卡平台:</strong> <Mac版></p>
<p><strong>使用的YGOPro:</strong> </p>
<p><strong>使用的服务器:</strong> N/A</p>
<p><strong>第几回合:</strong> N/A</p>
<p><strong>进行的操作:</strong> 卡组编辑器右侧的卡片列表使用鼠标滚轮或触控板向下滚动后,会出现列表又反向向上滚动的情况。</p>
<p>已确认的代码缺陷<br>
macOS 的 Irrlicht 后端把 NSEvent.deltaY 转为 Wheel 并发送滚轮事件,没有过滤纵向位移为零的事件。<br>
卡片列表原逻辑为“Wheel < 0 时向下,否则向上”,因此 Wheel 为 +0.0 或 -0.0 时也会错误向上移动一行。<br>
这条零值事件到错误向上滚动的代码路径已经确认;未捕获用户出现问题时的原始硬件事件,所以不能认定其每次反向滚动都一定由零值事件触发。</p>
<p>修复内容<br>
忽略卡片列表的零值滚轮输入,保留正常向上、向下滚动及列表边界行为。没有修改系统的自然滚动或惯性设置。</p>
<p>源码对照(仅示意卡片列表的方向分支)<br>
原逻辑:<br>
if (Wheel < 0) { 向下移动一行; }<br>
else { 向上移动一行; }<br>
修复后等价逻辑:<br>
if (Wheel < 0) { 向下移动一行; }<br>
else if (Wheel != 0) { 向上移动一行; }</p>
<p>本地二进制补丁仅替换 ARM64 切片的一条四字节指令:<br>
地址:0x1000340f4<br>
原指令:cmp w20, <span class="hashtag">#1</span><br>
新指令:ccmp w20, <span class="hashtag">#1</span>, <span class="hashtag">#8</span>, ne<br>
原字节:9f 06 00 71<br>
新字节:88 1a 41 7a<br>
该替换利用前面的浮点比较结果,使正零、负零跳过列表移动;非零输入保留原有处理。</p>
<p>源码参考<br>
卡片列表处理:gframe/deck_con.cpp,EMIE_MOUSE_WHEEL 分支。<br>
<aside class="onebox githubblob">
<header class="source">
<a href="https://github.com/purerosefallen/ygopro/blob/a681a2004decfd3e87801c8d7e55d39634966333/gframe/deck_con.cpp" target="_blank" rel="noopener nofollow ugc">github.com</a>
</header>
<article class="onebox-body">
<h4><a href="https://github.com/purerosefallen/ygopro/blob/a681a2004decfd3e87801c8d7e55d39634966333/gframe/deck_con.cpp" target="_blank" rel="noopener nofollow ugc">purerosefallen/ygopro/blob/a681a2004decfd3e87801c8d7e55d39634966333/gframe/deck_con.cpp</a></h4>
<pre><code class="lang-cpp">#include <algorithm>
#include <array>
#include "config.h"
#include "deck_con.h"
#include "data_manager.h"
#include "deck_manager.h"
#include "file_system.h"
#include "image_manager.h"
#include "sound_manager.h"
#include "game.h"
#include "duelclient.h"
namespace ygo {
static int parse_filter(const wchar_t* pstr, unsigned int* type) {
if(*pstr == L'=') {
*type = 1;
return BufferIO::GetVal(pstr + 1);
} else if(*pstr >= L'0' && *pstr <= L'9') {
*type = 1;
</code></pre>
This file has been truncated. <a href="https://github.com/purerosefallen/ygopro/blob/a681a2004decfd3e87801c8d7e55d39634966333/gframe/deck_con.cpp" target="_blank" rel="noopener nofollow ugc">show original</a>
</article>
<div class="onebox-metadata">
</div>
<div style="clear: both"></div>
</aside>
<br>
macOS 滚轮事件:source/Irrlicht/CIrrDeviceOSX.mm,NSScrollWheel 分支。<br>
<aside class="onebox githubblob">
<header class="source">
<a href="https://github.com/mercury233/irrlicht/blob/main/source/Irrlicht/CIrrDeviceOSX.mm" target="_blank" rel="noopener nofollow ugc">github.com</a>
</header>
<article class="onebox-body">
<h4><a href="https://github.com/mercury233/irrlicht/blob/main/source/Irrlicht/CIrrDeviceOSX.mm" target="_blank" rel="noopener nofollow ugc">mercury233/irrlicht/blob/main/source/Irrlicht/CIrrDeviceOSX.mm</a></h4>
<pre><code class="lang-mm">// Copyright (C) 2005-2006 Etienne Petitjean
// Copyright (C) 2007-2012 Christian Stehno
// Copyright (C) 2013-2015 Patryk Nadrowski
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in Irrlicht.h
#include "IrrCompileConfig.h"
#ifdef _IRR_COMPILE_WITH_OSX_DEVICE_
#import <Cocoa/Cocoa.h>
#import <OpenGL/gl.h>
#import <Carbon/Carbon.h>
#include "CIrrDeviceOSX.h"
#include "IEventReceiver.h"
#include "irrList.h"
#include "os.h"
#include "CTimer.h"
</code></pre>
This file has been truncated. <a href="https://github.com/mercury233/irrlicht/blob/main/source/Irrlicht/CIrrDeviceOSX.mm" target="_blank" rel="noopener nofollow ugc">show original</a>
</article>
<div class="onebox-metadata">
</div>
<div style="clear: both"></div>
</aside>
</p>
<p>验证结果</p>
<ol>
<li>源逻辑离线回归:9 组场景、5,610 个输入/位置/边界组合全部通过,覆盖连续下滚或上滚后接零值、正负零、小数和边界。</li>
<li>原生 ARM64 指令回归:11,220 个组合全部通过,覆盖正负零、正负小数、次正规数、边界、无穷值和 NaN;确认零值不再移动,非零行为保持一致。</li>
<li>界面滚动验证:连续向下 6 次、向上 6 次,列表按预期方向滚动。<br>
离线测试验证逻辑和 CPU 指令;界面测试验证应用中的滚动表现。它们均不等同于捕获用户原始硬件事件。</li>
</ol>
<p><a href="https://ygobbs2.com/t/mac%E7%89%88%E5%8D%A1%E7%BB%84%E7%BC%96%E8%BE%91%E5%99%A8%E9%97%AE%E9%A2%98/583496/1">阅读整个主题</a></p>
]]></description>
<link>https://ygobbs2.com/t/mac%E7%89%88%E5%8D%A1%E7%BB%84%E7%BC%96%E8%BE%91%E5%99%A8%E9%97%AE%E9%A2%98/583496/1</link>
<pubDate>Sun, 06 Sep 2026 16:56:00 +0000</pubDate>
<guid isPermaLink="false">ygobbs2.com-post-583496-1</guid>
<source url="https://ygobbs2.com/t/mac%E7%89%88%E5%8D%A1%E7%BB%84%E7%BC%96%E8%BE%91%E5%99%A8%E9%97%AE%E9%A2%98/583496.rss">Mac版卡组编辑器问题</source>
</item>
</channel>
</rss>