canvas生成海报

171 阅读1分钟

通过canvas生成海报,方便用户分享

性能优化:

离屏渲染技术

原理:将静态或重复绘制的内容预先渲染到不可见的画布上,后续直接复用已渲染结果,避免重复计算和绘制。

// 创建隐藏Canvas预渲染 
const offscreenCanvas = uni.createOffscreenCanvas({ type: '2d' }); 
// 预渲染二维码等静态内容 
renderStaticParts(offscreenCanvas);
异步分步渲染
sequenceDiagram 
    participant UI 
    participant Renderer 
    UI->>Renderer: 启动渲染 
    Renderer->>Renderer: 阶段1: 绘制背景(同步) 
    Renderer-->>UI: 更新进度(30%) 
    Renderer->>Renderer: 阶段2: 加载图片(异步Promise) 
    Renderer-->>UI: 更新进度(50%) Renderer->>Renderer: 阶段3: 生成二维码(Web Worker) 
    Renderer-->>UI: 更新进度(80%) Renderer->>Renderer: 阶段4: 合成最终图像
    Renderer-->>UI: 完成(100%)
async function renderStepByStep() {
  // 阶段1:同步绘制背景
  const ctx = uni.createCanvasContext('poster');
  drawBackground(ctx);
  await ctx.draw(true);
  updateProgress(30);

  // 阶段2:异步加载动态图片
  const images = await Promise.all([
    loadImage('flower.png'),
    loadImage('qrcode.png')
  ]);
  updateProgress(50);

  // 阶段3:Worker线程生成复杂内容
  const qrCodeData = await worker.generateQRCode('https://example.com');
  ctx.drawImage(qrCodeData, 100, 100);
  updateProgress(80);

  // 阶段4:最终合成
  await ctx.draw(true);
  updateProgress(100);
}

// Web Worker任务分配
worker.onMessage(async (res) => {
  if (res.type === 'qrcode') {
    const data = await generateQRCode(res.text);
    worker.postMessage({ type: 'qrcode', data });
  }
});
//Worker线程 :在后台执行耗时操作(如计算、I/O、网络请求),完成后将结果返回主线程
组合使用效果
// 综合优化执行流程
async function generateOptimizedPoster() {
  // 1. 检查缓存
  const cacheResult = checkCache();
  if (cacheResult) return cacheResult;

  // 2. 启动离屏预渲染
  const offscreenContent = await prerenderStaticParts();
  
  // 3. 异步分步渲染
  const finalImage = await renderStepByStep(offscreenContent);

  // 4. 写入缓存
  saveToCache(finalImage);
  
  return finalImage;
}
特殊场景处理

低端设备适配:

  • 自动降级渲染分辨率
  • 关闭阴影等非必要特效

网络环境优化:


// 根据网络状态调整策略
uni.getNetworkType({
  success: (res) => {
    if (res.networkType === '2g') {
      enableLowQualityMode();
    }
  }
});

内存预警处理

uni.onMemoryWarning(() => {
  clearCache();
  reduceRenderQuality();
});