平移改为复用已绘制像素:新增宽缓冲区,平移动画降为 O(1) 贴图

按用户分析落地:平移时画面内容不变、只是横向平移,因此以当前视界为中心向左右各多渲染半个视界宽,存成 2×视界宽的离屏位图(用与正常绘制完全相同的 PaintLane/PaintTimeAxis,仅跳过随视界移动的图例/Y 轴刻度,改由装饰层缓存贴回)。平移时前台只做一次 BitBlt 截取子矩形(O(1)),移出边界才重建一次。

实测 VERY_BIG_DATA 全信号、视界 [40.1756,40.1885]s、5 网格:中键平移拖动 34ms→1.3ms(长距 1.7ms),透明度/粗细/颜色 16ms→8ms;静止/结算帧与修复前逐像素 0 差异(LockBits 验证)。
This commit is contained in:
DeepSeek V4.1 Flash committed 2026-10-11 22:36:42 +08:00
1 parent aefaaef6fa
commit fa0d62b016
3 files changed
+282 -1

No files matched your search

+45
View File
@@ -2171,6 +2171,51 @@ namespace jdi
/** 本帧需要捕获 / 贴回的装饰矩形(各网格的 Y 轴胶囊与图例带)。 */
mutable std::vector<gd::RectF> m_decorRects;
// ---- 平移「宽缓冲区」:平移只改变绘制坐标、不改变画面内容 ----
// 视界平移时整个波形并不改变,只是横向平移。因此以当前视界为中心,向左右各多渲染
// 半个视界宽(位图宽度 = 视界宽 ×2),保存为一张**更宽**的离屏位图;平移时前台只需
// 从中**截取对应的横向子矩形贴图**(O(1),一次 BitBlt),而不必每帧重算重画。
// 当视界移动到该缓冲区边缘(超出已渲染范围)时,才以新视界为中心重建一次。
/**
* @brief 确保宽缓冲区位图尺寸正确(不足则重建)。
* @param [IN] width 位图宽度。 @param [IN] height 位图高度。
* @return 可用返回 true。
*/
bool EnsureWideBuffer(int width, int height);
/** @brief 释放宽缓冲区位图。 */
void ReleaseWideBuffer();
/**
* @brief 以当前视界为中心重建宽缓冲区(离屏渲染一张更宽的图像)。
*
* 渲染时临时把绘制区域的横向映射"加宽",因此调用的是与正常绘制**完全相同**的
* `PaintLane`/`PaintTimeAxis`,保证像素与正常绘制一致;仅**跳过图例与 Y 轴刻度**
*(它们锚定在网格左缘、随视界移动,需由前景叠加层绘制)。
*
* @return 重建成功返回 true。
*/
bool RebuildWideBuffer();
/**
* @brief 若当前视界落在宽缓冲区内,则截取子矩形贴图到后备缓冲区。
* @param [IN,OUT] g 绘图上下文。
* @return 命中并贴图返回 true(调用方随后只画叠加层即可)。
*/
bool BlitWideBuffer(gd::Graphics& g) const;
/** @brief 宽缓冲区内容是否仍与当前视图/内容一致。 */
bool WideBufferMatches() const;
/** @brief 使宽缓冲区失效。 */
void InvalidateWideBuffer();
HDC m_wideDc = nullptr; /**< 宽缓冲区设备上下文。 */
HBITMAP m_wideBitmap = nullptr; /**< 宽缓冲区位图(比视界更宽)。 */
HGDIOBJ m_wideOldBitmap = nullptr; /**< 宽缓冲 DC 原选位图。 */
int m_wideW = 0; /**< 宽缓冲区位图宽度(像素)。 */
int m_wideH = 0; /**< 宽缓冲区位图高度(像素)。 */
double m_wideMin = 0.0; /**< 宽缓冲区最左侧对应的时间。 */
double m_wideSpan = 0.0; /**< 宽缓冲区制作时的视界跨度。 */
bool m_wideValid = false; /**< 宽缓冲区内容是否有效。 */
std::uint64_t m_wideKey = 0; /**< 宽缓冲区对应的内容指纹(外观/派生参数等)。 */
bool m_renderWide = false; /**< 正在渲染宽缓冲区(重入 `PaintLane` 时跳过装饰)。 */
/**
* @brief 实验性功能浮动面板的像素图层项。
*