我的C++项目中有一个粒子系统引擎,粒子本身只是没有函数的变量的结构.目前,通过直接访问其变量,从其父类(ParticleSystem)更新每个粒子(粒子).例如
particle.x += particle.vx;
Run Code Online (Sandbox Code Playgroud)
然而,我正在讨论使用这样的getter和setter:
particle.setX( particle.getX()+particle.getVX() );
我的问题是:调用getter和setter是否有任何性能开销而不是直接数据访问?
毕竟,我确实有许多粒子需要更新......
我在3D中渲染具有alpha纹理的多个对象.所有纹理加载都很好但是当我尝试将它们呈现在彼此前面时,我得到以下结果:

左边是我的.它应该是正确的.网格只是为了帮助可视化透视.
红色圆圈纹理前面的纹理被剪裁.我四处寻找答案,它告诉我使用:
GLES20.glEnable( GLES20.GL_BLEND );
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA );
Run Code Online (Sandbox Code Playgroud)
但我使用它仍然无法正常工作.我在onSurfaceCreated()函数中正确放置的设置是:
GLES20.glClearColor( 0.75f, 0.85f, 1f, 1.0f );
GLES20.glEnable( GLES20.GL_BLEND );
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA );
GLES20.glEnable( GLES20.GL_DEPTH_TEST );
GLES20.glDepthFunc( GLES20.GL_LEQUAL );
GLES20.glDepthMask( true );
GLES20.glClearDepthf( 1f );
Run Code Online (Sandbox Code Playgroud)
我的片段着色器是:
uniform sampler2D texture;
varying vec2 texCoord;
void main(){
gl_FragColor = texture2D( texture, texCoord );
}
Run Code Online (Sandbox Code Playgroud)
我是否必须在Android清单中包含任何内容才能启用Alpha测试?我不想最终必须手动组织我的多边形或使用alpha discard(),因为我需要并希望一些像素是半透明的.
如何让3D alpha测试深度缓冲区工作?
我正在玩Java,并想知道以下在性能方面有多么不同.我知道过早的优化是编程的困境,但我的好奇心仅供将来参考.
public class Type1{
int[] data = new data[4];
public int getData( int index ){
return data[index];
}
}
public class Type2{
int data1;
int data2;
int data3;
int data4;
public int getData1(){
return data1;
}
public int getData2(){
return data2;
}
public int getData3(){
return data3;
}
public int getData4(){
return data4;
}
}
Run Code Online (Sandbox Code Playgroud)
可以理解的是,有许多因素可能会有所不同,但必须以某种方式表现出一些明显的表现.显然类Type1在设计方面是一个更有吸引力的解决方案,但它似乎在检索数据时有一个额外的步骤,即进入一个数组以获得一个与Type2相反的int,它直接用于数据.如果它们持有Class对象数组,则差异可能更明显,因为它可能会保证Java使用数组成员的引用.我完全没球了吗?
查看 C++ 向量文档,pop_back() 是一个不会导致向量数据重新分配的函数。但是,这只适用于删除向量的一个成员。我试图找到一种方法来从向量的末尾擦除多个成员。最初我以为我会在一个小的 for 循环中调用 pop_back() 但是我在徘徊是否有更方便的函数可以为我做这件事?
编辑:Cplusplus 向量擦除()参考并不像 juanchopanza 所指出的那样清晰。这就是为什么我最初放弃使用擦除()。毕竟擦除,效果很好。
对于OpenGL中的某些函数,必须glVertexAttribPointer()为stride 指定字节偏移量,例如in .起初我会猜到它将是一个像整数一样的正常数值.但经过检查,我意识到它需要被投入void*(更具体地说GLvoid*).我的问题是:它的意图是什么void*?为什么必须将它用于字节偏移?
我创建了一个顶点缓冲对象类来管理我的应用程序中的许多顶点.用户调用构造函数来创建glBuffer并调用glBufferData来分配指定的空间量.
有一个名为resize的类函数,允许用户通过再次调用glBufferData来改变VBO的容量.我的问题是,我如何解除分配先前的分配?还是自动完成?
根据opengl文档,glDeleteBuffer只删除缓冲区本身而不提及glBufferData分配的实际内存. 我可以继续在同一个绑定缓冲区上调用glBufferData而没有内存泄漏吗?
我知道vtable查找虚函数要比直接函数调用慢很多,因为基类必须搜索vtable来获取派生函数.如果有更多的派生层,如果它会更慢,我就会徘徊.基本上,我的问题如下:
是基础 - > 衍生的(1层继承)虚拟函数调用的速度比 基 - > Derived1 - > Derived2的 - > Derived3 - > DerivedEtc(多层)虚拟函数调用?
我想知道下面这段代码是否是内存泄漏,因为谷歌只是出现了奇怪的例子.基本上,如果我有一个班级Tree:
public class Tree{
private Bird[] birds;
public Tree(){
birds = new Bird[100];
}
}
Run Code Online (Sandbox Code Playgroud)
我持有Tree类似这样的类引用:
Tree myTree = new Tree();
Run Code Online (Sandbox Code Playgroud)
然后不久我将该引用设置为null:
myTree = null;
Run Code Online (Sandbox Code Playgroud)
垃圾收集器是否会将所有100个已分配的鸟类与树类一起处理?或者我需要一个delete()方法?我知道Java没有析构函数,但这个多层类示例仍然让我困惑:
里面Tree.java:
public void deleteBirds{
birds = null;
}
Run Code Online (Sandbox Code Playgroud) c++ ×5
java ×3
opengl ×2
3d ×1
android ×1
arrays ×1
casting ×1
depth-buffer ×1
inheritance ×1
ios ×1
memory-leaks ×1
multi-layer ×1
optimization ×1
performance ×1
pointers ×1
vector ×1
vtable ×1