通过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();
});