Skip to content

内容水印:插入与渲染性能优化

本文汇总 Android 端“内容水印”的常见问题与优化建议,重点覆盖插入与渲染阶段的性能与稳定性。这里的“内容水印”指作为页面内容插入并参与渲染的水印(并非 PDF 规范中的 Watermark 注释类型)。

常见问题

在为产品添加自定义水印时,可能会遇到:

  • 插入/渲染延迟:反复解析(parse)页面或重复创建相同水印对象,导致性能下降;
  • 水印显示不完整:高频刷新时,SDK 为保证整体效率会进行一定的刷新节流;若上一轮刷新未完成,下一轮刷新可能无法及时生效。

优化建议

1) 使用 com.foxit.sdk.Task 执行水印插入

  • 将“插入水印”的逻辑放入 Task 中执行;
  • 等待 SDK 内部线程处理完成后,再执行上层业务逻辑,可降低“部分缺失”的概率。

2) 分段加载/分段插入水印

可按页段进行预加载与插入。例如每次按 10 页为一段:

  • 首次加载第 1–10 页时插入;
  • 切换到第 11 页时,预加载第 11–20 页并插入。

这样用户切换到下一段页面时,水印通常已完成插入,渲染更稳定,整体效率也更高。

参考实现要点(示例片段)

java
private static final int PAGING_SIZE = 10;
private final List<Integer> mLoadPageNums = new ArrayList<>();

private class InsertWatermarkTask extends Task {
    private final PDFViewCtrl mViewCtrl;
    private final int mPageNum;
    private final List<Integer> mInsertedPages = new ArrayList<>();

    private InsertWatermarkTask(PDFViewCtrl viewCtrl, int pageNum) {
        super(new CallBack() {
            @Override
            public void result(Task task) {
                InsertWatermarkTask t = (InsertWatermarkTask) task;
                for (int pageIndex : t.mInsertedPages) {
                    if (t.mViewCtrl.isPageVisible(pageIndex)) {
                        int w = t.mViewCtrl.getPageViewWidth(pageIndex);
                        int h = t.mViewCtrl.getPageViewHeight(pageIndex);
                        t.mViewCtrl.refresh(pageIndex, new Rect(0, 0, w, h));
                    }
                }
            }
        });
        this.mViewCtrl = viewCtrl;
        this.mPageNum = pageNum;
    }

    @Override
    protected void execute() {
        // 按页段遍历、解析页面、判断并插入水印,记录已插入的页索引到 mInsertedPages
    }
}

提示

  • 为避免重复创建水印对象,可在水印对象为空时初始化一次并复用。
  • 可结合页面可见事件(如 PDFViewCtrl.IPageEventListener.onPageVisible)进行分段触发。