gpt4 book ai didi

ios - OpenGL GLPaint 线程渲染

转载 作者:行者123 更新时间:2023-11-29 12:47:16 24 4
gpt4 key购买 nike

我目前使用的库基于 Apple 的 GLPaint 示例,用于在 Open GL 的屏幕上绘图。目前,每当 Canvas 保存和恢复 session 时,都会绘制线条(可以看到进度),如果要渲染的点很多,则需要花费相当多的时间。有没有办法让它并行或更快地渲染?

这是我正在使用的绘图代码:

CGPoint start = step.start;
CGPoint end = step.end;

// Convert touch point from UIView referential to OpenGL one (upside-down flip)
CGRect bounds = [self bounds];
start.y = bounds.size.height - start.y;
end.y = bounds.size.height - end.y;

static GLfloat* vertexBuffer = NULL;
static NSUInteger vertexMax = 64;
NSUInteger vertexCount = 0,
count,
i;

[EAGLContext setCurrentContext:context];
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);

// Convert locations from Points to Pixels
CGFloat scale = self.contentScaleFactor;
start.x *= scale;
start.y *= scale;
end.x *= scale;
end.y *= scale;

// Allocate vertex array buffer
if(vertexBuffer == NULL)
vertexBuffer = malloc(vertexMax * 2 * sizeof(GLfloat));

// Add points to the buffer so there are drawing points every X pixels
count = MAX(ceilf(sqrtf((end.x - start.x) * (end.x - start.x) + (end.y - start.y) * (end.y - start.y)) / kBrushPixelStep), 1);
for(i = 0; i < count; ++i) {
if(vertexCount == vertexMax) {
vertexMax = 2 * vertexMax;
vertexBuffer = realloc(vertexBuffer, vertexMax * 2 * sizeof(GLfloat));
}

vertexBuffer[2 * vertexCount + 0] = start.x + (end.x - start.x) * ((GLfloat)i / (GLfloat)count);
vertexBuffer[2 * vertexCount + 1] = start.y + (end.y - start.y) * ((GLfloat)i / (GLfloat)count);
vertexCount += 1;
}

// Render the vertex array
glVertexPointer(2, GL_FLOAT, 0, vertexBuffer);
glDrawArrays(GL_POINTS, 0, (int)vertexCount);

// Display the buffer
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];

最佳答案

OpenGL 不是多线程的。您必须从单个线程提交 OpenGL 命令。

你有几个选择:

  1. 您可以考虑您的代码以使用并发来构建您发送到 OpenGL 的数据,然后在所有可用时将其提交给 OpenGL API。

  2. 您可以重构它以使用着色器进行计算。这将计算从 CPU 转移到 GPU,GPU 已针对并行操作进行了高度优化。

您上面的代码在 for 循环中使用 realloc 重复重新分配缓冲区。这是非常低效的,因为内存分配是现代操作系统中最慢的基于 RAM 的操作之一。您应该重构代码以预先计算内存缓冲区的最终大小,然后按最终大小分配一次缓冲区,并且根本不使用 realloc。这应该可以让您毫不费力地提高很多倍的速度。

看一眼您的代码,重构您的 for 循环以将顶点计算分解为 block 并将这些 block 提交给 GCD 以进行并发处理应该一点都不难。诀窍在于将任务分解为足够大的工作单元,以便从并行处理中受益(将任务设置为在后台队列中运行会产生一定的开销。您希望在每个工作单元中完成足够的工作以让这笔开销物有所值。)

关于ios - OpenGL GLPaint 线程渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23347188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com