渲染引擎

SpriteJS Next 支持多引擎,在较新的浏览器中,默认优先采用 webgl2 引擎渲染,如果不支持 webgl2 会降级为 webgl,如果不支持 webgl,会再降级为 canvas2d。

我们也可以通过Scene或者Layer的参数指定渲染引擎。

在与某些第三方库联合使用的时候,我们可能需要根据第三方库的支持情况选择合适的引擎。

  1. const {Scene, Rect} = spritejs;
  2. const container = document.getElementById('adaptive');
  3. const scene = new Scene({
  4. container,
  5. width: 600,
  6. height: 600,
  7. contextType: '2d',
  8. });
  9. const layer = scene.layer({
  10. autoRender: false,
  11. });
  12. const rect = new Rect({
  13. normalize: true,
  14. pos: [300, 300],
  15. size: [100, 100],
  16. fillColor: 'red',
  17. opacity: 0.5,
  18. });
  19. layer.append(rect);
  20. /* globals curvejs */
  21. const {Stage, Curve} = curvejs;
  22. const canvas = layer.canvas;
  23. const stage = new Stage(canvas);
  24. const rd = () => -2 + Math.random() * 2;
  25. const curve = new Curve({
  26. color: '#00FF00',
  27. points: [277, 327, 230, 314, 236, 326, 257, 326],
  28. data: [rd(), rd(), rd(), rd(), rd(), rd(), rd(), rd()],
  29. motion: function motion(points, data) {
  30. points.forEach((item, index) => {
  31. points[index] += data[index];
  32. if(points[index] < 0) {
  33. points[index] = 0;
  34. data[index] *= -1;
  35. }
  36. if(index % 2 === 0) {
  37. if(points[index] > canvas.width) {
  38. points[index] = canvas.width;
  39. data[index] *= -1;
  40. }
  41. } else if(points[index] > canvas.height) {
  42. points[index] = canvas.height;
  43. data[index] *= -1;
  44. }
  45. });
  46. },
  47. });
  48. stage.add(curve);
  49. let ang = 0;
  50. function tick() {
  51. stage.update();
  52. rect.attributes.rotate = ang++;
  53. layer.render({clear: false});
  54. requestAnimationFrame(tick);
  55. }
  56. tick();

值得注意的是,不一定 webgl2/webgl 引擎就优于 canvas2d,在内存限制的情况下,某些特定场景使用 canvas2d 渲染因为节省内存,可能反而效率要更高。

canvas2d下,有些功能不能完全支持,比如 textureRepeat 属性,在 canvas2d 下不能支持。

内存

SpriteJS Next 在 webgl2/webgl 渲染引擎下,会自动合并能够合并的元素在同一批次下进行渲染,这会提升渲染效率,但是会耗费更多的内存。在内存限制的情况下,可以通过设置Scene或者Layer的bufferSize参数来减少合并的顶点个数,以减少内存消耗。

  1. const scene = new Scene({
  2. container,
  3. width: 1000,
  4. height: 1000,
  5. bufferSize: 500,
  6. })

默认的bufferSize值为1500。