java - Android - 游戏循环中的主动渲染?

标签 java android canvas view rendering


在 Android 上的游戏循环中渲染的最佳方式是什么?
当我用 java 渲染时,我知道如何做到这一点。我创建缓冲区策略,然后绘制图形、绘制、处理和翻转缓冲区。 Andorid 有类似的东西吗?

我查看了 View ,但当我尝试绘制很多内容时,它无法正常工作。我研究了 SurfaceView,但我不明白如何刷新它上面的绘图。 invalidate 会破坏循环,postInvalidate 不起作用。我锁定 Canvas 并在其上绘图,然后从表面 View 解锁并发布“创建”方法(在循环中锁定 Canvas 不起作用,仅在应用程序中出现白屏)。所以我不明白。
在 Android 中进行大量渲染的最有效方法是什么?

最佳答案

在 SurfaceView 中渲染的常见方法是通过其 SurfaceHolder .

通常您会得到 Canvas穿过支架并在其上绘画:

 SurfaceHolder surfaceHolder = surfaceView.getHolder();
 Canvas canvas = surfaceHolder.getSurface().lockCanvas();

 //draw in the canvas
 canvas.drawPoint(...);

 surfaceHolder.unlockCanvasAndPost(canvas);

正确的做法是在单独的线程(渲染线程)中循环lockCanvas() 和unlockCanvasAndPost() 之间的所有代码(含)并控制循环内使用 Thread.sleep() 的帧率。

编辑:

控制渲染线程 FPS 的方法有很多种,这是基本方法,只需将所需的 FPS 设置为常量即可:

public class RenderThread extends Thread {
  private boolean running;
  private final static int MAX_FPS = 30;    
  private final static int FRAME_PERIOD = 1000 / MAX_FPS;   

  @Override
  public void run() {
    long beginTime;
    long timeDiff;
    int sleepTime;

    sleepTime = 0;

    while (running) {
        beginTime = System.currentTimeMillis();

        //RENDER

        // How long did the render take
        timeDiff = System.currentTimeMillis() - beginTime;
        // calculate sleep time
        sleepTime = (int)(FRAME_PERIOD - timeDiff);

        if (sleepTime > 0) {
            try {
                Thread.sleep(sleepTime);    
            } catch (InterruptedException e) {}
        }
     }
   }
}

有很多references如果您搜索游戏循环。

关于java - Android - 游戏循环中的主动渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30945653/

相关文章:

java - JAAS,从容器外部进行登录

java - 如何跨不同设备缩放自定义 View

android - "match_parent"自 Android SDK 版本 18 起有时行为不正确

android - 使用没有edittext android的customview获取输入文本

java - 正则表达式用空格替换部分字符串

java - 使用 Java8 Base64 解码器的 IllegalArgumentException

java - 项目在嵌入式 Tomcat 中启动,但不能在完整的 Tomcat 中运行

android - 如何在android中使用广播接收器获取应用程序的包名称?

Javascript canvas.toDataUrl() 将图片发送到新窗口中的 <img> 元素

javascript - 为什么我在 Canvas 上创建的矩形没有放在正确的位置?