小程序技术分享| 小程序集成 pixi 渲染引擎

news2024/12/27 10:43:07

开发小程序时一些特殊场景需要使用canvas,但canvas渲染一些特效时太过耗费性能造成页面卡顿并且展示效果也不好(拖动卡顿不连贯等),因此使用渲染引擎来满足需求。本文在小程序中使用 pixi 渲染引擎。

引入改造后的 pixi

pixi与小程序不是很匹配,需要进行对应改造才可在小程序中使用。
本文中使用spine、animate等,可保存至同一文件夹下

下载地址 gitee 仓库

  • pixi-animate.js

  • pixi-spine.js

  • pixi.miniprogram.js

  • unsafeEval.js(必备,牵连到一些事件转换)

使用

页面中添加 canvas

   <canvas type="webgl" id="croplandCanvas" class="cropland_canvas" bindtouchstart="touchEvent" bindtouchmove="touchEvent" bindtouchend="touchEvent" bindtouchcancel="touchEvent"></canvas>
   <canvas type="2d" id="canvas2d" class="canvas_test"></canvas>
   <canvas type="2d" id="canvas2dText" class="canvas_test"></canvas>

特效实现

初始定义

/** pixi 相关 */
import {
    createPIXI
} from "../libs/pixi.miniprogram";
const unsafeEval = require("../libs/unsafeEval");
const installSpine = require("../libs/pixi-spine");
const installAnimate = require("../libs/pixi-animate");

// 动画定时器
let animationFrame= null;
// pixi 实例
let storePIXI = null;
// pixi 全局舞台容器
let pixiRenderer = null;
// canvas 容器实例
let canvasInstance = null;

pixi 初始化

