小编Kom*_*ave的帖子

OpenGL ES 2.0:寻求许多移动顶点的VBO性能/优化技巧

在我不断尝试从ES 1.x转换为OpenGL ES 2.0时,我正在转换一些代码以使用Vertex Buffer Objects('VBOs')而不是现有的无缓冲glDrawArrays调用.

我已经建立了VBO并使它们正常工作,但是已经遇到了设计难题,并且会对那些对OpenGL ES 2.0更有经验的人的建议表示感谢.

我想绘制一堆经常移动的多边形精灵.这是因为如果你熟悉Box2D,它们就是动态的Box2D机构.这些多边形体都是使用GL_TRIANGLE_FAN生成的,这有点关键,因为GL_POLYGON在ES 2.0上不可用.

多边形具有其他属性,例如颜色,可以在应用程序生命周期的某个阶段更改,但它是保证几乎每帧都会改变的顶点位置.

多边形在游戏中分组,因此我打算管理和绘制每个组而不是每个主体的交错顶点/颜色数组,以尽量减少GPU通信.

这里有很多成功的途径,我一直在阅读OpenGL ES 2.0编程指南,以寻求尽可能多的关于VBO的信息和优化技巧,以及他们所说的内容:

  • 交错数据是有利的,因为"每个顶点的属性数据可以按顺序方式读取".

  • 本书建议"如果需要修改顶点属性数据的子集,则可以...在单独的缓冲区中存储本质上是动态的顶点属性".

  • 建议"尽可能使用GL_HALF_FLOAT_OES",尤其是颜色,因为未经投影的顶点位置可能超出此空间要求.

  • 只有在更新整个缓冲区时才应使用glMapBufferOES,即使在这种情况下,操作"与glBufferData相比仍然可能很昂贵".

这是我的问题:

  1. 如果使用GL_TRIANGLE_FAN作为绘图模式,这是否会强制我存储每个体的VBO而不是每个组?或者,为了"结束"风扇和当前体的常见顶点位置,是否会为组VBO中的下一个体绘制新的风扇?

  2. 尽管顶点位置以高频率更新,我应该交错我的所有数据,还是应该将所有数据/只是位置分成自己的VBO?

  3. 按照上面的书籍建议,大概每次更新渲染时我都应该glBufferData我的顶点位置,而不是使用glMapBufferOES或glBufferSubData更新缓冲位置?

  4. 是否有任何未提及的功能/设计选择我应该用于提高多动态多边形背景下的性能?

  5. 我是否应该尝试使用GL_HALF_FLOAT_OES进行颜色存储,即在2个浮点数的空间中,我会存储4个半浮点数?如果答案为"是",我是否只使用GLfloat大小为每种颜色一半的GL类型,然后按位OR,然后插入适当的属性数组?

  6. 有一次,我已经创建了X许多维也纳组织,都是我需要为每个渲染glBindBuffer,glBufferData和glDrawElements /阵列的唯一呼叫,或者我也必须调用glEnableVertexAttribArray和glVertexAttribPointer每次使用glBufferData时间?

我非常感谢您对此提出进一步的建议,谢谢.

optimization opengl-es vbo opengl-es-2.0

9
推荐指数
1
解决办法
6301
查看次数

有没有使用java.nio.*来中断InputStream #read()而不关闭套接字?

您是否知道在InputStream不关闭相关套接字的情况下中断Java读取的方法?

以下是抓取套接字输入流并转换为可中断DataInputStream的当前构造策略:

InputStream interruptibleInputStream = Channels.newInputStream(Channels.newChannel(m_ConnectionData.getSocket().getInputStream()));
DataInputStream myInterruptibleDIS = new DataInputStream(interruptibleInputStream);
Run Code Online (Sandbox Code Playgroud)

这使用了一个ReadableByteChannel提供read(ByteBuffer)支持ClosedByInterruptExceptionthrowable的方法.

问题是,调用线程使一个中断read()的电话DataInputStream的原因底层套接字被关闭.

