解决: WARNING: Too many active WebGL contexts. Oldest context will be lost.

在spa应用中使用threejs时, 页面unmount不会自动清除已经创建的webgl实例, 需要手动清除.

import * as React from 'react';
import {
  Scene,
  PerspectiveCamera,
  WebGLRenderer,
  BoxGeometry,
  MeshBasicMaterial,
  Mesh
} from 'three';
import BaseComponent from '@components/Base';

export default class HelloWorld extends BaseComponent {

  container: HTMLDivElement = null;

  renderer: WebGLRenderer;

  componentDidMount() {
    setTimeout(() => {
      this.init();
    }, 100);
  }

  componentWillUnmount() {
    this.renderer.forceContextLoss();
    this.renderer = null;
  }

  init = () => {
    const { clientWidth, clientHeight } = this.container;
    const scene = new Scene();
    const camera = new PerspectiveCamera(75, clientWidth / clientHeight, 0.1, 1000);
    this.renderer = new WebGLRenderer({
      antialias: true
    });
    this.renderer.setSize(clientWidth, clientHeight);
    this.renderer.setClearColor(0xFFFFFF, 1);
    this.container.appendChild(this.renderer.domElement);
    const geometry = new BoxGeometry(1, 1, 5);
    const material = new MeshBasicMaterial({ color: 0xff5555 });
    const cube = new Mesh(geometry, material);
    camera.position.z = 5;
    scene.add(cube);
    const render = () => {
      if (!this.renderer) {
        return;
      }
      this.renderer.render(scene, camera);
      requestAnimationFrame(render);
    }
    render();
  }

  render() {
    return (
      <div className="container" ref={ref => this.container = ref} />
    )
  }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,148评论 1 32
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,261评论 4 61
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,811评论 1 45
  • 如果刚吃过糖,马上再去吃苹果,你会觉得苹果一点儿也不甜。但如果你刚吃完很苦的药,再去吃同一个苹果就会觉得很...
    西楼风雨阅读 281评论 0 0
  • 今天早上出小区大门时,看见旁边门市前搭了很多红色的大雨伞,好多人排队像是抢够什么东西。我走进一看,是永辉在小区门口...
    傲雪_352a阅读 237评论 1 0