๋๋ pixi.js, three.js ๋ฑ์ ์ฌ๋ฌ ๊ฐ๋ณ ์คํ์ ๋ก๋ํ๋ React์ ํตํฉ๋ ์ฑ์ ๋ง๋ค๊ณ ์์ต๋๋ค. iframe์ ์ฌ์ฉํ์ฌ ์คํ์ ๋ก๋ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์ค๋ก ์ ๋ฆฌํด์ผ ํฉ๋๋ค.
์๋ก์ด ์คํ์ ๋ํ ํ์์ด ์์ ๋๋ง๋ค ๋ ๋๋ฌ๊ฐ ์กด์ฌํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๊ณ ์กด์ฌํ๋ ๊ฒฝ์ฐ ํ๊ดดํฉ๋๋ค.
๋๋ฏธ ์ฝ๋
if renderer
renderer.destroy(true);
renderer = null
renderer = new PIXI.autoDetectRenderer ......
๋ด webgl ๋ ๋๋ฌ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒญ์ํ๊ณ ์๋ ๊ฒ ๊ฐ์ง๋ง 16ํ์ด์ง๊ฐ ๋ก๋๋ ํ WARNING: Too many active WebGL contexts. Oldest context will be lost.
๊ฒฝ๊ณ ๊ฐ ํ์๋ฉ๋๋ค. ๊ฒฝ๊ณ ๋ง ํ์๋๋ฏ๋ก ๋ฐ์คํฌํ์์๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ง๋ง ipad์์๋ ์ถฉ๋ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ์ ๋ฉ์์ง๊ฐ ๋ํ๋ฉ๋๋ค: X A problem occurred with this web page, so it was reloaded.
.
๋๋ threejs์ ๊ทธ๋ค์ด ์ด์ ๋ํ ์๋ฃจ์ ์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์๋ณด๊ณ ์์๊ณ ๋ค์ ์ฝ๋๊ฐ ์์ต๋๋ค.
๋ด๊ฐ ์ด๋ฆฌ์์ ์ง์ ํ๊ณ ์๋ ๊ฑธ๊น?
@andrevenancio
๋๋ ์์์ผ์ด๋ ํ์์ผ ์ดํ๋ก ๋ง ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ Pixi์ ๋ํ ์ ๋ฌธ๊ฐ๊ฐ ์๋๋๋ค. ํ ๋ฒ์ ํ๋๋ง ์ก์ธ์คํด์ผ ํ๋ค๋ ์์ด๋์ด๋ก ๋ง์ ์คํ( ์ด์ ๊ฐ์ )์ผ๋ก ์ธํด ์ฌ๋ฌ ๋ ๋๋ฌ์ ์บ๋ฒ์ค๊ฐ ์๋ ๊ฒฝ์ฐ ๊ธ๋ก๋ฒ ๋ ๋๋ฌ ๋๋ ๋ค๋ฅธ ๋ ๋๋ฌ๋ฅผ ์ฌ์ฉํ๊ณ ์คํ์ ๋ฐฐ์ด๋ก ์ ์งํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํ์ํด์ผ ํ ๋ ๊ฐ ์คํ์ ์คํ
์ด์ง๋ฅผ ๋ ๋๋ฌ๋ก ์ ๋ฌํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
var renderer = PIXI.autoDetectRenderer({blah});
var experiments = [];
experiments.push(experiment1);
experiments.push(experiment2);
experiments.push(experiment3);
var currentExperiment = $('#experminetSelector').val();
renderer.render(experiments[currentExperiment]);
์ด๋ ๊ฒ ํ๋ฉด ๋ ๋๋ฌ๋ฅผ ํ ๋ฒ๋ง ๋ง๋ค๊ณ ๊ฐ ์คํ์ ๋จ๊ณ๋ฅผ ์ ๋ฌํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์ด๊ฒ์ ์ฌ๋ฌ ์คํ ํ์ด์ง๊ฐ ์๋ ํ ํ์ด์ง๋ง ๋ ๋๋งํ๊ณ ๋ชจ๋ ์คํ์ด ์๋ ๊ฒฝ์ฐ์๋ง ์๋ํฉ๋๋ค.
๋ฉด์ฑ ์กฐํญ: ์ ๋ pixi๋ฅผ ์ฒ์ ์ฌ์ฉํ๊ณ ์ด๊ฒ์ ์๋ํ์ง ์์์ผ๋ฏ๋ก ๋ง์ผ๋ฆฌ์ง๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค. ๋ํ ๊ฐ๋ฐ์๊ฐ ์กฐ์ฌํ๊ฑฐ๋ ์ง์นจ์ ์ ๊ณตํ ์ ์๋ ์ผ์ข ์ ๋ฒ๊ทธ๋ฅผ ๋ฐ๊ฒฌํ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค.
๋จ์ผ ๋ ๋๋ฌ์ ์ฌ๋ฌ ์ฅ๋ฉด์ ๊ฐ๋ ๊ฒ์ด ์ข์ต๋๋ค. 1๊ฐ์ ๋ ๋๋ฌ === 1๊ฐ์ ์บ๋ฒ์ค ์์.
์ฌ๋ฌ๋ถ์ ํผ๋๋ฐฑ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. @samuriseoul ๋น์ ์ด ์ ์ํ๋ ๊ฒ์ ์ ํ ์ด๋ฆฌ์์ ๊ฒ์ด pixi.js
์ฌ์ฉํ์ฌ ์คํ์ ์ํ ํ ์ ์์ผ๋ฏ๋ก ๋ค๋ฅธ ์๋ฃจ์
์ ๋ง๋ค์ด์ผํฉ๋๋ค threejs
๋๋ ์ผ๋ฐ webgl. ๋ํ ๊ทธ ์์ ๋ฐ์ ๊ตฌ์กฐ์ ์ด๋ฏธ ์ ์๋ ์ ํ ์ ํ ๋๋ฌธ์ ํ ์ง์ ์์ ์ด์ ์คํ๊ณผ ์ ์คํ์ด ๋์์ ๋ ๋๋ง๋๋ ๊ฒ์ ๋ณผ ์ ์์ผ๋ฏ๋ก ํ๋์ ๋ ๋๋ฌ ์์ด๋์ด๊ฐ ์ด๊ฒผ์ต๋๋ค. ์ผํ์ง....
๊ฒ๋ค๊ฐ.... ์ด๊ฒ์ ํด๊ฒฐ์ฑ ์์ฒด๊ฐ ์๋๋ผ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋๋ค... .destroy() ๋ฉ์๋๊ฐ ์ค์ ๋ก webgl ์ปจํ ์คํธ์ ๋ํ ์ฐธ์กฐ๋ฅผ ํ๊ดดํ์ง ์๋๋ค๋ฉด... ์์ ์ ๋ฌด์์ ๋๊น? :(
์ผ ์น๊ตฌ! ์ปจํ ์คํธ๊ฐ ํ๊ดด๋์ง ์๋ ๊ฒฝ์ฐ ํ๊ดด ๊ธฐ๋ฅ์ด ์ ํํ ํด์ผ ํ ์ผ์ ํ์ง ์๋๋ค๋ ๋ฐ ์ ์ ์ผ๋ก ๋์ํฉ๋๋ค. :)
๋๋ ๋ฐฉํฉํฉ๋๋ค, ๋น์ ์ autodetectRenderer
์์ต๋๊น? ๋ธ๋ผ์ฐ์ ๊ฐ webGL์ ์ฌ์ฉํ ์ ์๋์ง ๊ฐ์งํ๊ธฐ ์ํด ์์ฑํ ํ
์คํธ ์ปจํ
์คํธ๊ฐ ํ๊ดด๋์ง ์์ ์ ์์ต๋๋ค.
๋ช ๊ฐ์ง ์ถ๊ฐ ์ ๋ณด: webgl ์ปจํ ์คํธ๋ฅผ ํ๊ดดํ ์ ์์ผ๋ฉฐ ๊ฐ๋น์ง ์์ง๋ฉ๋๋ค(๋ญ๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ํ?)
๋๋ ์ฐ๋ฆฌ๊ฐ ๋ณด์ ํ๊ณ ์๋ ์ฐธ์กฐ๋ฅผ ์ ๊ฑฐํ๊ณ ์ ํ์ ์ผ๋ก ์บ๋ฒ์ค ์์(์ปจํ ์คํธ ์ ๋ฆฌ์ ํ์ํจ)๋ฅผ ์ ๊ฑฐํ๋ค๊ณ ์๊ฐํ์ง๋ง ์ ๋ฆฌ๋ฅผ ์ํํ๋ ๊ฒ์ ๋ธ๋ผ์ฐ์ ์ ๋ฌ๋ ค ์์ต๋๋ค. ์ปจํ ์คํธ๊ฐ ๋์ถ๋๊ฑฐ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ํ๋ ๊ฒ๋ณด๋ค ๋น ๋ฅด๊ฒ ์์ฑ๋ ์ ์์ต๋๋ค. ์์งํ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
๊ฐ๋ฐ ๋๊ตฌ๋ ์ด์ ๊ฐ์ ์ปจํ ์คํธ ์ฃผ๋ณ์ ๋์ถ์ ๋ํ๋ ๋๊น? ๊ทธ๊ฒ ๋์์ด ๋ ๊น์? ๋ญ๊ฐ ์ปจํ ์คํธ๋ฅผ ์ ์งํ๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ์ปจํ ์คํธ์ ๋ํ js ์ฐธ์กฐ ๋๋ ๊ธฐ๋ณธ ์บ๋ฒ์ค์ ๋ํ js ์ฐธ์กฐ?
์ด๊ฒ์ด ๋ด๊ฐ ์ด๋ค ์ผ์ด ์์ด๋ ์ฌ์ ํ iframe์ ์ฌ๋ํ๋ ์ด์ ์ ๋๋ค.
@GoodBoyDigital ์ ๋ ์ด๋ ๊ฒ autodetectRenderer
์ฌ์ฉํ๊ณ ์์ต๋๋ค.
<strong i="9">@renderer</strong> = new PIXI.autoDetectRenderer canvas.width, canvas.height, { view: canvas, antialias: false, backgroundColor: 0xffffff }
๋๋ ์ง๊ธ ์ด๊ฒ์ ์ฃผ์ฐจํ๊ณ ์์ต๋๋ค. ์๋ฃจ์ ์ ์ฐพ์์ ๋ ํด๊ฒฐ์ฑ ์ด ๋ฌด์์ธ์ง ์๋ ค์ค ๊ฒ์ ๋๋ค. ๋๋ ๊ทธ ์ปจํ ์คํธ๋ฅผ ๊ฐ์ ๋ก ์์ด ๋ฒ๋ฆฌ๋ฉด ๊ฐ๋น์ง ์์ง์ด ๊ฐ์ ๋ก ์ฒญ์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์คํ์ง ์์ต๋๋ค. :)
๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ด๊ฐ ๊ตฌ์ถํ๋ ๊ฒ์ Pixi๊ฐ ์๋นํ ์์ฃผ ํ๊ดด๋๊ณ ์ฌ๊ฑด๋์ด์ผ ํ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ ์ํฅ์ ๋ํด ์ฐ๋ คํ๊ณ ์์ต๋๋ค. ๊ฐ WebGL ์ธ์คํด์ค๋ ํ์ฌ ๋งค์ฐ ์์ง๋ง ๊ณ์ ๊ตฌ์ถํ๋ฉด์ ํจ์ฌ ๋ ์ปค์ง ๊ฒ์ ๋๋ค.
์ด๋ค ์ง์ ์ด ์์ต๋๊น?
๋ถ๋ช ํ ์ ๋ Phaser๋ฅผ ์ฌ์ฉํ๊ณ ์์ง๋ง Pixi์ renderer.destroy ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์์ง ์ด์ด ์์ต๋๋ค. ํ๋์ ๊ธ๋ก๋ฒ ๋ ๋๋ฌ๋ฅผ ์ฌ์ฉํ ์ ์๊ณ ๋ค๋ฅธ ์ฅ๋ฉด์ ๋ ๋๋งํ๊ฑฐ๋ iframe์ ํตํด ์ฝํ ์ธ ๋ฅผ ๋ก๋ํ๊ณ ๋งค๋ฌ๋ ค ์๋ ๋ชจ๋ ๊ฒ์ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
Hey peeps, ์, ์ด๊ฒ์ ์ฝ๊ฐ ๊น๋ค๋ก์ด ๋ฌธ์ ์ ๋๋ค. ๋ด๊ฐ ๋ณผ ์์๋ ํ ์ฐ๋ฆฌ๋ ์ปจํ ์คํธ๋ฅผ ํ๊ดดํ๊ธฐ ์ํด ํ ์ ์๋ ๋ชจ๋ ๊ฒ์ ํฉ๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ํ ์ค์ฒ/ํ๋ก๊ทธ๋จ arraybuffers ect๊ฐ ํ๊ดด๋ฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ๊ฒ์ ์ปจํ ์คํธ๊ฐ ํ๊ดด๋๋ฉด ํ๋งํ์ฌ ๋งค๋ฒ ์ ์ปจํ ์คํธ๋ฅผ ์์ฑํ๋ ๋์ ์ฌ์ฌ์ฉํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
์๋ ํ์ธ์ @GoodBoyDigital ์ ๊ฒฝ์ฐ์๋ ์ ๋๋ฉ์ด์ ์ธ/์์์ด ์์ด์ ํญ์ 2๊ฐ์ ์ปจํ ์คํธ๊ฐ ํ์ํ์ต๋๋ค... ๊ทธ๊ฑด React์ ํตํฉํ๊ณ ์ ์ฒด pixi๋ก ๋ง๋ค์ง ์๋ ๋ฌธ์ ์ ๋๋ค... ์ด์จ๋ , ์ด๊ฒ์ด ๋ฒ๊ทธ์ธ์ง ํ์คํ์ง ์์ต๋๋ค. ๋ง์ ๋ฐ๋ฅด๋ฉด .. ๋ธ๋ผ์ฐ์ ๊ฐ ์ปจํ ์คํธ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ๊ณผ ๋น์ทํ๋ค๊ณ ์๊ฐํฉ๋๋ค ... three.js์์ด ํดํน์ด ์๋ํ๋์ง์กฐ์ฐจ ๋ชจ๋ฆ ๋๋ค ... ur V4์์ ์๋ํ๊ณ pixi๋ก 16 ๊ฐ ์ด์์ ํญ์ ์ด์ด๋ณด์ญ์์ค. https://github.com/mrdoob/three.js/blob/master/src/renderers/WebGLRenderer.js#L289
๊ทธ๋ ์ง ์์ผ๋ฉด ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค. ์ด๋ฏธ ๋ด ์ฑ์ ์ํคํ ์ฒ๋ฅผ ๋ณ๊ฒฝํ์ต๋๋ค... iframe FTW :)
์ข์ ๋ฌผ๊ฑด ๋จ์! three.js ํธ๋ฆญ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ๋ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
ํ๋์ ๊ธ๋ก๋ฒ ๋ ๋๋ง์ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค. ์ฌ์ค ๊ทธ๊ฒ ์ ๊ถ๊ทน์ ์ธ ๋ชฉํ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ฝ๋๋ฅผ ๊ธฐ์กด ์ปจํ ์คํธ๋ก ์คํธ๋ฆฌ๋ฐํ๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค.
์ฆ, ์ฌ์ฉ์๊ฐ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์์ต๋๋ค. ๋ฏธ๋ฆฌ ์์ฑ๋ ๊ฒ์ด ์๋๋๋ค.
์ข์ ํด๊ฒฐ์ฑ ์ ์ฐพ์ ๊ฒ ๊ฐ์์. ์ด๋ฅผ ํตํด ์๋ก์ ๋ํด ์ ํ์๊ฐ ์๊ณ React๊ฐ DOM์ ์์ ํ ์ ์๋๋ก ํ๋ ์ง๋ ์ค๋ฒ๋ ์ด React ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
์ปจํ ์คํธ ์์ค์ ๊ฐ์ ํ๊ธฐ ์ํด ์ด ๊ธฐ์ ์ ์ฌ์ฉ
gl.getExtension('WEBGL_lose_context').loseContext();
์ ์ฒด ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
var document = require('global/document');
var PIXI = require('pixi.js');
// I want to keep this canvas / renderer around. For example, this might be a bottom layer PIXI / React map overlay.
var canvas1 = document.createElement('canvas');
document.body.appendChild(canvas1);
createRenderer(0xff0000, canvas1);
function createRenderer(color, canvas) {
canvas = canvas || document.createElement('canvas');
var renderer = new PIXI.WebGLRenderer(800, 600, {view: canvas});
var stage = new PIXI.Container();
var graphics = new PIXI.Graphics();
graphics.beginFill(color, 0.5);
graphics.drawCircle(0, 0, 200);
graphics.endFill();
stage.addChild(graphics);
renderer.render(stage);
return {renderer: renderer, stage: stage, graphics: graphics};
}
// Simulate frequent adding / removing of lots of PIXI / React map overlays on top.
for (var i = 0; i < 16; i++) {
var canvas = document.createElement('canvas');
document.body.appendChild(canvas);
var scene = createRenderer(0x00ff00, canvas);
// Uncomment to see that the original canvas isn't removed.
/* scene.renderer.currentRenderTarget.gl
.getExtension('WEBGL_lose_context').loseContext(); */
scene.renderer.destroy();
scene.stage.removeChild(scene.graphics);
document.body.removeChild(canvas);
}
PIXI๊ฐ ์์ฒด "destroy" ๋ฉ์๋์ ์ด๊ฒ์ ์ถ๊ฐํด์ผ ํ ๊น์?
์ฐ๋ฆฌ๊ฐ ์ปจํ ์คํธ๋ฅผ ์์ ํ๊ณ ์๋ค๋ฉด ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ ์๊ฐ์๋ ํ์ฌ ์ฐ๋ฆฌ๊ฐ ์์ ํ๊ณ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค(v3).
isWebGLSupported()(source/core/utils/index.js) ํจ์์์ ๋์ฒด
return !!(gl && gl.getContextAttributes().stencil);
~์ ํจ๊ป
var success = !!(gl && gl.getContextAttributes().stencil);
gl.getExtension('WEBGL_lose_context').loseContext();
gl = undefined;
return success;
๋๋ฅผ ์ํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. Google ํฌ๋กฌ์์ ๊ฐ์ฅ ๋๋๋ฌ์ก์ต๋๋ค. Firefox๋ ์ด๋ ์ชฝ์ด๋ ์๋ํ์ต๋๋ค. ์ ๋ WebGL ๋ฉ์ฒญํ ์ฌ๋์ด๊ธฐ ๋๋ฌธ์ ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ํ ์๊ฒฌ์ ์ฃผ์๋ฉด ์ ๋ง ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
์ข์ ํธ์ถ์ ํ์ธํ ๋ ๊ฐ์ ๋ก ์ปจํ ์คํธ๋ฅผ ์๋ ๊ฒ์ ๋๋ค. ์ด๋ ์ฐ๋ฆฌ๊ฐ ํด๋น ์ปจํ ์คํธ๋ฅผ ์์ ํ๊ณ ์๋ค๋ ๊ฒ์ (100%) ์๊ณ ์๊ธฐ ๋๋ฌธ์ ์ข์ ์์ด๋์ด์ ๋๋ค.
์ด ๋ณํฉ ๋์์ต๋๊น? ์ฐ๋ฆฌ๋ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์์ต๋๋ค.
ping @englercj ์ง๊ธ ๋ซ์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
gl.getExtension('WEBGL_lose_context').loseContext()
๋ ๊ฒฝ๊ณ ๋ฅผ ํ์ํ์ง ์์ ์ ์์ง๋ง ์ฌ์์ ๋ฐ๋ฅด๋ฉด WEBGL_lose_context.restoreContext()
๊ฐ ํธ์ถ๋ ๋๊น์ง ์ปจํ
์คํธ ์์ค์ ์๋ฎฌ๋ ์ดํธํ ๋ฟ์ด๋ฉฐ ์ฒ์์ ์ค์ ๋ก ์์ค๋์ง ์์ ๊ฒฝ์ฐ์๋ง ์ปจํ
์คํธ๋ฅผ ๋ณต์ํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ์ ์ฉํ ์ ์์ต๋๋ค. loss_context()๋ (์ฌ์์ ๋ฐ๋ผ) ์๋ฎฌ๋ ์ด์
์ผ ๋ฟ์ด์ง๋ง ์ด ์ค๋ ๋( Public WebGL: WEBGL_lose_context์์ ์ฐ๋ฆฌ๋ (๋ชจ์ง๋ผ ๊ฐ๋ฐ์ Jeff Gilbert๋ก๋ถํฐ))์์ Firefox loseContext()
๊ฐ " ์ด ์ปจํ
์คํธ์ ๊ทธ์์" .
๋ฌธ์ ๋ ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๊ฒ์ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ค๋ ๊ฒ์ ๋๋ค. Google ๊ฐ๋ฐ์(Ken Russell)๊ฐ ์ถ์ฒํ๋ ์๊ฒฌ์ด ์์ต๋๋ค. WebGLRenderingContext์์ ๋ช ์์ delete* API๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ ์ด์ ์ฌ์ฉํ์ง ์๋ GPU ๋ฆฌ์์ค๋ฅผ ํด์ ํ์ญ์์ค.
๋๋ ์ด๊ฒ ์ค ์ด๋ ๊ฒ๋ ์คํํ์ง ์์๋ค๋ ๊ฒ์ ์ธ์ ํด์ผํ์ง๋ง ์ด๋ค ์๋ฃจ์ ๋ ๋ธ๋ผ์ฐ์ ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค.
ํฅ๋ฏธ๋ก์ด FF ๊ตฌํ ๋ ธํธ. ์ค์ ๋ก ๊ฐ๋ณ ๋ฆฌ์์ค ์ญ์ ์ ๋ํ Ken์ ์กฐ์ธ์ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง FF๋ ๋ง์ ์ธ๊ธฐ ์๋ ๋ธ๋ผ์ฐ์ ์ค ํ๋์ด๋ฉฐ FF ๋์๋ ์๊ณ ์์ด ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ๋ํ ๋์์ด ์์ ๋ ๊ตฌํ ์ธ๋ถ ์ ๋ณด์ ๊ฐ์ง ์ฌ์ฉ์ ์์ด์ ํธ ๋ฌธ์์ด ๋๋ ๋ธ๋ผ์ฐ์ ์ค๋ํ ๋ฐ ์ถ๊ฐ ์ฝ๋ ๊ฒฝ๋ก์ ์์กดํ๊ณ ์ถ์ง ์๊ธฐ ๋๋ฌธ์ ๋ธ๋ผ์ฐ์ ๋ณ๋ก ํ ์คํธํ์ง ์์์ต๋๋ค.
์ค๋ iOS์์ ๋ด ์ฑ์ ํ ์คํธํ๊ณ ์์๋๋ฐ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์๋ ค์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น? ๋ด pixi ๋ณด๊ธฐ๋ ๋ด ์ฑ ํ๋ฉด์ ํ์ ๊ตฌ์ฑ ์์์ด๋ฏ๋ก ์ฌ์ฉ์๊ฐ ํด๋น ํ์ด์ง์์ ๋ฒ์ด๋ ๋ ํ๊ดด๋ฉ๋๋ค. ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋์ผํ ๋ ๋๋ฌ๋ฅผ ๋ทฐ์ ์บ๋ฒ์ค์ ์ด๋ป๊ฒ๋ ๋ถ๋ฆฌ/์ฌ์ฐ๊ฒฐํ๋ ๊ฒ์ด ํจ๊ณผ๊ฐ ์์๊น?
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ์ปจํ ์คํธ๋ฅผ ๋ง๋ค์ง ์๋ ๊ฒ์ ๋๋ค. ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์ฌ์ฌ์ฉํ์ญ์์ค. ํ์ด์ง๋ฅผ ํ์ํ๋ ๊ฒฝ์ฐ ์ด์ ํ์ด์ง์์ ์์ฑ๋ ๋ด์ฉ์ ์ค์ํ์ง ์์ต๋๋ค.
์, ์ปจํ ์คํธ๋ฅผ ์ฌ์ฌ์ฉํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น? ์ ๋ angularJS๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก ํ ํ๋ฆฟ ํ๋ ์์ํฌ ๋ด์์ ์์ ํ๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด DOM์์ ์บ๋ฒ์ค ์์๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ ์ฅํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ก ๋์์ฌ ๋ ํ์ด์ง์ ํด๋น ์์น์ ๋ค์ ์ฐ๊ฒฐํ ์ ์์ต๋๊น? PIXI ๋ด์ "์ด ๊ธฐ์กด ๋ ๋๋ฌ + ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์ ์บ๋ฒ์ค์ ์ฐ๊ฒฐ"ํ๋ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉด ์ข๊ฒ ์ง๋ง ๋ด๋ถ์ ์ผ๋ก๋ ์ด๋ป๊ฒ ๋๋์ง ์ดํด๊ฐ ๋์ง ์์ต๋๋ค.
๋ด๊ฐ ๊ฑฑ์ ํ๋ ์ด์ ๋ ํ๋์ ํฐ pixi ๋ณด๊ธฐ๋ฅผ ๋ด ์ฑ์ ๋ฐฐ๊ฒฝ์ผ๋ก ์ฌ์ฉํ๊ณ ์๊ณ ๋ด ์ค์ ํ์ด์ง์์ ์ฌ์ฉํ๋ ๋ ์์ ๊ฒ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฌ์ฉ์๊ฐ ์ค์ ํ์ด์ง๋ก ์ฌ๋ฌ ๋ฒ ์ด๋ํ๋ฉด ๊ธฐ๋ณธ ๋ฐฐ๊ฒฝ์ด ๋จผ์ ์์ฑ๋์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ๋ฐฐ๊ฒฝ์ด ์ข ๋ฃ๋ฉ๋๋ค.
์ด๊ฒ์ ๋จ์ผ ํ์ด์ง ์ฑ ๋ด์์ PIXI๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
PIXI.Application/PIXI.WebGLRenderer/PIXI.CanvasRenderer์ ์ธ์คํด์ค๋ฅผ ์ ์ฅํ๋ฉด ์บ๋ฒ์ค ์์์ ์ธ์คํด์ค๋ ์ ์ฅ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, PIXI.Application์์ HTMLCanvasElement์ธ view
์์ฑ์ ์ป์ ์ ์์ต๋๋ค. ์ด ์บ๋ฒ์ค ์์๋ฅผ ์ฝ์
ํ๊ณ AngularJS/React ์ฑ์์ ์ ๊ฑฐํ ์ ์์ต๋๋ค. PIXI์์ ์ต์
์ผ๋ก ์ ๋ฌํ์ฌ ์ฌ์ฉํ ์บ๋ฒ์ค ์์๋ฅผ ๋ ๋๋ฌ์ ์๋ฆด ์ ์์ง๋ง ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค. ๋์ PIXI๊ฐ ๋ด๋ถ์ ์ผ๋ก ์์ฒด ์บ๋ฒ์ค ์์๋ฅผ ์์ฑํ๋๋ก ํ์ฉํ๊ณ ์ผ๋ถ DOM ์ปจํ
์ด๋์ appendChild๋ฅผ ์ถ๊ฐํฉ๋๋ค.
<div id="pixi-container"></div>
// maintain the reference to this Application even as your SPA view gets destroyed
const app = new PIXI.Application();
// Insert in the DOM or whatever the equivalent is in Angular
document.querySelector("#pixi-container").appendChild(app.view);
๋ค, ๊ฐ์ฌํฉ๋๋ค. ์๋ํด ๋ณด๊ฒ ์ต๋๋ค. ์ค์ ๋ก๋ ์ ํ ๋๋น ๋ณด์ด์ง ์์ต๋๋ค.
์ข์, ๋ทฐ๋ฅผ ํ๊ดดํ๋ ๋์ ๋ทฐ๋ฅผ ๋ถ๋ฆฌํ๋ค๊ฐ ๋ค์ ์ถ๊ฐํ๋ฉด ๋ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค. ๋์์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ด ์ค๋ ๋๋ ๋ซํ ํ ์ต๊ทผ ํ๋์ด ์์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ ๊ฒผ์ต๋๋ค. ๊ด๋ จ ๋ฒ๊ทธ์ ๋ํ ์ ๋ฌธ์ ๋ฅผ ์ฌ์ญ์์ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ข์ ํด๊ฒฐ์ฑ ์ ์ฐพ์ ๊ฒ ๊ฐ์์. ์ด๋ฅผ ํตํด ์๋ก์ ๋ํด ์ ํ์๊ฐ ์๊ณ React๊ฐ DOM์ ์์ ํ ์ ์๋๋ก ํ๋ ์ง๋ ์ค๋ฒ๋ ์ด React ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
์ปจํ ์คํธ ์์ค์ ๊ฐ์ ํ๊ธฐ ์ํด ์ด ๊ธฐ์ ์ ์ฌ์ฉ
์ ์ฒด ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
PIXI๊ฐ ์์ฒด "destroy" ๋ฉ์๋์ ์ด๊ฒ์ ์ถ๊ฐํด์ผ ํ ๊น์?