对于我的上下文,我需要套接字保持打开状态; 该read调用正在等待未来的用户输入,因此我正在使用中断将控制权传递回更高的组件,然后最终read再次返回.

如果有人能够建议使用JDK内置类来实现这一目标,或者可能指出某些信息无法实现,我将非常感激.

我知道还有其他方法可以达到同样的效果,但我很想知道这种方法是否可行.

java sockets nio interrupt

9
推荐指数
1
解决办法
2072
查看次数

Android:从Parcelable到Serializable的任何快捷方式,而不使用marshall()?

我知道Parcelable(快)和Serializable(慢)之间的性能差异.但是,我需要持久存储某些应用程序信息,而不仅仅是在一个生命周期内,因此onSaveInstanceState和使用Parcelable对象的相关方法是不合适的.

所以我把注意力转向了Serializable.主要是我有AbstractList类型存储 - 这很好,因为它们实现Serializable.然而,我存储在其中的许多类型是Parcelable但不是Serializable,例如RectF.

我认为"没问题",因为我可以轻松地生成一个包,Parcelable.writeToParcel(parcel, flags)然后调用marshall()它来创建一个byte[]我可以序列化和反序列化的包.我想我会使用泛型; 创建一个SerializableParcelable<Parcelable> implements Serializable类,为Parcelable我希望序列化的所有类型提供一个适合的解决方案.然后我会将每个RectF存储在这个包装器中ArrayList,然后看看它的Parcelable内容是否可序列化.

但是,API文档规定marshall()不得将其用于持久存储:

public final byte [] marshall()

返回宗地的原始字节.

您在此处检索的数据不得放在任何类型的持久存储中(在本地磁盘上,通过网络等).为此,您应该使用标准序列化或其他类型的通用序列化机制.Parcel编组表示针对本地IPC进行了高度优化,因此不会尝试保持与在不同版本的平台中创建的数据的兼容性.

所以现在我被卡住了.我可以忽略这个警告并遵循我上面概述的路线,或者通过扩展Parcelable我想要序列化和创建定制序列化方法的每个人来避免这个问题,这似乎非常浪费时间和精力.

有没有人知道Parcelable没有使用序列化对象的'正确'快捷方式marshall()?或者,如果不注意指定的警告,我应该继续吗?也许SQLite数据库是可行的方法,但我不确定并希望得到你的建议.

非常感谢.

android marshalling serializable parcelable

7
推荐指数
1
解决办法
2219
查看次数

为什么这个OpenGL ES 2.0着色器不能在iOS上使用我的VBO?

如果任何人都可以揭示这是怎么回事错在这里光,也许GL命令或其他一些不兼容的指令序列的乱序,我将是你的帮助极大感谢.尽管谷歌在"OpenGL ES 2.0编程指南"中进行了大量研究和研究,但我一直试图让这些代码整天都没有成功.

我正在尝试在iPhone上的OpenGL ES 2.0中使用顶点缓冲区对象和自定义着色器.我试图交错来自以下类型的一系列自定义结构的顶点数据:

typedef struct {
    float x, y; // Position.
    float radius;
    float colR,colG,colB,colA; // Color rgba components.
} VType;
Run Code Online (Sandbox Code Playgroud)

位置,半径和颜色字节分别考虑顶点位置,点大小和颜色.这些的ID是初始化的:

ID_ATT_Pos = 0;
ID_ATT_Radius = 1;
ID_ATT_Color = 2;
// Note: I have also tried values of 1,2,3 but no difference.
Run Code Online (Sandbox Code Playgroud)

这些的步幅在每个glVertexAttribPointer调用中指定.

意图是每个顶点在其x,y位置绘制,具有指定的颜色和半径的点数.与上述每个属性相关联的是顶点着色器属性,它们是"a_position","a_color"和"a_radius".以下是顶点和片段着色器:

VertexShader.txt

