使用webgl开发微信小游戏绘制开放域解决方案
写在前面的话
在开发微信小游戏时,如果使用 [代码]webgl[代码] 的绘图方式,在绘制开放域画布 [代码]sharedCanvas[代码] 时,由于开放域只能绘制到上屏 [代码]canvas[代码] 中且主域无法得知开放域状态的限制,通常的做法是将 [代码]sharedCanvas[代码] 转成 [代码]texImage2D[代码] 绘制到上屏 [代码]canvas[代码] 中然后不停的绘制,然而 [代码]texImage2D[代码] 转换是通过CPU提交数据交由GPU进行计算,不停的提交会导致CPU过高,对于经验不足的人来说,性能会很差。
思路
我的做法是反其道而行,上屏 [代码]canvas[代码] 还是使用 [代码]2d[代码] 的方式进行绘制,游戏场景则使用离屏 [代码]canvas[代码] 绘制,这个离屏 [代码]canvas[代码] 使用 [代码]webgl[代码] 的方式,然后将这个离屏 [代码]canvas[代码] 绘制到上屏 [代码]canvas[代码] 中,[代码]canvas 2d[代码] 的 [代码]drawImage[代码] 方法可以直接将一个 [代码]canvas[代码] 当成图片进行绘制,[代码]sharedCanvas[代码] 也可以通过 [代码]drawImage[代码] 方法绘制到上屏 [代码]canvas[代码] 中去了。
这样可以免去很多复杂的转换,轻松的将开放域画布 [代码]sharedCanvas[代码] 绘制到上屏 [代码]canvas[代码] 中去了,还可以绘制游戏中用到的其他的 [代码]2d[代码] 元素。
小提示:目前这种做法在 [代码]Android[代码] 中存在BUG,无法正确的绘制,微信小游戏团队正在修复这个问题,目前已经内测通过,下一个 [代码]Android[代码] 版微信将会修复。
2019年2月20日更新
在 [代码]Android[代码] 版微信7.0.3客户端中已经修复了无法正确绘制的BUG,可以尽情玩耍了。