我在读取/写入列表数据时遇到问题。屏幕上有随机位置的项目(具有初始位置的顶点)集合。有时,当用户触摸屏幕时,我需要修改其中一些位置(数量会有所不同)。
第一次实现此功能时,我创建了一个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
有什么想法可以解决这个问题吗?