attribute vec2 a_position;      
attribute vec4 a_color;     
attribute float a_radius;       
varying vec4 v_color;
void main()
{
    gl_Position = vec4(a_position,0.0,1.0);
    gl_PointSize = a_radius;
    v_color = a_color;
}
Run Code Online (Sandbox Code Playgroud)

FragmentShader.txt

#ifdef GL_FRAGMENT_PRECISION_HIGH
    precision highp float; …
Run Code Online (Sandbox Code Playgroud)

shader opengl-es vbo ios opengl-es-2.0

7
推荐指数
1
解决办法
2281
查看次数

iOS 5 + GLKView:如何访问基于颜色的顶点拾取的像素RGB数据?

我一直在转换自己的个人OGLES 2.0框架,以利用新的iOS 5框架添加的功能GLKit.

在取悦结果之后,我现在希望实现这里描述的基于颜色的拾取机制.为此,您必须访问后台缓冲区以检索触摸的像素RGBA值,然后将其用作顶点/基元/显示对象的唯一标识符.当然,这需要对所有顶点/基元/显示对象进行临时唯一着色.

我有两个问题,我非常感谢你们的帮助:

  1. 我有权访问GLKViewController,GLKView,CAEAGLLayer(的GLKView)和EAGLContext.我还可以访问所有与OGLES 2.0缓冲区相关的命令.如何组合这些来识别我在屏幕上点击的EAGLContext中像素的颜色?

  2. 鉴于我正在使用顶点缓冲对象进行渲染,是否有一种巧妙的方法来覆盖提供给我的顶点着色器的颜色,首先不涉及修改缓冲的顶点(颜色)属性,其次不涉及添加一个IF语句进入顶点着色器?

我认为(2)的答案是"不",但出于性能和非艰苦的代码改造的原因,我认为与更有经验的人核实是明智的.

我们将非常感激地收到任何建议.感谢您的时间

UPDATE

我现在知道如何使用glReadPixels从活动帧缓冲区读取像素数据.所以我想我只需要对后台缓冲区进行特殊的"独特颜色"渲染,短暂切换到它并读取像素,然后切换回来.这将不可避免地产生视觉闪烁,但我想这是最简单的方法; 肯定比CGImageContextRef从屏幕快照创建一个并分析这种方式更快(也更明智).

尽管如此,关于后缓冲器的任何提示都将非常受欢迎.

pixel colors picking opengl-es-2.0 ios5

7
推荐指数
1
解决办法
4579
查看次数

使用GL_POINT_SMOOTH的ESGL圈的OpenGL ES 2.0等效?

OpenGL ES 2.0没有ES 1.0所做的GL_POINT_SMOOTH定义.这意味着我用来绘制圆圈的代码不再有效:

glEnable(GL_POINT_SMOOTH);
glPointSize(radius*2);
glDrawArrays(GL_POINTS,0,nPoints);
Run Code Online (Sandbox Code Playgroud)

在ES 2.0中是否存在等价物,也许在顶点着色器中有所改变,或者我必须为每个圆使用多边形?

geometry opengl-es-2.0

6
推荐指数
1
解决办法
4031
查看次数

OpenGL ES 2.0:使用GL_STREAM_DRAW进行VBO最有效的设置?

我在OpenGL ES 2.0中使用顶点缓冲对象(VBO).

我有一组顶点数据,它们永久存储在普通的RAM中.原因是从头开始计算顶点位置是昂贵的,但可以将delta添加到最后位置以便廉价地更新它.

要绘制的实际顶点数随时间快速变化.在一个帧中,我可能有1000个,在下一个2500个.在前面收到的建议之后,我现在指定整数UPPER作为将绘制的​​顶点数的上限.我malloc我的顶点和索引数据数组只有一次在启动基于此值.

我将GL_STREAM_DRAW使用提示传递给每个glBindBuffer调用,以指示每帧的数据更改.

为了尽可能高效,我创建了以下设置:

