小编Ric*_*lor的帖子

外部结构?

我正在使用extern从另一个类中获取变量,它适用于int,float等...

但这不起作用,我不知道该怎么做:

Class1.cpp

struct MyStruct {
 int x;
}

MyStruct theVar;
Run Code Online (Sandbox Code Playgroud)

Class2.cpp

extern MyStruct theVar;

void test() {
 int t = theVar.x;
}
Run Code Online (Sandbox Code Playgroud)

它不起作用,因为Class2不知道MyStruct是什么.

我该如何解决?:/

我尝试在Class2.cpp中声明相同的结构,并编译,但值是错误的.

c++

15
推荐指数
1
解决办法
3万
查看次数

加速度计校准

我正在使用加速度计在屏幕上以X/Y移动某些东西.

如果手机在桌子上平放,这很容易.

我想出了一些东西,试图能够从任何给定的位置开始,并从那里开始工作.但它似乎并不自然地起作用.

我如何校准事物,以便从起点上获得方向上的差异?

cursorX -= accelerometerCalibrationY - getAccelerometerY();
cursorY += accelerometerCalibrationX - getAccelerometerX();
Run Code Online (Sandbox Code Playgroud)

这适用于桌子上的平板和一些起始位置.这些变量在开始时只是getAccelerometerXY.

android physics

12
推荐指数
1
解决办法
3038
查看次数

在类中有更多方法意味着对象在运行时使用更多内存

假设我有一个类ClassBig,里面有100个方法,第二个只有10个方法ClassSmall

当我在运行时有对象时


ClassBig big = new ClassBig();
ClassSmall small = new ClassSmall();

较大的类是否占用更多的内存空间?

如果两个类都包含相同的方法,那么较大的类是否需要更长的时间来执行它?

java

10
推荐指数
1
解决办法
920
查看次数

如果我让变量最终成功,事情会更快吗?

我正在为Android(Java)写作.

我正在声明int和float是持续循环的一部分.

声明后,其中一些不需要更改.

如果我在声明时将它们全部设置为最终,那么事情会更快吗?

[编辑]

感谢大家.我真的没想到它会做出任何改进,我只是注意到,在浏览了各种大型项目的来源之后,这是相当普遍的.干杯

java android

10
推荐指数
1
解决办法
997
查看次数

减少顶点缓冲区中的重复数据

我一次使用3个顶点缓冲区(实际上我有很多,但一次只使用3个).

它们包含在着色器中混合在一起以生成所需输出的信息 - 2D骨架动画.

有两个骨骼缓冲区,包含任何给定帧的骨骼的位置/旋转/比例.

有一个皮肤缓冲区,其中包含用于渲染纹理区域的顶点,就像它在世界原点一样,(0,0).

在着色器中,两个骨骼缓冲区与缓动值(作为一个整体传递)组合,然后通过变换外观顶点,将零件渲染在正确的位置.

这表现很好,并且在我开始的地方是一个很好的改进 - 我在GPU上计算了所有内容,并且只是传递了x/y/u/v坐标,我被限制为每帧都向GPU传输如此多的数据.

但是,有很多重复的信息.皮肤缓冲区仅包含它所需的内容,每个皮肤部分有4个顶点,每个顶点都是唯一的.

当它与骨骼结合时,每个骨骼顶点重复4次 - 以匹配皮肤缓冲区.在移动设备上工作,这是一个令人痛苦的事情,因为我的记忆力很低,让我感到非常沮丧.

如果只有一个骨骼,这就是缓冲区的外观.

骨缓冲液1

[x1,y1,rot1] [x1,y1,rot1] [x1,y1,rot1] [x1,y1,rot1]

骨缓冲液2

[x2,y2,rot2] [x2,y2,rot2] [x2,y2,rot2] [x2,y2,rot2]

皮肤缓冲

[xA,yA,uA,vA] [xB,yB,uB,vB] [xC,yC,uC,vC] [xD,yD,uD,vD]

我不会发布完整的着色器,因为那里有太多额外的东西(旋转和缩放工作类似):

attribute vec2 bonePosition1; // x1, y1
attribute vec2 bonePosition2; // x2, y2
attribute vec2 skinPosition; // xA (or xB .. ), yA (or yB .. )
uniform float a; // Some value 0..1 depending on time
...
vec2 bonePosition = mix(bonePosition1, bonePosition2, a); …
Run Code Online (Sandbox Code Playgroud)

opengl-es vbo opengl-es-2.0

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

这是"正确"的方法(if语句)

我有很多这些谎言,我想知道我是否会遇到任何麻烦 - 或性能问题.

我有方法A:


MyClass monkey;
...
if(monkey != null) {
 ...
}

或方法B:


boolean hasMonkey; //This is set to TRUE when monkey is not null
MyClass monkey;
...
if(hasMonkey) {
 ...
}

在功能层面上,它们都做同样的事情.现在,我正在使用方法A.这是一种糟糕的做事方式吗?哪个会表现得更好?

java android

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

使用OpenGL处理​​Activity生命周期的正确方法是什么

我真的在这里挣扎,而且它阻碍了我.

处理OpenGL的正确方法是什么,以及一个Activity - 它启动子活动,或者返回主屏幕.让它恢复到原来的位置.

我现在半工作,纹理/ VBO在需要时在onResume()重新加载.

但有时,当启动子活动并返回,或进入主屏幕并返回时,onCreate将再次被触发.这弄乱了整个事情,我最终得到了黑屏.

