Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java libgdx在android上测试时闪烁,但桌面版本没有问题_Java_Libgdx - Fatal编程技术网

Java libgdx在android上测试时闪烁,但桌面版本没有问题

Java libgdx在android上测试时闪烁,但桌面版本没有问题,java,libgdx,Java,Libgdx,我的项目在桌面版上运行得非常好,但在android上测试时,它一直在闪烁 我对此做了大量的研究,显然这个问题会导致双缓冲。但我仍然找不到任何解决办法。有一个人建议使用“渲染到纹理”,但我找不到任何关于libgdx的例子 我想知道是否有办法解决这个问题 如果你想知道我的代码,我有一个draw spritebatch在渲染函数的外面,我必须这样做才能符合我的游戏逻辑,这就是使用双缓冲的原因 public void create(){ ... Gdx.graphics.setContinuou

我的项目在桌面版上运行得非常好,但在android上测试时,它一直在闪烁

我对此做了大量的研究,显然这个问题会导致双缓冲。但我仍然找不到任何解决办法。有一个人建议使用“渲染到纹理”,但我找不到任何关于libgdx的例子

我想知道是否有办法解决这个问题

如果你想知道我的代码,我有一个draw spritebatch在渲染函数的外面,我必须这样做才能符合我的游戏逻辑,这就是使用双缓冲的原因

public void create(){
...
    Gdx.graphics.setContinuousRendering(false);
    Gdx.graphics.requestRendering();

}

public void render() {      

    batch.begin();
    drawBoard();
    player();

    batch.end();

}
如果我的玩家功能检查谁的回合(玩家1/2),然后检查合法的移动,然后根据该动作绘制精灵牌

public void player(){
    clickX=Gdx.input.getX();
    clickY=(Gdx.input.getY()-Gdx.graphics.getHeight())*-1;


            if(turn==true){
                player = "player1";
                if(Gdx.input.isTouched()){

                        //System.out.println("avalible");

                        if(rect.isEmpty()){
                            batch.setColor(Color.WHITE);
                            addLineNew(clickX, clickY);
                            plr1++;
                            System.out.println(plr1);
                            turn=false;

                        }else {
                            for (int i=0; i<rect.size(); i++){
                                if(rect.get(i).contains(clickX, clickY)){
                                    System.out.println("line exsit");
                                    break;
                                }else{
                                    batch.setColor(Color.WHITE);
                                    tempScore = score1;
                                    turnC=added.size();
                                    addLineNew(clickX,clickY);
                                    System.out.println("rect size "+rect.size());
                                    if(turnC>added.size()){
                                    calculateScore();
                                    }
                                    plr1++;
                                    System.out.println(plr1);
                                    if (score1>tempScore){
                                        turn=true;
                                    }else if (turnC>added.size()){
                                    turn=false;
                                    }else{
                                        turn=true;
                                    }
                                    break;
                                }
                            }
publicsvoid播放器(){
clickX=Gdx.input.getX();
clickY=(Gdx.input.getY()-Gdx.graphics.getHeight())*-1;
if(turn==true){
player=“player1”;
if(Gdx.input.isTouched()){
//系统输出打印项次(“可用”);
if(rect.isEmpty()){
batch.setColor(颜色为白色);
addLineNew(单击X,单击Y);
plr1++;
系统输出打印LN(plr1);
转向=假;
}否则{
对于(int i=0;iadded.size()){
计算核心();
}
plr1++;
系统输出打印LN(plr1);
如果(分数1>临时分数){
转身=真;
}else if(turnC>added.size()){
转向=假;
}否则{
转身=真;
}
打破
}
}
这是给玩家的,玩家1和玩家2差不多

public void addLineNew(float x, float y){
    float clickx=x;
    float clicky=y;
    outterLoop:
    for (int i=0; i<added.size(); i++){

            for(int j=0; j<Xpoints.length; j++){
                if(added.get(i).contains(clickx, clicky) && added.get(i).x==Xpoints[j]+16){
                    batch.draw(lineH, added.get(i).x, added.get(i).y, sizeH.x, sizeH.y);
                    rect.add(added.get(i));
                    added.remove(i);
                    System.out.println("sizz///"+added.size());
                    break outterLoop;
                }
                else if (added.get(i).contains(clickx, clicky) && added.get(i).x==Xpoints[j]){
                    batch.draw(line, added.get(i).x, added.get(i).y, sizeV.x, sizeV.y);
                    rect.add(added.get(i));
                    added.remove(i);
                    System.out.println("sizz///"+added.size());
                    break outterLoop;
                }
                else{
                    System.out.println("line is not availble play again");

                }
            }
public void addLineNew(浮点x,浮点y){
浮动点击x=x;
浮动y=y;
外环:
因为(inti=0;i你做错了什么事。:)
试着用水桶和雨滴创建演示项目,看看它是否也有闪烁的屏幕

如果它也闪烁,那么你应该在其他手机/平板电脑上试用你的应用程序

但如果没有,则将演示中的主要渲染步骤(及其顺序)与应用程序进行比较


当我绝望的时候,我会从工作代码开始,然后一个接一个地和平地修改它,直到它与不工作的代码完全相同,或者实际上在某个时候它会停止工作,这样你就会知道你最后修改了什么。

我也试着把player()的内容放到在渲染函数内部,但仍然闪烁ingafaik双缓冲实际上应该防止闪烁,默认情况下它应该可以工作(我从来没有任何闪烁问题).你使用vSync吗?不,我没有使用它..它能解决问题吗?可能,它只是一个开始配置,只对桌面可用,但你可以尝试。如果它没有帮助,你应该向我们展示更多的代码,对闪烁进行更详细的描述。正如我所说,我没有做任何特殊的魔术,我也没有闪烁桌面工作非常好闪烁只在android上出现似乎有三帧,每次点击都会显示其中一帧代码很长我会在问题中添加其他部分