0

谢谢您的回复。下面是一个没有纹理的 java/windows 版本,只是为了打折任何与 Android 相关的问题。我按照建议修改了 Move() 并且精灵仍然很紧张。毕竟它只有 1 个四边形,它看起来应该让丝绸光滑 - 不是很密集。

import java.awt.Frame;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.awt.GLCanvas;
import javax.media.opengl.fixedfunc.GLMatrixFunc;
import javax.media.opengl.glu.GLU;

import com.jogamp.opengl.util.Animator;

public class Practice implements GLEventListener, MouseMotionListener {

    static GLCanvas canvas = new GLCanvas();
    static Animator anim = new Animator(canvas);
    static Frame frame = new Frame();
    private GLU glu;
    private FloatBuffer vertBuff;
    private ByteBuffer indBuff;
    private static float[] color = new float[]{1,1,1,1};
    private static float xpos;
    private static float vel = 100f;
    private static long lastTime = -1;

    @Override
    public void display(GLAutoDrawable drawable) {
        GL2 gl = drawable.getGL().getGL2();
        gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);

        gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);
        gl.glVertexPointer(3,GL2.GL_FLOAT,0,vertBuff);

        gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW);
        gl.glLoadIdentity();
        gl.glColor4fv(color,0);
        Move(gl);
        gl.glDrawElements(GL2.GL_TRIANGLES,6,GL2.GL_UNSIGNED_BYTE,indBuff);

    }

    private void Move(GL2 gl){

        long time = System.currentTimeMillis();
        long timeStep = 0;
        if(lastTime != -1){
            timeStep = time - lastTime;
        }
        if(timeStep < 20){
            try {Thread.sleep(20-timeStep);} catch (InterruptedException e) {e.printStackTrace();}
        }
        lastTime = time;

        xpos += vel * timeStep/1000f;
        if(xpos>500){
            xpos = 500;
            vel *= -1;  
        }
        if(xpos<-500){
            xpos = -500;
            vel *= -1;  
        }
        gl.glTranslatef(xpos,0.0f,0.0f);
        gl.glScalef(50.0f,50.0f,1.0f);
    }

    @Override
    public void dispose(GLAutoDrawable arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void init(GLAutoDrawable drawable) {
        GL2 gl = drawable.getGL().getGL2();

        gl.glClearColor(0,0,0,1);
        glu = new GLU();

        float[] verts =     {
                                -0.5f, -0.5f, -1.0f,
                                0.5f, -0.5f, -1.0f,
                                0.5f, 0.5f, -1.0f,
                                -0.5f, 0.5f, -1.0f
                            };
        byte[] inds =       {
                                0,1,3, 1,2,3
                            };

        ByteBuffer  bb = ByteBuffer.allocateDirect(48);
        bb.order(ByteOrder.nativeOrder());
        vertBuff = bb.asFloatBuffer();
        vertBuff.put(verts);
        vertBuff.position(0);

        indBuff = ByteBuffer.allocateDirect(6);
        indBuff.order(ByteOrder.nativeOrder());
        indBuff.put(inds);
        indBuff.position(0);

    }

    @Override
    public void reshape(GLAutoDrawable drawable, int x, int y, int width,
            int height) {
        GL2 gl = drawable.getGL().getGL2();
        if(height <=0)height=1;
        float aspect = (float)width/height;
        gl.glMatrixMode(GLMatrixFunc.GL_PROJECTION);
        gl.glLoadIdentity();
        float[] ortho = {
                            (float)1/width,0,0,0,
                            0,(float)1/width*aspect,0,0,
                            0,0,1,0,
                            0,0,0,1
                        };
        //gl.glLoadMatrixf(ortho,0);
        glu.gluOrtho2D(-width,width,-height,height);
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseMoved(MouseEvent e) {
        // TODO Auto-generated method stub
        float R = (float)1/frame.getWidth()*e.getX();
        float B = (float)1/frame.getHeight()*e.getY();
        color = new float[]{R,.2f,B,1.0f};
    }

    public static void close(){
        anim.stop();
        frame.dispose();
        System.exit(0);
    }

    public static void main(String[] args) {
        canvas.addGLEventListener(new Practice());
        canvas.addMouseMotionListener(new Practice());

        frame.add(canvas);
        frame.setSize(500,300);

        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e){
                close();
            };
        });

        frame.setVisible(true);
        anim.start();
        canvas.requestFocus();
    }

}
4

3 回答 3

0

试过这个(Viewpad 10s,VegaComb 3.2);它大部分时间运行平稳,但每 3 秒就会出现一次明显的故障。与GC没有任何关系。我把所有静态的东西都移到onSurfaceCreated了几乎没有影响的地方。代码中没有任何内容可以解释这种行为。

( GLES20TriangleRendererAPI-Demos) 运行更流畅,但也会出现故障。请注意,这个示例做了更多的工作,但仍然没有任何东西可以解释任何帧时间问题。该Kube示例(旋转 Rubics Cube)似乎没有故障,也许这是一个感知问题。

我认为没有任何办法可以解决这个问题。

于 2012-04-26T04:19:41.500 回答
0

您可能会发现绘制始终与像素边界对齐的精灵很有帮助,否则,如果它位于随机子像素位置,则每帧的采样结果将有所不同,从而使您的纹理外观略有不同(这可以解释为闪烁)。

最简单的方法是使用 gluOrtho 来匹配您的视口宽度和高度(即gluOrtho2D(0,width,0,height),然后仅在整数位置绘制精灵。如果您想保留“-5 到 5”投影矩阵,您将拥有进行数学计算以找出如何将精灵纹素与屏幕像素完全对齐。

另一种选择可能是尝试从LINEAR采样更改为NEAREST采样,这可能会有所帮助,但如果 GPU 中存在一些舍入误差,可能仍会偶尔闪烁。

于 2012-04-26T02:05:07.067 回答
0

在 HTC Desire S 上对其进行了测试。除了偶尔出现故障外,工作正常。

仍然限制帧率可以使它更好。您可以将“移动”方法更改为:

long lastTime = -1;
private void Move(GL10 gl) {
    gl.glTranslatef(xpos,0.0f,0.0f);

    long time = System.currentTimeMillis();
    long timeStep = 0;
    if(lastTime != -1){
        timeStep = time - lastTime;
    }
    if(timeStep < 20){
        try {Thread.sleep(20-timeStep);} catch (InterruptedException e) {e.printStackTrace();}
    }
    lastTime = time;

    xpos += vel * timeStep/1000.0f;
    if(xpos>5*aspect){
        xpos = 5*aspect;
        vel *= -1;  
    }
    if(xpos<-5*aspect){
        xpos = -5*aspect;
        vel *= -1;  
    }
}
于 2012-04-26T09:07:21.493 回答