我确定我做错了.有人可以解释一个人应该如何处理这样的活动?

android opengl-es

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

使用MPI正确停止的方法

我正在使用MPI,并且在某些时候想要使用STOP(或其他方法),以退出程序并显示错误消息.

现在,我正在做这样的事情:

STOP 'Error'
Run Code Online (Sandbox Code Playgroud)

但我有一种感觉,我做错了什么.我需要先调用MPI_FINALIZE吗?还有其他事情要做吗?

fortran mpi

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

在OpenGL ES中优化骨架动画的顶点

所以我正在使用2D骨骼动画系统.

有X个骨骼,每个骨骼至少有一个部分(一个四边形,两个三角形).平均而言,我可能有20块骨头,30块.大多数骨骼依赖于父母,骨骼将每帧移动.每个动画总共有1000帧,我使用了大约50个动画.任何时候内存中总共加载大约50,000帧.这些部分在骨架的实例之间有所不同.

我采用的第一种方法是计算每个骨骼的位置/旋转,并为每个部分构建一个由此组成的顶点数组:

[x1,y1,u1,v1],[x2,y2,u2,v2],[x3,y3,u3,v3],[x4,y4,u4,v4]
Run Code Online (Sandbox Code Playgroud)

并通过每帧传递给glDrawElements.

看起来很好,涵盖了我需要的所有场景,不会占用太多内存,但却像狗一样表现.在iPod 4上,可能会获得15fps,其中10个骨架被渲染.

我发现大部分性能都是通过每帧复制如此多的顶点数据来消耗掉的.我决定转到另一个极端,并"预先计算"动画,在每个角色的开头建立一个顶点缓冲区,其中包含每个帧的xyuv坐标,每个部分都在一个字符中.然后,我计算应该用于特定时间的帧的索引,并计算增量值,该增量值被传递到用于在当前帧和下一帧XY位置之间进行插值的着色器.

每帧的顶点看起来像这样

[--------------------- Frame 1 ---------------------],[------- Frame 2 ------]
[x1,y1,u1,v1,boneIndex],[x2, ...],[x3, ...],[x4, ...],[x1, ...][x2, ...][....]
Run Code Online (Sandbox Code Playgroud)

顶点着色器如下所示:

attribute vec4 a_position;
attribute vec4 a_nextPosition;
attribute vec2 a_texCoords;
attribute float a_boneIndex;

uniform mat4 u_projectionViewMatrix;
uniform float u_boneAlpha[255];

varying vec2 v_texCoords;

void main() {
    float alpha = u_boneAlpha[int(a_boneIndex)];
    vec4 position = mix(a_position, a_nextPosition, alpha);
    gl_Position = u_projectionViewMatrix * position;
    v_texCoords = a_texCoords;  
}
Run Code Online (Sandbox Code Playgroud)

现在,性能非常好,其中10个在屏幕上,它可以舒适地以50fps的速度运行.但现在,它使用了一公吨的内存.我已经通过在xyuv上失去一些精确度来优化它,现在这些精确度很高.

还存在骨依赖性丢失的问题.如果有两个骨骼,父母和孩子,并且孩子的关键帧为0s和2s,则父级的关键帧为0s,0.5s,1.5s,2s,则子项不会在0.5s和0.5s之间更改. 1.5s应该如此.

我想出了一个解决方案来解决这个骨骼问题 - 通过强迫孩子在与父母相同的点上拥有关键帧.但是这会占用更多内存,并且基本上会杀死骨骼层次结构.

这就是我现在所处的位置.我试图在性能和内存使用之间找到平衡点.我知道这里有很多冗余信息(特定部分的所有帧的UV坐标都是相同的,所以重复约30次).并且必须为每组零件创建一个新的缓冲区(具有唯一的XYUV坐标 - 位置会发生变化,因为不同的零件尺寸不同)

现在我将尝试为每个字符设置一个顶点数组,其中包含所有部分的xyuv,并计算每个部分的矩阵,并在着色器中重新定位它们.我知道这会有效,但是我担心性能不会比仅仅为我在开始时做的每一帧上传XYUV更好.

有没有更好的方法来做到这一点而不会失去我获得的表现?

我可以尝试一些疯狂的想法吗?

opengl-es opengl-es-2.0 skeletal-animation

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

使用 proguard 删除日志调用会留下 StringBuilders

我有一个带有静态日志记录方法的类,例如:

我正在尝试使用 ProGuard 删除所有这些。我不想只是禁用它们(无论如何都是使用逻辑完成的),我希望它们在反编译时消失。

它成功删除了对我的日志记录方法的调用,但留下了连接的字符串。它完全删除了固定的字符串。

这是我的 ProGuard 设置:

-assumenosideeffects class com.mypackage.Log { *; }
Run Code Online (Sandbox Code Playgroud)

这是我的来源:

void doSomething(String name) {
    Log.verbose("Hello!");
    Log.verbose("My name is " + name);
    ...
}
Run Code Online (Sandbox Code Playgroud)

这是它反编译的结果:

void a(String a) {
    new StringBuilder("My name is ").append(a);
    ...
}
Run Code Online (Sandbox Code Playgroud)

这就是我希望它反编译为的内容:

void a(String a) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

对于此示例,假设名称参数稍后在方法中使用(即,不应完全优化它)。

我还应该使用assumenosideeffectsStringBuilder 吗?我确实在其他地方使用了 StringBuilders,我确实想保留它。那会把它们也从那里删除吗?

java proguard

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