2016-05-15 24 views
0

私はgpuの頂点データを持つ配列を作成するこのコードを持っています。今、私が持つことができる粒子の量は、CPU、特にこの機能によって厳しく制限されています。1秒に1000回実行すると、このコードが遅く実行されるのはなぜですか?

この関数は基本的に、 "パーティクル"オブジェクトの配列の値に基づいて、事前に割り当てられた配列の値を上書きします。

circles = [GLfloat](count: ((MAX_PARTICLES) * 8) * 2, repeatedValue: 0) 
    squares = [GLfloat](count: ((MAX_PARTICLES) * (6 * 4)), repeatedValue: 0) 
    indices = [GLushort](count: ((MAX_PARTICLES) * 6), repeatedValue: 0) 

驚くべきことは、この遅延を引き起こしているobj.update(1/60.0)の呼び出しではなく、「calcRectangleは」できるだけ速く行くことのようです。このコードをスピードアップする方法はありますか、それとも現代の迅速な制限ですか?

private func _buildArrays1() 
    { 
     var circlePos:Int = 0 
     var rectPos:Int = 0 
     var buffer_index:Int = 0 
     var accum:Int = 0 
for obj in particles 
{ 
    obj.update(1.0/60.0) 
    let pos:Point = obj.position 
    let lpos:Point = obj.lastPosition 
    var color:ColorHSV = obj.color 
    let width:GLfloat = obj.size 
    let rect = Math.makeRectangle(pos, p2: lpos, w: width) 

    color = ColorHSV(h: 1.0, s: 0.0, v: 0.0, a: 1.0) 
    circles[circlePos] = pos.x 
    circles[circlePos + 1] = pos.y 
    circles[circlePos + 2] = 0.0 
    circles[circlePos + 3] = color.h 
    circles[circlePos + 4] = color.s 
    circles[circlePos + 5] = color.v 
    circles[circlePos + 6] = color.a 
    circles[circlePos + 7] = width 
    circles[circlePos + 8] = lpos.x 
    circles[circlePos + 9] = lpos.y 
    circles[circlePos + 10] = 0.0 
    circles[circlePos + 11] = color.h 
    circles[circlePos + 12] = color.s 
    circles[circlePos + 13] = color.v 
    circles[circlePos + 14] = color.a 
    circles[circlePos + 15] = width 
    circlePos += 16 

    color = ColorHSV(h: 1.0, s: 1.0, v: 0.0, a: 1.0) 

    squares[rectPos] = rect.0.x; rectPos += 1; 
    squares[rectPos] = rect.0.y; rectPos += 1; 
    squares[rectPos] = color.h; rectPos += 1; 
    squares[rectPos] = color.s; rectPos += 1; 
    squares[rectPos] = color.v; rectPos += 1; 
    squares[rectPos] = color.a; rectPos += 1; 
    squares[rectPos] = rect.1.x; rectPos += 1; 
    squares[rectPos] = rect.1.y; rectPos += 1; 
    squares[rectPos] = color.h; rectPos += 1; 
    squares[rectPos] = color.s; rectPos += 1; 
    squares[rectPos] = color.v; rectPos += 1; 
    squares[rectPos] = color.a; rectPos += 1; 
    squares[rectPos] = rect.2.x; rectPos += 1; 
    squares[rectPos] = rect.2.y; rectPos += 1; 
    squares[rectPos] = color.h; rectPos += 1; 
    squares[rectPos] = color.s; rectPos += 1; 
    squares[rectPos] = color.v; rectPos += 1; 
    squares[rectPos] = color.a; rectPos += 1; 
    squares[rectPos] = rect.3.x; rectPos += 1; 
    squares[rectPos] = rect.3.y; rectPos += 1; 
    squares[rectPos] = color.h; rectPos += 1; 
    squares[rectPos] = color.s; rectPos += 1; 
    squares[rectPos] = color.v; rectPos += 1; 
    squares[rectPos] = color.a; rectPos += 1; 

    indices[buffer_index] = GLushort(accum); buffer_index += 1; 
    indices[buffer_index] = GLushort(accum + 1); buffer_index += 1; 
    indices[buffer_index] = GLushort(accum + 2); buffer_index += 1; 
    indices[buffer_index] = GLushort(accum + 3); buffer_index += 1; 
    indices[buffer_index] = GLushort(accum + 2); buffer_index += 1; 
    indices[buffer_index] = GLushort(accum + 1); buffer_index += 1; 


    accum += 4; 
} 
} 

ちょうど(私はこの問題は疑いがありますが)ここでは、数学のクラスからの関連する抜粋です。

class Math { 
    static func makeRectangle(p1: Point, p2: Point, w: GLfloat) -> (Point, Point, Point, Point) 
    { 
     //Returns the vertices of a rectangle made with the two point 
     if ((p2.x < p1.x) && (p2.y < p1.y)) 
     { 
      //POINTs are not in the right order 
      return makeRectangle(p2, p2: p1, w: w) 
     } 
     let vector = subtract(p2, p1) 
     let unit = devide(vector, length(vector)) 
     let perp = Point(x: -unit.y, y: unit.x) 
     let calc = multiply(perp, w/2) 
     return (add(p1, calc), subtract(p1, calc), add(p2, calc), r: subtract(p2, calc)) 
    } 
    static func subtract(l:Point, _ r:Point) -> Point 
    { 
     return Point(x: l.x - r.x, y: l.y - r.y) 
    } 
    static func add(l:Point, _ r:Point) -> Point 
    { 
     return Point(x: r.x + l.x, y: r.y + l.y) 
    } 
    static func devide(l:Point, _ r:GLfloat) -> Point 
    { 
     return Point(x: l.x/r, y: l.y/r) 
    } 
    static func length(o:Point) -> GLfloat 
    { 
     return sqrt(o.x * o.x + o.y * o.y) 
    } 
    static func multiply(o:Point, _ v:GLfloat) -> Point 
    { 
     return Point(x: o.x * v, y: o.y * v) 
    } 
} 
+1

あなたにはいくつのパーティクルがありますか? 1秒間に1000回のコード全体を実行することはかなりの頻度で行われており、多くの作業をしています。パーティクルシステムは非常に難しい作業です。 – luk2302

答えて

0

OK、私は、GPUの配列に直接位置を保持していない理由を、なぜ私は、構造体のすべてを保持しています、私は実現していたとき(私は完全に注意を払ったことを)講義中に座っていました。

だから私は "ポイント"構造体を取り除き、すべてが配列の位置に基づいていた!今、ボトルネックはgpuにあります!

構造体に値を格納し、コンポーネントごとに配列にコピーするだけでは効率的ではありません。

関連する問題