我正在使用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中声明相同的结构,并编译,但值是错误的.
我正在使用加速度计在屏幕上以X/Y移动某些东西.
如果手机在桌子上平放,这很容易.
我想出了一些东西,试图能够从任何给定的位置开始,并从那里开始工作.但它似乎并不自然地起作用.
我如何校准事物,以便从起点上获得方向上的差异?
cursorX -= accelerometerCalibrationY - getAccelerometerY();
cursorY += accelerometerCalibrationX - getAccelerometerX();
Run Code Online (Sandbox Code Playgroud)
这适用于桌子上的平板和一些起始位置.这些变量在开始时只是getAccelerometerXY.
假设我有一个类ClassBig,里面有100个方法,第二个只有10个方法ClassSmall
当我在运行时有对象时
ClassBig big = new ClassBig();
ClassSmall small = new ClassSmall();
较大的类是否占用更多的内存空间?
如果两个类都包含相同的方法,那么较大的类是否需要更长的时间来执行它?
我正在为Android(Java)写作.
我正在声明int和float是持续循环的一部分.
声明后,其中一些不需要更改.
如果我在声明时将它们全部设置为最终,那么事情会更快吗?
[编辑]
感谢大家.我真的没想到它会做出任何改进,我只是注意到,在浏览了各种大型项目的来源之后,这是相当普遍的.干杯
我一次使用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) 我有很多这些谎言,我想知道我是否会遇到任何麻烦 - 或性能问题.
我有方法A:
MyClass monkey;
...
if(monkey != null) {
...
}
或方法B:
boolean hasMonkey; //This is set to TRUE when monkey is not null
MyClass monkey;
...
if(hasMonkey) {
...
}
在功能层面上,它们都做同样的事情.现在,我正在使用方法A.这是一种糟糕的做事方式吗?哪个会表现得更好?
我真的在这里挣扎,而且它阻碍了我.
处理OpenGL的正确方法是什么,以及一个Activity - 它启动子活动,或者返回主屏幕.让它恢复到原来的位置.
我现在半工作,纹理/ VBO在需要时在onResume()重新加载.
但有时,当启动子活动并返回,或进入主屏幕并返回时,onCreate将再次被触发.这弄乱了整个事情,我最终得到了黑屏.
我确定我做错了.有人可以解释一个人应该如何处理这样的活动?
我正在使用MPI,并且在某些时候想要使用STOP(或其他方法),以退出程序并显示错误消息.
现在,我正在做这样的事情:
STOP 'Error'
Run Code Online (Sandbox Code Playgroud)
但我有一种感觉,我做错了什么.我需要先调用MPI_FINALIZE吗?还有其他事情要做吗?
所以我正在使用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更好.
有没有更好的方法来做到这一点而不会失去我获得的表现?
我可以尝试一些疯狂的想法吗?
我有一个带有静态日志记录方法的类,例如:
我正在尝试使用 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,我确实想保留它。那会把它们也从那里删除吗?