我目前有一个空白的LibGDX
应用程序,什么都不做.它不会呈现任何内容,也不会更新任何内容.这只是空洞的Screen
.当我将应用程序部署到android时,我遇到了一些可怕的内存消耗.使用DDMS我在我的设备上运行应用程序时创建以下堆转储:
内存最重要的用途是13.163 MB 1字节数组分配.这不是堆的一半吗?!
我检查了分配,发现没有任何指向分配的大小:
现在使用Eclipse MAT我分析堆转储:
因此,内存的高使用率仍来自byte []数组.进一步分析byte []部分我想出了这个:
我现在看到巨大的byte []分配来自android图形.我甚至没有画任何东西!有什么方法可以避免让这个应用程序的Android图形部分占用一半的堆.这只会导致过多的垃圾收集在事情真正发生时发生,或者这是正常的,我只需要处理它?
注意:我在带有libGDX 1.4版的三星Galaxy S4上运行它(或者不管最新版本是什么)
更新:我没有发现应用程序的14-13MB字节数组分配是正常的,但我仍然有问题.我的堆大小太小了.如果Android图形占据了我的堆的一半,我几乎没有任何有用的空间,垃圾收集器变得疯狂.在我使用旧版本的libgdx创建的另一个应用程序(一个无可否认的编码较差的应用程序),堆大小为73 Mb.如何增加堆大小?我认为73 Mb相当大,你可以看到它的大部分都没用过.以下是旧应用程序的堆统计信息:
当我试图弄清楚如何使用缓冲区策略时,整体上只是改进了我编写代码和清理内容的方式.当我运行以下代码时,我在"createBufferStrategy(3)"时出错
package Game1Test;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.io.IOException;
import javax.swing.*;
public class Base extends Canvas implements Runnable{
private static final long serialVersionUID = 1L;
private boolean running = false;
int ticks = 0;
public Base(JFrame f) {
setSize(f.getWidth(),f.getHeight());
start();
}
public void start(){
running = true;
new Thread(this).start();
}
public void stop(){
}
public void run(){
while(running){
ticks++;
System.out.println(ticks);
render();
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void render(){ …
Run Code Online (Sandbox Code Playgroud) 我不小心删除了eclipse中的"Create new Class"按钮.如何将其重新放回顶部工具栏?我查看了所有菜单,但我找不到这样做的选项.
谢谢
每次我尝试在Android Studio中运行我的桌面项目时,我立即收到以下错误:
Error:com.android.tools.idea.gradle.util.Projects.lastGradleSyncFailed(Lcom/intellij/openapi/project/Project;)Z
Run Code Online (Sandbox Code Playgroud)
没有发生gradle构建或任何类型的同步.Android Studio直接跳转到此错误.
我已经重启/无效缓存,我已经在项目和家庭位置删除了我的.gradle文件夹,我重新安装了android studio,我创建了一个新项目,但我仍然得到同样的错误.
当我手动运行gradle构建时,构建成功完成.我甚至可以毫无问题地运行Android项目.只是桌面项目给我带来了麻烦.
任何建议将不胜感激.
我使用的是最新版本的android gradle(2.3.0),而我的JDK是正确的版本(1.8).
我在更新到Android Studio 2.3后收到此错误.
为了澄清,Gradle构建/同步完成了SUCCESSFULLY.
我正在使用瓷砖制作java游戏.我遇到了碰撞元件的问题.我为地图上的每个图块定义矩形,为播放器定义另一个矩形.我遇到麻烦的是知道玩家在撞到矩形时从哪一边来,然后按照玩家来自的方向推动玩家.我已经创建了一个方法来检查字符在矩形内的多少,因此它可以知道将它推出多少,但我无法弄清楚如何判断字符来自哪一方.
这是我当前的碰撞方法 - 注意rect1是字符,rect2是tile
public void collision(Rectangle rect1, Rectangle rect2) {
float xAdd;
float xAdd2;
float yAdd;
float yAdd2;
boolean hitRight = false;
boolean hitLeft = false;
boolean hitTop = false;
boolean hitBot = false;
Vector2f rect1Origin = new Vector2f(rect1.x, rect1.y);
Vector2f rect2Origin = new Vector2f(rect2.x, rect2.y);
Vector2f rect1Mid = new Vector2f((rect1.x + rect1.width) / 2,(rect1.y + rect1.height) / 2);
Vector2f rect2Mid = new Vector2f((rect2.x + rect2.width) / 2,(rect2.y + rect2.height) / 2);
Vector2f rect1A = new Vector2f(rect1Origin.x + rect1.width, …
Run Code Online (Sandbox Code Playgroud) 每当我绘制一个边缘有alpha的纹理(它被photoshop消除锯齿)时,这些边缘就会变暗.我无休止地使用纹理滤镜和混合模式,但没有成功.
这就是我的意思:
minFilter: Linear magFilter: Linear
minFilter: MipMapLinearNearest magFilter: Linear
minFilter: MipMapLinearLinear magFilter: Linear
正如您所看到的,更改libGDX Texture Packer上的过滤器会对事物的外观产生很大影响,但alpha 仍然很暗.
我尝试在libgdx中手动设置纹理过滤器:
texture.setFilter(minFilter, magFilter);
Run Code Online (Sandbox Code Playgroud)
但这不起作用.
我已经读过使用线性滤波器进行缩减会导致alpha像素默认为黑色?如果是这种情况,我该如何避免呢?
我也试过改变混合模式:glBlend(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_APHA)
没有区别.glBlend(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
完全删除alpha,这样就不起作用了.
我不希望我的设置minFilter
要Nearest
因为它使事情看起来非常像素化.我已经尝试了所有其他纹理滤镜组合,但所有内容都会产生相同的黑/暗边/轮廓效果.
我想要做的是创建一个方法,它有一个字符串和一个字符作为参数,然后该方法接受字符串并搜索给定的字符.如果字符串包含该字符,则返回字符所在的整数数组.这是我到目前为止:
public class Sheet {
public static void main(String[] args) {
String string = "bbnnbb";
String complete = null;
//*******
for(int i = 0; i < string.length(); i++){
complete = StringSearch(string,'n').toString();
}
//********
}
public static int[] StringSearch(String string, char lookfor) {
int[]num = new int[string.length()];
for(int i = 0; i < num.length; i++){
if(string.charAt(i)== lookfor){
num[i] = i;
}
}
return num;
}
Run Code Online (Sandbox Code Playgroud)
}
该方法工作正常,并返回此:
0
0
2
3
0
0
Run Code Online (Sandbox Code Playgroud)
我想做的是将它们变成1个字符串,所以它看起来像这个"002300".有没有办法做到这一点?我试图在代码的星号区域中做到这一点,但我没有成功.