如何在PIXI.js中绘制相同原语的多个实例
How to draw multiple instances of the same primitive in PIXI.js?
我把用drawCircle(), drawRect(),…渲染的对象称为"primitive"
考虑:- 原语的位置改变(约束(1))
- 由原语*表示的对象经常被创建/销毁
在不同位置绘制相同原语的多个实例的最快方法是什么:
- 创建一个图形对象,将其一次性添加到容器中,每帧清除它,并在每帧的不同位置调用多个drawSomething() ?
- 为每个原语每帧创建一个图形对象,在其中调用单个drawSomething(),并在指定位置将其添加到容器中?
为了清晰起见,如果我用drawCircle()简单地渲染子弹,并且知道我接收到游戏的每一帧的完整状态(这是约束(1)),那么什么是最快的方式来渲染它们?
(1):我不不知道在瞬间t子弹1在位置p1和瞬间t+1子弹1在位置p2。但是我确实知道在瞬间t位置p1有一个子弹,在瞬间t+1位置p2有一个子弹。
我会选择选项3:另一个解决方案。
如果可能的话,通常最好使用位图精灵,因为它们更适合GPU。(更多信息在这里https://github.com/pixijs/pixi.js/issues/1390)
您可以轻松地将原始图形渲染为可重用的纹理。
// Render a circle to a texture
var texture = new PIXI.RenderTexture(renderer, 16, 16);
var graphics = new PIXI.Graphics();
graphics.beginFill(0x44FFFF);
graphics.drawCircle(8, 8, 8);
graphics.endFill();
texture.render(graphics);
然后从纹理
创建一个精灵var s = new PIXI.Sprite(texture);
下面是一个从单一纹理创建多个精灵的例子。
http://jsfiddle.net/gzh14bcn/请注意,这段代码甚至不需要更新函数来重新绘制每一帧。你只需要在最后渲染一次舞台。
所以如果你有多个子弹,你可以为每个子弹创建一个精灵,并在它移动时更新它的位置。一旦它离开屏幕,删除对它的引用,GC将清理它。
如果你想进一步优化,你应该考虑为你的项目符号使用对象池。https://en.wikipedia.org/wiki/Object_pool_pattern
相关文章:
- JavaScript 原语:相同的内存位置、新的内存位置或依赖于引擎
- 为什么我们在javascript中使用“var”而不是String或Number或Boolean(原语)
- JavaScript:Object vs True(或其他原语)相等比较(性能/优化)
- Cesiumjs中实体和原语的区别是什么
- Javascript中字符串对象到字符串原语的转换
- Javascript对象与原语
- Javascript - 原语如何真正工作
- 将字符串转换为原语
- 无效的JSON原语- Asp.Net MVC 4
- React.js中的非原语默认道具
- 对象与原语
- 使用node.js和gm绘制许多图形原语的方法是什么?
- 是否有必要取消抓取收集的原语值
- c# /数据表错误使用JsonWriter:无效的JSON原语:draw
- 如何在PIXI.js中绘制相同原语的多个实例
- 如何“设置对象属性”处理派生对象(这与设置原语有什么不同)
- Function.prototype.call()传递原语值
- 混淆原型链、原语和对象
- 我需要在ThreeJS盒子原语上隐藏边缘
- 继承方法到除原语以外的所有对象