我知道默认的glReadPixels()会等到GL线程上执行所有绘图命令.但是当你绑定一个PixelBuffer对象然后调用glReadPixels()时,它应该是异步的,不会等待任何事情.但是当我绑定PBO并执行glReadPixels()时,它会阻塞一段时间.
以下是我初始化PBO的方法:
mPboIds = IntBuffer.allocate(2);
GLES30.glGenBuffers(2, mPboIds);
GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, mPboIds.get(0));
GLES30.glBufferData(GLES30.GL_PIXEL_PACK_BUFFER, mPboSize, null, GLES30.GL_STATIC_READ); //allocates only memory space given data size
GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, mPboIds.get(1));
GLES30.glBufferData(GLES30.GL_PIXEL_PACK_BUFFER, mPboSize, null, GLES30.GL_STATIC_READ);
GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, 0);
Run Code Online (Sandbox Code Playgroud)
然后我用两个缓冲区来打乒乓:
GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, mPboIds.get(mPboIndex)); //1st PBO
JNIWrapper.glReadPixels(0, 0, mRowStride / mPixelStride, (int)height, GLES30.GL_RGBA, GLES30.GL_UNSIGNED_BYTE); //read pixel from the screen and write to 1st buffer(native C++ code)
//don't load anything in the first frame
if (mInitRecord) {
GLES30.glBindBuffer(GLES30.GL_PIXEL_PACK_BUFFER, 0);
//reverse the index
mPboIndex = (mPboIndex + 1) % 2;
mPboNewIndex = (mPboNewIndex + 1) …Run Code Online (Sandbox Code Playgroud) 我已将其初始化为
count = 15;
Run Code Online (Sandbox Code Playgroud)
如果我有两个这样的线程:
thread_1(){
count = 0;
x = count;
count = x;
}
Run Code Online (Sandbox Code Playgroud)
和
thread_2(){
y = count;
count = y;
count = 0;
}
Run Code Online (Sandbox Code Playgroud)
在没有计数同步的情况下,在运行两个线程之后,count可以最终为15.
如果我将我的count变量声明为原子,那么在运行两个线程后,count会一直是0吗?