【发布时间】:2019-11-04 14:04:40
【问题描述】:
我不确定我是否正确地进行了 3d 渲染?下面是我的 3d 渲染方法。当我在桌面上运行我的游戏时,它在 60fps 下运行良好,但当我在 android 上运行它时,它只在 15fps 下运行。当我注释掉这个方法时,我也得到了 60fps,所以我认为问题出在我的 3d 渲染代码中。
你能告诉我它是否正确吗?
private void draw3d() {
gameViewport.apply();
modelBatch.begin(gameCamera);
modelBatch.render(highwayInstance, environment);
modelBatch.render(highway2Instance, environment);
modelBatch.render(highwayLines, environment);
modelBatch.render(buttons, environment);
if (activeMetronomeFirsts.size != 0) {
int activeMetronomeFirstLength = activeMetronomeFirsts.size;
for (int i = activeMetronomeFirstLength; --i >= 0;) {
modelBatch.render(activeMetronomeFirsts.get(i).getMetronomeInstance(), environment);
}
}
if (activeMetronomes.size != 0) {
int activeMetronomeLength = activeMetronomes.size;
for (int i = activeMetronomeLength; --i >= 0;) {
modelBatch.render(activeMetronomes.get(i).getMetronomeInstance(),environment);
}
}
if (activeSnares.size != 0) {
int activeSnareLength = activeSnares.size;
for (int i = activeSnareLength; --i >= 0;) {
modelBatch.render(activeSnares.get(i).getSnareInstance(),environment);
//activeSnares.get(i).draw(modelBatch);
}
}
if (activeHiHats.size != 0) {
int activeHiHatLength = activeHiHats.size;
for (int i = activeHiHatLength; --i >= 0;) {
modelBatch.render(activeHiHats.get(i).getHiHatInstance(), environment);
}
}
if (activeTom1s.size != 0) {
int activeTom1Length = activeTom1s.size;
for (int i = activeTom1Length; --i >= 0;) {
modelBatch.render(activeTom1s.get(i).getTom1Instance(), environment);
}
}
if (activeRides.size != 0) {
int activeRideLength = activeRides.size;
for (int i = activeRideLength; --i >= 0;) {
modelBatch.render(activeRides.get(i).getRideInstance(), environment);
}
}
if (activeTom2s.size != 0) {
int activeTom2Length = activeTom2s.size;
for (int i = activeTom2Length; --i >= 0;) {
modelBatch.render(activeTom2s.get(i).getTom2Instance(), environment);
}
}
if (activeCrashs.size != 0) {
int activeCrashLength = activeCrashs.size;
for (int i = activeCrashLength; --i >= 0;) {
modelBatch.render(activeCrashs.get(i).getCrashInstance(), environment);
}
}
if (activeTom3s.size != 0) {
int activeTom3Length = activeTom3s.size;
for (int i = activeTom3Length; --i >= 0;) {
modelBatch.render(activeTom3s.get(i).getTom3Instance(), environment);
}
}
if (activeBasses.size != 0) {
int activeBassLength = activeBasses.size;
for (int i = activeBassLength; --i >= 0;) {
modelBatch.render(activeBasses.get(i).getBassInstance(), environment);
}
}
modelBatch.end();
}
【问题讨论】:
-
提供了你的方法,我找不到导致 FPS 下降的确切原因。为了诊断您的问题,您必须进行一些 GL 分析并查看它为您提供的值。阅读此内容以执行此操作:github.com/libgdx/libgdx/wiki/Profiling#OpenGL 欢迎您分享使用该方法与不使用该方法获得的值,这将有助于分析问题
-
我得到了这些值:
-
drawCalls: 55 shaderSwitches: 14 监听器: com.badlogic.gdx.graphics.profiling.GLErrorListener$1@2ef2bb8b textureBindings: 1 vertexCount: 55
-
好吧,虽然我不认为这是导致 FPS 下降的原因,但我会说着色器开关有点高。试试看:注释掉该方法中的每个渲染。现在取消注释第一个并检查它是否导致重大下降。如果不是,请尝试第二个,第三个等等...但是这些值不被认为是高的,因此问题可能与渲染无关
-
当我取消注释“modelBatch.render(highwayLines, environment);”时,我得到 54-57fps,如果我取消注释“modelBatch.render(buttons, environment);”我得到 30-32fps 等等。我取消注释的渲染方法越多,得到的 fps 越低