Ped*_*rim 5 java opengl-es-2.0 kotlin
我遇到列表的读/写数据问题.屏幕上随机位置有一组项目(具有初始位置的顶点).有时我需要在用户触摸屏幕时修改其中一些位置(数量不同).
我第一次实现这个时,我创建了一个translateX列表,并在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)
}
}
Run Code Online (Sandbox Code Playgroud)
视频:https://www.youtube.com/watch?v = LaXqcQpqYsQ
知道我能做些什么来解决这个问题吗?
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |