我正在尝试使用 OpenGL ES 2.0 为 Android 应用程序创建一个非常简单的粒子系统。基本上它仅适用于背景中线性移动的云。在开始之前,我的第一个想法是使用点精灵,这就是我一直在尝试做的事情。对我来说,要实现这一点相当困难,但抛开这些问题不谈,点精灵真的是实现这一点的方法吗?
我在搜索中读到了很多关于它们的相互矛盾的内容来解决我的错误,如果这不是我应该寻求的解决方案,我不想投入大量时间来使其一切正常工作第一名。人们提出了使用它们的各种问题,例如裁剪,甚至与仅使用三角形相比性能下降。我希望有经验的用户能够深入了解点精灵适合的位置以及何时使用它们,包括在像我这样的情况下,它们在屏幕上最多不会超过几十个“粒子”。
情况
我使用以下技术使用JavaFX创建了粒子系统:
每个粒子都是一个ImageView,其中包含一个具有径向渐变的Image:
粒子处理循环是一个AnimationTimer,其中粒子列表是通过列表的stream()。parallel()方法处理的,它实际上使整个系统得到了提升。像这样:
loop = new AnimationTimer() {
@Override
public void handle(long now) {
addParticle();
// apply force: gravity
allParticles.stream().parallel().forEach(Particle::applyForceGravity);
// move particle
allParticles.stream().parallel().forEach(Particle::move);
// update position in fx scene
allParticles.forEach(Particle::display);
// remove all particles that aren't visible anymore
removeDeadParticles();
}
};
Run Code Online (Sandbox Code Playgroud)
粒子的颜色在其生命周期内通过ColorAdjust进行更改。我使用火色进行测试,其中包含1700个粒子:
我学到了什么:
题
在性能方面,是否有更好的方法在JavaFX中实现粒子系统(其他Node类型,Thread等)?
如果有人想玩弄,我可以发布一些代码。
非常感谢您的专业知识!
编辑:由于被问到,您可以从此要点中获得完整的代码,该代码将节点用作带有色彩调整的粒子。顺便说一句,即使您预先渲染图像并且不使用色彩调节,性能仍然很低。
但是,这个问题更多是理论上的问题,因此没有必要深入研究代码。
一切都在问题中,我已经和cocos2d一起工作了,说它是一个很棒的图书馆,但今天我只想在一个完整的UIKit项目中使用粒子系统.不幸的是,只要我知道,我必须用OpenGL实现一个.有什么建议 ?
我正在开发一个基于cocos2d的应用程序,它具有空间背景,我正在利用CCQuadParticleSystem来制作闪烁的星星.我用ParticleDesigner生成了这个粒子系统.当我加载粒子系统时,代表星星的白点开始出现在背景中,过了一会儿它们逐渐消失,这样,在粒子系统到达政体状态的几秒钟之后,就会出现一个满是星星的夜空.
我的问题是,我想知道是否有办法让粒子系统从未来的特定时间开始(例如t0 = 3秒),这样我就不必等待所有开始闪烁.
我希望我已经清楚地解释了这个问题
先感谢您
安德里亚
A用Python编写的程序速度有问题.该程序是"模拟磁场中的铁磁颗粒",更具体地说是磁惰性液体.该程序可以工作,但与用C++编写的相同程序相比非常缓慢,但我用Python编写了一个项目来研究.
总的来说,程序代码基于循环,有很多浮点计算.存在随机数量的粒子(产生随机位置),其在磁场的影响下彼此相互作用.
这是最初的立场:
http://i.stack.imgur.com/T15Bb.jpg
决赛:
http://i.stack.imgur.com/0nU5D.jpg
主循环(在SymMain.py中,具有k变量)迭代是时间步长,计算当时粒子在其中的坐标和作用在其上的力(吸引力和小排斥力).为了加快速度,我想使用并行处理来同时计算迭代次数,但这是不可能的,因为一次迭代中的计算取决于前一次迭代中的计算.
我不知道Python比C++慢得多.例如,计算一次性步骤中529个粒子的模拟(在我的计算机上):
C++〜0.5s
Python~50s
那么,如何加快程序?请帮忙.
此代码仅计算,而不是像图片中那样绘制粒子.模拟partcile的数量在SymConst.py上,这是nrH*nrL.
SymMain.py
#coding:windows-1250
from os import system
from SymCalc import *
from SymParticle import *
if __name__ == '__main__':
App = SymCalc()
App.MainLoop()
Run Code Online (Sandbox Code Playgroud)
SymParticle.py
#coding:windows-1250
from random import randint
from math import *
from SymConst import *
from SymParticle import *
class SymCalc(object):
def __init__(self):
# declaration lists containing the properties of the particles
ParticleList = []
ParticleListTemp = []
t = 0.0
# the initial values ??of particle …Run Code Online (Sandbox Code Playgroud) 我试图沿着类似于这个铬表现的路径动画粒子:http://armsglobe.chromeexperiments.com/
我已经尝试深入研究这个项目的来源,到目前为止我已经讨论过他们正在使用内置的曲线方法.getPoitns()在他们的行上生成大约30个点.
我正在努力实现的目标是否有更好的例子?是否有一种方法可以在线上获得点数而不是使用.lerp()方法30次获得30分?我应该只使用TWEEN动画吗?
任何帮助或方向将不胜感激.
我已经使用编辑器创建了粒子效果,现在我想更改particleColor代码。我已设置particleColorSequence为 nil(否则我的颜色将来自编辑器中的色带而不是我的代码)并particleColorBlendFactor设置为 1.0。我particleColor在update方法中分配了一个随机颜色,希望它每次通过循环都会改变。它第一次选择随机颜色,但颜色永远不会改变。有人可以解释为什么吗?
全球的
let emitter = SKEmitterNode(fileNamed: "squares.sks")
let colors = [SKColor.red, SKColor.green, SKColor.blue]
Run Code Online (Sandbox Code Playgroud)
didMove(查看:)
emitter?.particleColorBlendFactor = 1.0
emitter?.particleColorSequence = nil
addChild(emitter!)
Run Code Online (Sandbox Code Playgroud)
更新(_ currentTime :)
let random = Int(arc4random_uniform(UInt32(self.colors.count)))
emitter?.particleColor = colors[random]
Run Code Online (Sandbox Code Playgroud) 我正在尝试将particles.js用作背景,但是无法将画布设置为全尺寸背景。
我尝试了类似问题的至少10种不同解决方案,但没有任何效果。画布始终作为具有宽高比的元素出现在屏幕上,但在调整大小时并不能覆盖整个画布。在成瘾中,它不会作为背景,而是作为身体的一部分,位于其余元素之上或之下。
我尽可能简化了代码,问题仍然存在。
的HTML
<!DOCTYPE HTML>
<html>
<head>
<title>Try</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
<link rel="stylesheet" media="screen" href="css/style.css">
</head>
<body>
<div id="particles-js"></div>
<div>
<p>Something here</p>
</div>
</body>
<script src="assets/js/particles.js"></script>
<script src="assets/js/app.js"></script>
</html>
Run Code Online (Sandbox Code Playgroud)
的CSS
canvas{
display:block;
vertical-align:bottom;
position: absolute;
}
/* ---- particles.js container ---- */
#particles-js{
position: absolute;
width: 100%;
height: 100%;
background-color: #b61924;
background-image: url('');
background-size: cover;
background-position: 50% 50%;
background-repeat: no-repeat;
top: 0;
}
Run Code Online (Sandbox Code Playgroud)
可以从之前发布的所有者的网站上下载APP.JS和PARTICLES.JS。我正在使用他们目前的主题
谢谢你的帮助
我几乎在Swift中看到了连续发射器的示例,并且在Obj-C中找到了一个示例,方法是将发射器单元的birthRate设置为0.0,但是它似乎不起作用,所以我一定做错了。在我的示例中,我可以看到一条消息,将出生率设置为0十六倍,但是粒子继续不断流动。
@IBAction func particleBtnAction(_ sender: Any) {
let emitter = CAEmitterLayer()
emitter.emitterPosition = CGPoint(x: self.view.frame.size.width / 2, y: -10)
emitter.emitterShape = kCAEmitterLayerLine
emitter.emitterSize = CGSize(width: self.view.frame.size.width, height: 2.0)
emitter.emitterCells = generateEmitterCells()
self.view.layer.addSublayer(emitter)
// perform selector after 1.5 seconds when particles start
perform(#selector(endParticles), with: emitter, afterDelay: 1.5)
}
private func generateEmitterCells() -> [CAEmitterCell] {
var cells:[CAEmitterCell] = [CAEmitterCell]()
for index in 0..<16 {
let cell = CAEmitterCell()
cell.birthRate = 4.0
cell.lifetime = 1.0
cell.lifetimeRange = 0
cell.velocity = 0.7
cell.velocityRange = …Run Code Online (Sandbox Code Playgroud) 我希望与此项目相同的效果
但我的粒子SKEmitterNode不是直接在场景中,而是在子节点中.我的粒子在我的飞船后面是反应堆效应,我希望它在SpaceShip节点移动时在场景上留下痕迹.
现在我的粒子是我的太空船的一个子节点,因此,"所有"粒子随着太空船移动,所以它只显示一个点并且不会留下痕迹.
我该怎么做 ?
particles ×10
ios ×3
swift ×3
iphone ×2
javascript ×2
opengl-es ×2
sprite-kit ×2
acceleration ×1
android ×1
animation ×1
css ×1
html ×1
javafx ×1
objective-c ×1
particles.js ×1
physics ×1
point ×1
python ×1
simulation ×1
sprite ×1
three.js ×1