写入时由onDrawFrame读取的数组

时间:2018-07-12 10:38:54

标签: java kotlin opengl-es-2.0

我在读取/写入列表数据时遇到问题。屏幕上有随机位置的项目(具有初始位置的顶点)集合。有时,当用户触摸屏幕时,我需要修改其中一些位置(数量会有所不同)。

第一次实现此功能时,我创建了一个translationX列表,并将此变换应用于onDraw方法的每个顶点。

我还复制了列表,以利用方法System.arrayCopy的优势来查看是否有所改善。

有时,列表在 被写入时读取列表。因此,某些项目的转换值是错误的。即使使用System.arrayCopy()。 第一种解决方案是实现锁,以始终等待调用方法wait()的写入。编写完成后,它将释放调用wait()方法的notify()。但这会减慢onDraw方法的速度,从而降低FPS。 其次,我尝试使用布尔值跳过读取,以检查是否正在写入数据。它不能解决。

这里有个例子:

const val COUNT = 100
val xForWrite = FloatArray(COUNT)
val xForRead = FloatArray(COUNT)
val scratch = FloatArray(16)
val translateMatrix = FloatArray(16)

//Called when the user touches the screen and moves the finger on it.
fun updateOffset(value: Float) {

    for (i in 0 until COUNT) {
      //Translate using value parameter and xForWrite, the translate is not always content and can vary based on each item.
    }

    System.arraycopy(xForWrite, 0, xForRead, 0, xForRead.size)
  }

//Called by the onDrawFrame method, every 1/60 seconds (60fps), can be less, respecting the openGL timing.
fun draw(mvpMatrix: FloatArray) {

  mMVPMatrixHandle = GLES20.glGetUniformLocation(program, U_MVP_MATRIX)

  for (i in 0 until COUNT) {

    Matrix.setIdentityM(translateMatrix, 0)
    Matrix.translateM(translateMatrix, 0, xForRead[i], 0f, 0f)
    Matrix.multiplyMM(scratch, 0, mvpMatrix, 0, translateMatrix, 0)

    // Prepare the triangle coordinate data
    GLES20.glVertexAttribPointer(
      positionHandle,
      COORDS_PER_VERTEX,
      GLES20.GL_FLOAT,
      false,
      vertexStride,
      items[i])

    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, scratch, 0)

    // Draw the square
    GLES20.glDrawElements(
      GLES20.GL_TRIANGLES,
      drawOrder.size,
      GLES20.GL_UNSIGNED_SHORT,
      drawListBuffer)

  }

}

视频:https://www.youtube.com/watch?v=LaXqcQpqYsQ

有什么想法可以解决这个问题吗?

0 个答案:

没有答案