// 获取 canvas
wx.createSelectorQuery().select('#croplandCanvas').fields({
            node: true,
            size: true
        })
            .exec((res) => {
                const canvas = res[0].node;
                canvasInstance = canvas;
                // 设置canvas实际宽高
                canvas.width = 400;
                canvas.height = 800;
                 // 方便pixi定位
                 wx.createSelectorQuery().select('#canvas2d').fields({
                    node: true,
                    size: true
                }).exec(function (res2d) {
                    const canvas2d = res2d[0].node;
                    canvas2d.width = 16;
                    canvas2d.height = 16;
                    // 方便pixi定位
                    wx.createSelectorQuery().select('#canvas2dText').fields({
                        node: true,
                        size: true
                    }).exec(async function (res2dText) {
                        const canvas2dText = res2dText[0].node;
                        canvas2dText.width = 16;
                        canvas2dText.height = 16;
                      
                       /** 传入canvas,传入canvas宽度,用于计算触摸坐标比例适配触摸位置 */
                       // PIXI 初始化 -----start
                       storePIXI = createPIXI(canvas, 400, canvas2d, canvas2dText)

                       unsafeEval(storePIXI); //适配PIXI里面使用的eval函数
                       installSpine(storePIXI); //注入Spine库
                       installAnimate(storePIXI); //注入Animate库

                       // 通过view把小程序的canvas传入
                       pixiRenderer = Store.PIXI.autoDetectRenderer({
                           width: 400,
                           height: 800,
                           'transparent': true,
                           'view': canvas
                       });
                       // PIXI 初始化 -----end
                       
       
                       // PIXI 舞台+精灵(特效实现) -----start
                       /** 创建总舞台 */ 
                       const allStage = new Store.PIXI.Container();
                       // 舞台层级开关
                       allStage.sortableChildren = true;
                       
                       /** 例子:添加一个精灵图可拖拽 */
                        const bgStage = new storePIXI.Sprite.from(线上图片地址)
                        bgStage.sortableChildren = true;
                        
                        // 添加到总舞台
                        allStage.addChild(bgStage);
                       /** 对应事件触发 */
                        baseMapPIXIEvent(bgStage);
                       // PIXI 舞台+精灵(特效实现) -----end
                      
                       
                      // 视图渲染
                      function animate() {
                          pixiRenderer.render(allStage);
                          animationFrame = canvas.requestAnimationFrame(animate);
                      }
                      animate();
                    })

pixi 事件绑定

// 小程序事件绑定至pixi
touchEvent(e) {
        storePIXI.dispatchEvent(e)
}

// pixi 事件处理
baseMapPIXIEvent(stage) {
  stage.on("touchstart", function (e) {
        const global = e.data.global;
        console.log("touchstart-开始移动", global);
  });
  stage.on("touchmove", function (e) {
        const global = e.data.global;
        console.log("touchstart-移动中", global);
  });
  stage.on("pointerup", function (e) {
        const global = e.data.global;
        console.log("touchstart-移动结束", global);
  });
  stage.on("pointertap", function (e) {
        const global = e.data.global;
        console.log("touchstart-点击", global);
  });
}

pixi 销毁

 allStage && allStage.destroy();
 animationFrame && canvasInstance.cancelAnimationFrame(animationFrame);
 pixiRenderer && pixiRenderer.destroy();

注意

图片大小最好不要超过300k

pixi 可参考对应官网文档实现需求特效

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/691310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

K8s(Kubernetes)学习(二):k8s集群搭建

k8s集群搭建 minikube 只是一个 K8S 集群模拟器&#xff0c;只有一个节点的集群&#xff0c;只为测试用&#xff0c;master 和 worker 都在一起。裸机安装 至少需要两台机器&#xff08;主节点、工作节点个一台&#xff09;&#xff0c;需要自己安装 Kubernetes 组件&#xff…

基于javaweb实现新闻公布系统,ssm+mysql实现新闻发布平台

使用说明 src/main文件中存放的是前端代码&#xff0c;target文件夹中存放的是后端代码&#xff0c;.idea文件夹是存储IntelliJ IDEA项目的配置信息&#xff0c;主要内容有IntelliJ IDEA项目本身的一些编译配置、文件编码信息、jar包的数据源和相关的插件配置信息&#xff0c;.…

CnOpenData中国各级政府税收分成数据

一、数据简介 “测算中国各级政府间财政收入划分&#xff0c;从数据上把握政府收入的分级分配的规律&#xff0c;是剖析中国地方政府行为及其经济影响的重要基础。本文结合中国政府间财政关系的特点&#xff0c;详细测算多层级政府、多口径财政收入的分配状况&#xff0c;构建了…

【unity之UI专题】GUI(IMGUI)详解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

人工智能产品经理应该怎么做

一、项目与产品的区别 二、项目与产品经理的区别 三、人工智能产品经理的能力模型 产品设计&#xff1a;这个是产品经理的必备技能&#xff0c;包括市场调研、竞品分析、需求分析、产品规划、产品设计、营销策划。需要注意的是&#xff0c;这个里边所讲的产品设计是面向业务层面…

Windows环境Java+VUE项目现场实施总结,JDK安装环境变量配置、Nginx安装、MySQL安装、Redis安装、bat启动脚本编写

前言 项目组成&#xff1a; Java后台接口对外开放接口jar包&#xff08;包含mysql和redis连接&#xff09;windows环境后台启动部署&#xff0c;redis后台启动&#xff1b;vue打包前端静态文件包&#xff1b;使用nginx代理接口静态文件&#xff0c;本地部署加一键启动脚本&…

【Nginx】第二章 Nginx安装

第2章 Nginx安装 2.1 进入nginx官网&#xff0c;下载 nginx news nginx-1.12.2.tar.gz 2.2 需要的安装包 pcre-8.37.tar.gz openssl-1.0.1t.tar.gz zlib-1.2.8.tar.gz nginx-1.12.2.tar.gz 2.3 在线安装nginx 第一步&#xff0c;安装pcre 第一步 联网下载pcre …

IOS自动化测试环境搭建(Python Java)

一、前言 IOS的App自动化测试与Android的一样&#xff0c;也可以用appium来进行。但是IOS自动化依赖苹果的osx系统、Xcode构建等&#xff0c;且封闭的系统需要苹果开发者账号才可以驱动真机。Appium的环境配置有点麻烦&#xff0c;可能大部分时间都在处理各种稀奇古怪的报错&am…

基础的git命令使用

Git区域概念 Git命令行操作 Git单人使用 注意项&#xff08;务必认真阅读&#xff09; Git Bash Here”终端 初始化仓库 提交工作区的内容到版本库 查看版本的记录 查看工作区的状态 版本回退 版本前进 Git远程仓库 克隆项目 推送到远程 拉取远程的更新 Git区域概…

go实现简单的内网穿透

一、内网穿透 1. 内网穿透介绍 内网穿透是一种通过互联网建立远程连接到私有网络&#xff08;内网&#xff09;中设备的技术。通常情况下&#xff0c;内网设备由于位于一个受限制的网络环境中&#xff0c;无法直接从外部访问。内网穿透通过将内网设备的流量转发到公共网络上的…

自动化测试框架[各自动化测试框架大比拼]

目录 Cypress与Selenium/WebDriver Language Bindings/Client Selenium/WebDriver执行慢 Cypress与Selenium/WebDriver比较 Cypress与Karma比较 Cypress与Nightwatch比较 Cypress与Protractor比较 Cypress与TestCafe比较 Cypress和Puppeteer比较 Cypress与Selenium/We…

浅谈智能电容器的结构与功能在电网中的应用 安科瑞 许敏

摘要&#xff1a;近年来&#xff0c;随着我国电力工业的不断发展&#xff0c;大范围的高压输电网络逐渐形成&#xff0c;同时对电网无功功率的要求也日渐严格。电网无功功率不平衡将导致系统电压的巨大波动&#xff0c;严重时会导致用电设备的损坏。因此&#xff0c;研究无功补…

C++与QML 信号与槽交互

一、全局属性 在main.cpp中通过 QQmlApplicationEngine engine 获得全局对象 QQmlApplicationEngine engine; //全局对象 上下文对象 QQmlContext* context engine.rootContext(); //获取屏幕的大小 Screen *screen QGuiApplication::primaryScreen(); …

jquery基础知识整理

写在前面的话&#xff1a;由于公司做的政府网站&#xff0c;需要考虑到兼容ie。所以我们使用jquery解决方案。在一些展示类的、不是一个多网页的整体应用中。我们仍然可以使用jQuery进行开发。 以下是我看慕课网整理的jQuery知识。慕课网课程链接jQuery课程。 以下是我整理的知…

文档识别开发“零门槛”!合合信息智能文字识别技术助力柳州银行“降本增效”

现阶段&#xff0c;越来越多的金融机构将业务转到线上&#xff0c;推出了“零接触”金融服务以提升业务流程效率。在此过程中&#xff0c;智能文字识别技术对提升复杂版式文档录入效率起到了重要作用。 近期&#xff0c;在元脑生态框架下&#xff0c;合合信息将智能文字识别技…

数学建模算法(基于matlab和python)之 三次样条插值与多项式拟合(2/10)

实验目的及要求&#xff1a; 1、会在Matlab平台上进行样条插值&#xff1b; 2、会在Matlab平台上进行最小二乘拟合。 实验内容&#xff1a; 1、利用spline函数绘制【0&#xff0c;10】内步长为1的插值节点处的的样条曲线。 2、根据下列数据三转角方程法构造三次样条函数…

Linux命令大全(面试必备)

前两节有说Git命令&#xff0c;反馈还不错&#xff0c;看来大家对这些必备的命令还挺感兴趣哈&#xff0c;这节就罗列一些Linux必须掌握的命令。 干货满满哦&#xff0c;直接发车... 一、常用的基本命令 1、关机开机 关机 shutdown-h now 立刻关机shutdown-h 3 3分钟后关机…

Java八股文面试(黑马)

Redis篇 数据库的并发不高&#xff0c;请求到了一定的量就会击垮数据库&#xff0c;导致宕机。 大概率是客户端正好在写入数据&#xff0c;sentinel与当前master出现分区 而 重新选举了一个master Mysql篇

IOS 手机抓包 频繁 访问 gateway.icloud.com.cn:443

在抓包的时候&#xff0c;有时候苹果手机在重启后频繁出现gateway.icloud.com.cn:443请求 这种情况需要在手机上进行设置&#xff0c;适用于IOS16.0以上版本&#xff0c;其他版本不清楚&#xff0c;没有尝试过 进入 设置--点击AppleID &#xff0c;进入个人信息页面---点击iCl…

开发工具-网络测试工具 POSTMAN 的脚本使用

开发工具-网络测试工具 POSTMAN 的脚本使用 postman 脚本应用基础设置变量、获取变量示例环境变量的使用测试 发送请求示例常用的变量、方法responseBody 获取响应体内容pm.response 获取响应信息pm.expect() JSON检查cheerio.load() 类似于 jquery 操作 html 元素 POSTMAN 是网…