一、体积膨胀的真因(用 -Wl,-Map 逐对象/逐节对比上一提交定位,只有两个) 1) <filesystem>(致命,约 +900KB):MatH5::Open 用 std::filesystem::file_size 取文件大小, MinGW 的 libstdc++ 因此链入 fs_path/fs_dir/fs_ops/c++locale/codecvt/collate_members/ cow-wstring-inst/cxx11-wlocale-inst/fstream-inst/cp-demangle 整套 locale/iostream 机器 (归档成员 415→538);还把 64KB 静态表从 .bss 挤成 .data(1.8KB→73.8KB)。 修法:改用 _wfopen_s + _fseeki64/_ftelli64 取大小。 2) -lz(约 46KB):只需要"解开 HDF5 分块"。修法:MatH5 内置紧凑 inflate (RFC1950/1951:固定/动态 Huffman、存储块、长度-距离回抄),Makefile 与探针脚本移除 -lz。 顺带把 UploadHaloLayer 里 64KB 的预乘 alpha 查表换成 (v*a+128)*257>>16(无除法、无表)。 二、压到 800KB 以下的两项无损措施 1) 图标资源无损重编码:ico 里 64/48/32/16 四帧原为未压缩 32bpp DIB(合计 32KB), 用自写工具(GDI+ 编码)改为 PNG 帧(ICO 的 PNG 条目 Vista+ 全支持,本文件本就有 256 PNG 帧): 43,334 → 17,404 字节。像素逐点校验:差异 ≤85 像素、最大分量差 ≤3(编码取整),肉眼不可辨; 并从**真实产物** LoadImageW 逐尺寸(16/32/48/64)验证可加载。 2) RELEASE_OPT 由 -Os 改为 -Oz(省约 6KB);实测动画帧 p50 7.73ms(-Os) vs 7.77ms(-Oz), 无可辨识差异。 放弃的手段:-ffunction-sections/-fdata-sections + --gc-sections(反而 +9KB)、LTO(工具链 ICE)、 -fno-asynchronous-unwind-tables(链接失败)、-fno-exceptions(会破坏 catch (bad_alloc))。 结果:Build/Release/Target.exe = 795,648 字节。 三、.mat 加载进度不更新(已加载大小 / 总大小 / 百分比都停在 0) 真因:LoadMatSourceGroups 只在结束时回调一次 ratio=1.0,且从不设置 hasBytes; 读 42MB 文件与解码 19 个样本流(解压+拷贝,占大头)期间进度恒为 0。 修法: - MatHdf5::Open 新增 OpenProgress(bytesRead,totalBytes),按 4MB 分块读取并回报; - MatLoader 用 ProgressReporter 把进度拆成 0.00–0.55 读文件(hasBytes=true)与 0.55–0.98 解码样本流(每解完一个流推进 done/total),末段 1.0; - 取消与出错分开:取消时清空 error,不弹错误框。 实测:回调 29 次、字节数变化 11 次、比例单调、终值 1.000、bytes=42,386,344/42,386,344 (= 文件大小);Application 侧断言 m_loadingBytesRead == m_loadingTotalBytes == 文件大小。 四、验证(全部离屏,不占用鼠标/键盘/屏幕) - matcheck 21/21(新增进度断言)、matui 15/15(新增图标 + 加载字节断言); - 回归 verify 49/49、panelanim 158/158、gridanim 93/93、hoverdrag 20/20、lanescroll 23/23、 datacheck 69/69、edgecheck 46/46、errcheck 19/19、halocheck 16/16、panflash 19/19、 panelstutter 8/8、stress 6/6; - make release / make debug 零警告。 文档:Documents/agent_mem.md 追加本轮小节(含 5 条新规则:MinGW 下 <filesystem> 是体积炸弹、 链一整条库前先算账、膨胀要看节表而非 .o 大小、图标可无损重编码并用产物校验、 长解析必须按阶段回报进度且 hasBytes 只在有字节时置真)。
75 lines
2.9 KiB
C++
75 lines
2.9 KiB
C++
#ifndef __DATA_LOADER_HPP__
|
||
#define __DATA_LOADER_HPP__
|
||
|
||
#include <string>
|
||
#include <vector>
|
||
|
||
#include "DataTable.hpp"
|
||
|
||
namespace jdi
|
||
{
|
||
|
||
/**
|
||
* @brief 一个文件加载后的**命名分组**(多数格式只有一个,名字取文件名)。
|
||
*/
|
||
struct LoadedSourceGroup
|
||
{
|
||
std::wstring name; /**< 分组名(空表示"用源文件名")。 */
|
||
LoadedSource source; /**< 该分组的数据。 */
|
||
};
|
||
|
||
/**
|
||
* @brief 判断路径是否为应用当前支持的测量文件(按扩展名判断,不访问文件内容)。
|
||
* @param [IN] filePath 文件路径。
|
||
* @return 支持返回 true。
|
||
*/
|
||
bool IsSupportedSignalFile(const std::wstring& filePath);
|
||
|
||
/**
|
||
* @brief 供「打开文件」对话框使用的过滤器文本(`GetOpenFileNameW` 的 `lpstrFilter` 格式)。
|
||
* @return 双 NUL 结尾的过滤器文本。
|
||
*/
|
||
const wchar_t* SignalFileDialogFilter();
|
||
|
||
/**
|
||
* @brief 按扩展名选择加载器并读入一个测量文件(**唯一的文件加载入口**)。
|
||
*
|
||
* 上层(数据模型与界面)只依赖本函数返回的 `LoadedSource`,因此新增格式时
|
||
* **只需新增一个加载器并在这里登记**,其余代码完全不用改。
|
||
*
|
||
* 当前支持的格式:
|
||
* * CSV 文本(`.csv` / `.txt`):支持多个 `time` 列(多时间轴)与各时间轴不等长;
|
||
* * ASAM MDF v4(`.mf4` / `.mdf`):每个通道组(CG)是一个时间轴;
|
||
* * MATLAB 7.3 `.mat`(HDF5):**可能产出多个分组**(嵌套数据集),因此多分组格式
|
||
* 必须走 `LoadSignalSourceGroups`,本函数只取其中的单分组语义。
|
||
*
|
||
* @param [IN] filePath 文件完整路径。
|
||
* @param [OUT] source 解析结果(若干时间轴块)。
|
||
* @param [OUT] error 失败原因描述(成功时清空)。
|
||
* @param [IN] progress 进度回调,可为空。
|
||
* @return 加载成功返回 true。
|
||
*/
|
||
bool LoadSignalSource(const std::wstring& filePath, LoadedSource& source, std::wstring& error,
|
||
const LoadProgress& progress = LoadProgress());
|
||
|
||
/**
|
||
* @brief 与 `LoadSignalSource` 相同,但允许一个文件产出**多个命名分组**。
|
||
*
|
||
* 绝大多数格式只有一个分组(`groups.size() == 1`,`name` 为空 ⇒ 用文件名)。
|
||
* `.mat`(MATLAB 7.3)里的嵌套数据集会产生多个分组:分组名由"从顶层数据集到信号"
|
||
* 的路径用 `-` 连接而成(用户 2026-10-18 要求)。
|
||
*
|
||
* @param [IN] filePath 文件完整路径。
|
||
* @param [OUT] groups 读出的分组(至少一个)。
|
||
* @param [OUT] error 失败原因描述(成功时清空)。
|
||
* @param [IN] progress 进度回调,可为空。
|
||
* @return 加载成功返回 true。
|
||
*/
|
||
bool LoadSignalSourceGroups(const std::wstring& filePath, std::vector<LoadedSourceGroup>& groups,
|
||
std::wstring& error,
|
||
const LoadProgress& progress = LoadProgress());
|
||
|
||
} // namespace jdi
|
||
|
||
#endif // __DATA_LOADER_HPP__
|