// SETUP: Called only once.
glBindBuffer(GL_ARRAY_BUFFER,...);
glBufferData(GL_ARRAY_BUFFER,...); // Pass vertex data for UPPER vertices.
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,...);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,...); // Pass index values 0 - (UPPER-1).
glEnableVertexAttribArray(...); // Setup vertex attributes.
glVertexAttribPointer(...);
glUseProgram(...); // Use program with custom shaders.
glUniformMatrix4fv(...); // Identify shader uniforms.

// UPDATE: Called when vertex data changes (on each frame).
glBindBuffer(GL_ARRAY_BUFFER,...);
glBufferSubData(GL_ARRAY_BUFFER,...); // Update VBO data.

// RENDER: Called on each frame.
glDrawElements(GL_TRIANGLES, numberOfVerticesThisFrame, …
Run Code Online (Sandbox Code Playgroud)

performance opengl-es vbo opengl-es-2.0

6
推荐指数
1
解决办法
5450
查看次数

Xcode 4:由于iPad模拟器的dylib错误,无法使用Enable Guard Malloc

在Xcode 4.x中,我已经将我的Run方案编辑为'Enable Guard Malloc',因为我有一个我需要跟踪的非描述性malloc错误.我知道我需要在模拟器中运行才能使用此功能.但是,当我这样做时,应用程序立即冻结,Xcode向我显示一个堆栈跟踪,如下所示:

Xcode 4.x中的堆栈跟踪

我已经用Google搜索了解决方案,但到目前为止还没有任何乐趣.据我所知,我应该在我的方案中设置一个环境变量:

DYLD_INSERT_LIBRARIES  ->  /usr/lib/libgmalloc.dylib
Run Code Online (Sandbox Code Playgroud)

然而,这并没有解决问题.我也试过'lsystem'作为值,但这也没有用.

任何人都可以建议解决这个dylib问题,或者推荐一个替代'Enable Guard Malloc'来识别malloc'd堆区域被超出的位置?

UPDATE

为了澄清,这是我正在处理的错误类型:

malloc: *** error for object 0x2b4b54: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
Run Code Online (Sandbox Code Playgroud)

我已经尝试设置一个符号断点malloc_error_break,但它仍然在内存问题上"随机"断开,而不是超出分配区域.

malloc xcode dylib guard

6
推荐指数
1
解决办法
1453
查看次数

C++:如何解决在未知点引起的第一次机会异常?

我正在努力的C++项目在抛出第一次机会异常时终止.当我第一次尝试访问map<pair<int,int>, int>包含单个键值对的Visual Studio 2008时,会在调试模式下发生这种情况.代码没有任何逻辑错误.

我已经阅读了第一次机会异常,并了解它们可能并不总是有问题.尽管如此,我试图打破所有这些异常,并且正如预期的那样,发现了几个没有引起任何问题.

我正在处理的类非常大,包含许多自定义内存分配.我猜测其中一个导致了这个问题.然而,我花了几个小时试图找到一种方法来识别出错的地方,并且无法这样做.

下面列出了第一次机会异常输出.这不是很有帮助!

First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location 0x6c696d00.
First-chance exception at 0x762cd09c in theapp.exe: 0xC0000005: Access violation reading location …
Run Code Online (Sandbox Code Playgroud)

c++ first-chance-exception visual-studio-2008

6
推荐指数
1
解决办法
2万
查看次数

稀疏对称矩阵预乘全向量最低阶复杂度参考

在我正在写的一篇论文中,我使用了一个 nxn 矩阵乘以一个维度为 n 的密集向量。在其自然形式下,该矩阵具有 O(n^2) 空间复杂度,并且乘法需要 O(n^2) 时间。

然而,众所周知,该矩阵是对称的,并且沿其对角线具有零值。该矩阵也是高度稀疏的:大多数非对角线项为零。

谁能将我链接到一个算法/论文/数据结构,该结构使用稀疏对称矩阵表示来接近 O(nlogn) 甚至在高稀疏性的情况下 O(n) ?

complexity-theory symmetric sparse-matrix

5
推荐指数
1
解决办法
499
查看次数