- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Cocoa + OpenGL 为 MacOS 构建一个小游戏来创建 GUI。该游戏是 BoulderDash-Clone,因此它基本上是一个 2D 对象数组,而且数量不多(一个关卡大约有 40 个对象宽,25 个对象高)。很多对象都是动画的,所以我必须在绘制它们时动态获取纹理(我使用 NSTimer 不断重绘动画场景)。这似乎会导致严重的性能问题。
我首先做到了
for(y1, ..., yn) for(x1, ..., xn)
{
glBindTexture(foo);
glBegin(GL_QUAD);
[drawing the quad with texture]
glEnd();
}
它可以工作,但速度非常慢(事件监视器显示 CPU 使用率为 20%)。由于我没有创建任何纹理,所以我使用了一个占位符,它允许我进行测试
glBindTexture(foo);
for(y1, ..., yn) for(x1, ..., xn)
{
glBegin(GL_QUAD);
[drawing of quad with texture]
glEnd();
}
速度快很多(CPU 使用率 2%)。所以我认为是 glBindTexture() 导致了速度大幅下降。然后我试图找出 glBindTexture() 到底有多慢,并且确实如此
for(y1, ..., yn) for(x1, ..., xn)
{
glBindTexture(foo);
// no drawing this time
}
速度也非常快(2% CPU 使用率)。这是为什么?
最终我必须将 glBindTexture() 和绘图放入同一个循环中,因为我必须根据对象及其动画绑定(bind)纹理。所以我需要找出第一个代码示例中导致性能问题的原因以及如何加快速度。我一直认为使用 OpenGL 处理数百个具有不同纹理的对象不会那么慢。哦,我已经用 Java + JOGL 构建过这个游戏一次,如果我没记错的话,我做了完全相同的事情,而且速度要快得多。 Objective-C/C++ 不应该破坏 Java 的性能吗?
最佳答案
在命令处理方面,OpenGL 规范为实现提供了相当大的余地。您的 glBindTexture()
调用可能只是在命令队列中设置一个 int,在交换缓冲区或调用 glFinish()
/glFlush 之前,它实际上不会被处理。 ()
。如果您调用它,然后不向 OpenGL 提供任何几何体来使用它,它甚至可能(大部分)被忽略。
使用texture atlases减少 glBindTexture()
调用。
glBegin()
和类似的方法是将几何体提交给 OpenGL 的最慢方法。尝试尽可能多地批量处理几何体并使用 vertex arrays/VBOs减少函数调用开销。
关于cocoa - glBindTexture() + glBegin(foo) 慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4805451/
我的游戏渲染了许多立方体,这些立方体随机具有 12 种纹理中的一种。我已经对几何体进行了 Z 排序,因此我不能只使用 texture1 然后 2 然后 3 等渲染所有立方体......因为这会破坏 z
我正在尝试绘制一些简单的 3D 直角棱镜,但 glBindTexture 似乎无法正常工作。 我有 N 个“片段”,每个片段都有一个 Material 名称。 我遍历每一 block ,根据其 Mat
我已经看到缓存了当前 GL 纹理名称的示例代码(尤其是在 iOS GL 项目中),并且在调用 glBindTexture 之前进行了比较。目标是避免对 glBindTexture 的不必要调用。 例如
我正在寻找 glActiveTexture(...) 之间的关系和 glBindTexture(...)我找到了 awesome answer here ,最重要的答案(作者/用户 Alfonse)为
这是我用来绘制 Sprite 的方法: public void DrawSprite(Sprite sprite) { Gl.glBegin(Gl.GL_TRI
我正在渲染棋盘,使用 2 种不同的纹理。一个用于黑色方 block ,一个用于白色方 block 。然而,不是每个不同的正方形都有自己的纹理,它们都采用我调用 glBindTexture(GL_TEX
glBindImageTexture 和 glBindTexture 有什么区别?以及着色器中以下声明之间的区别是什么: layout (binding = 0, rgba32f) uniform i
我正在使用 Cocoa + OpenGL 为 MacOS 构建一个小游戏来创建 GUI。该游戏是 BoulderDash-Clone,因此它基本上是一个 2D 对象数组,而且数量不多(一个关卡大约有
据我所知,glActiveTexture设置事件的“纹理单元”。每个纹理单元可以有多个纹理目标(通常是 GL_TEXTURE_1D、2D、3D 或 CUBE_MAP)。 如果我理解正确,您必须调用gl
如何关闭纹理单元,或者至少在绑定(bind)纹理时防止其状态发生变化?我正在使用着色器,所以我认为没有 glDisable 。问题是事件链可能看起来像这样: Create texture 1 (imp
OpenGL 中 glframebuffertexture 和 glbindtexture 这两个函数在使用上的具体区别是什么。 具体来说,我正在使用 OpenTK 使用 OpenGL 为嵌入式机器编
我正在尝试为 OpenGL/V8/JavaScript 中的纹理使用实现 OpenGL 绑定(bind)。 我的问题很简单: OpenGL 的 glBindTexture() 方法需要一个指向 GLu
我还是 opengl3 的新手,我正在尝试创建多 channel 渲染。 为此,我创建了 FBO,生成了多个纹理并使用 将它们附加到它上面 unsigned index_col = 0;
我正在多 GPU 设置(Mac Pro 2013 年末)中开发 OS X 应用程序,该应用程序使用 OpenCL(在辅助 GPU 上)生成纹理,稍后使用 OpenGL 将其绘制到屏幕上(在主 GPU)
我正在使用 C++ 和 Opengl,我正在尝试使用 SOIL,但是当我编译时,我得到了对 glBindTexture、glTexImage2D 等的 undefined reference 。但是,
我正在尝试将 OpenCV cv::Mat 图像转换为 OpenGL 纹理(我需要一个指向纹理的 GLuint)。到目前为止,这是我从大量 Google 搜索中拼凑而成的代码: void otherF
我的一个纹理在 OpenGL 上有一个糟糕的行为。 删除纹理后,我创建一个新纹理,它生成与之前相同的 tex 编号,但纹理不正确。另外 glGetError 在每一行总是返回 0!我试图在 glDel
请问一个关于 iOS 5.0 框架中的 GLKit 的快速问题。 如果您使用 GLKTextureLoader,它是否只加载当前事件纹理单元中的纹理?我查看了示例,但没有看到您必须说变量 x 中的 G
我是 OpenGL 新手,我的纹理有一个奇怪的问题 - 寻找正确方向的插入。 我有一个应用程序,它使用渲染纹理技术来实现某种效果 - 它运行得非常好。每次需要时,我都会绘制到屏幕外缓冲区,并且能够在渲
您好,我要在显示器中绘制 35 张图像。我在 7X5 网格中绘制它。图片是从网上下载的。每次下载图像时,我都会尝试绘制全部 35 张图像。但其中一些尚未下载。所以我为他们绘制了一些默认图 block
我是一名优秀的程序员,十分优秀!