<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Java究竟怎么玩?

      天地程序已定棋,人間大數待變局

        博客園  :: 首頁  :: 新隨筆  :: 聯系 :: 訂閱 訂閱  :: 管理
       FPS:即幀 /秒(frames per second)的縮寫,也稱為幀速率。是指1秒鐘時間里刷新的圖片的幀數,也可以理解為圖形處理器每秒鐘能夠刷新幾次。如果具體到手機上就是指每秒鐘能夠 播放(或者錄制)多少格畫面。同時越高的幀速率可以得到更流暢、更逼真的動畫。每秒鐘幀數(fps)越多,所顯示的動作就會越流暢。

      在絕大多數圖形程序中(以游戲類為典型),執行效率都以FPS作為評估標準。

      由于目前JAVA方面缺少相關用例,故完成功能如下圖(在本機測試中,最大fps設定為500,實際達到FPS效率在IDE中280左右,單獨運行380左右,受系統配置等因素影響):

      代碼如下:(請變更文件后綴為jar)



      FPS相關操作代碼如下:
      package org.test;

      import java.text.DecimalFormat;

      /**
       * <p>Title: LoonFramework</p>
       * <p>Description:</p>
       * <p>Copyright: Copyright (c) 2007</p>
       * <p>Company: LoonFramework</p>
       * 
      @author chenpeng  
       * @email:ceponline@yahoo.com.cn 
       * 
      @version 0.1
       
      */

      public class FPSListen {
          
      //設定動畫的FPS楨數,此數值越高,動畫速度越快。
          public static final int FPS = 500;  

          
      // 換算為運行周期
          public static final long PERIOD = (long) (1.0 / FPS * 1000000000); // 單位: ns(納秒)

          
      // FPS最大間隔時間,換算為1s = 10^9ns
          public static long FPS_MAX_INTERVAL = 1000000000L// 單位: ns
          
          
      // 實際的FPS數值
          private double nowFPS = 0.0;
          
          
      // FPS累計用間距時間
          private long interval = 0L// in ns
          private long time;

          
      //運行楨累計
          private long frameCount = 0;
          
          
      //格式化小數位數
          private DecimalFormat df = new DecimalFormat("0.0");
       
          
      //開啟opengl
          public void opengl(){
              System.setProperty(
      "sun.java2d.opengl""True");
              System.setProperty(
      "sun.java2d.translaccel""True");
          }

          

          
          
      /**
           * 制造FPS數據
           * 
           
      */

          
      public void makeFPS() {
              frameCount
      ++;
              interval 
      += PERIOD;

              
      //當實際間隔符合時間時。
              if (interval >= FPS_MAX_INTERVAL) {
                  
      //nanoTime()返回最準確的可用系統計時器的當前值,以毫微秒為單位
                  long timeNow = System.nanoTime();
                  
      // 獲得到目前為止的時間距離
                  long realTime = timeNow - time; // 單位: ns

                  
      //換算為實際的fps數值
                  nowFPS = ((double) frameCount / realTime) * FPS_MAX_INTERVAL;
                  
      //變更數值
                  frameCount = 0L;
                  interval 
      = 0L;
                  time 
      = timeNow;
              }

          }

          
      public long getFrameCount() {
              
      return frameCount;
          }

          
      public void setFrameCount(long frameCount) {
              
      this.frameCount = frameCount;
          }

          
      public long getInterval() {
              
      return interval;
          }

          
      public void setInterval(long interval) {
              
      this.interval = interval;
          }

          
      public double getNowFPS() {
              
      return nowFPS;
          }

          
      public void setNowFPS(double nowFPS) {
              
      this.nowFPS = nowFPS;
          }

          
      public long getTime() {
              
      return time;
          }

          
      public void setTime(long time) {
              
      this.time = time;
          }

          
      public String getFPS(){
              
      return df.format(nowFPS);
          }


      }




      球體類代碼如下:
      package org.test;

      import java.awt.Color;
      import java.awt.Graphics;

      /**
       * <p>Title: LoonFramework</p>
       * <p>Description:</p>
       * <p>Copyright: Copyright (c) 2007</p>
       * <p>Company: LoonFramework</p>
       * 
      @author chenpeng  
       * @email:ceponline@yahoo.com.cn 
       * 
      @version 0.1
       
      */

      public class Ball {
              
      private static final int SIZE = 10;
              
      private int x, y;
              
      protected int vx, vy;

              
      public Ball(int x, int y, int vx, int vy) {
                  
      this.x = x;
                  
      this.y = y;
                  
      this.vx = vx;
                  
      this.vy = vy;
              }


              
      public void move() {
                  x 
      += vx;
                  y 
      += vy;
                  
      if (x < 0 || x > BallPanel.WIDTH - SIZE) {
                      vx 
      = -vx;
                  }

                  
      if (y < 0 || y > BallPanel.HEIGHT - SIZE) {
                      vy 
      = -vy;
                  }

              }


              
      public void draw(Graphics g) {
                  g.setColor(Color.RED);
                  g.fillOval(x, y, SIZE, SIZE);
              }

          

      }





      FPS及球體處理用代碼如下:
      package org.test;

      import java.awt.Color;
      import java.awt.Dimension;
      import java.awt.Frame;
      import java.awt.Graphics;
      import java.awt.Image;
      import java.awt.Panel;
      import java.awt.event.WindowAdapter;
      import java.awt.event.WindowEvent;
      import java.awt.image.BufferedImage;
      import java.util.Random;


      /**
       * <p>
       * Title: LoonFramework
       * </p>
       * <p>
       * Description:以JAVA獲取FPS用演示程序及隨機生成亂數球體。(更優化代碼內置于loonframework-game框架中)
       * </p>
       * <p>
       * Copyright: Copyright (c) 2007
       * </p>
       * <p>
       * Company: LoonFramework
       * </p>
       * 
       * 
      @author chenpeng
       * @email:ceponline@yahoo.com.cn
       * 
      @version 0.1
       
      */

      public class BallPanel extends Panel implements Runnable {

          
      /**
           * 
           
      */

          
      private static final long serialVersionUID = 1L;

          
      public static final int WIDTH = 360;

          
      public static final int HEIGHT = 360;

          
      // 設定最大球體數量
          private static final int NUM_BALLS = 50;

          
      // 定義球體數組
          private Ball[] ball;

          
      // 運行狀態
          private volatile boolean running = false;

          
      private Thread gameLoop;

          
      // 緩存用圖形
          private Graphics bg;

          
      private Image screen = null;

          
      // 生成隨機數
          private Random rand;

          
      // fps監聽
          private FPSListen fps = null;

          
      public BallPanel() {
              setPreferredSize(
      new Dimension(WIDTH, HEIGHT));
              screen 
      = new BufferedImage(WIDTH, HEIGHT, 1);
              bg 
      = screen.getGraphics();
              fps 
      = new FPSListen();
              
      //fps.opengl();
              
      // 以當前毫秒生成隨機數
              rand = new Random(System.currentTimeMillis());
              ball 
      = new Ball[NUM_BALLS];
              
      // 初始化球體參數
              for (int i = 0; i < NUM_BALLS; i++{
                  
      int x = rand.nextInt(WIDTH);
                  
      int y = rand.nextInt(HEIGHT);
                  
      int vx = rand.nextInt(10);
                  
      int vy = rand.nextInt(10);
                  ball[i] 
      = new Ball(x, y, vx, vy);
              }

          }


          
      // 加入Notify
          public void addNotify() {
              
      super.addNotify();
              
      // 判斷循環條件是否成立
              if (gameLoop == null || !running) {
                  gameLoop 
      = new Thread(this);
                  gameLoop.start();
              }

          }


          
      /**
           * 進行線程運作。
           
      */

          
      public void run() {
              
      long beforeTime, afterTime, timeDiff, sleepTime;
              
      long overSleepTime = 0L;
              
      int noDelays = 0;
              
      // 獲得精確納秒時間
              beforeTime = System.nanoTime();
              fps.setTime(beforeTime);
              running 
      = true;
              
      while (running) {
                  gameUpdate();
                  repaint();
                  afterTime 
      = System.nanoTime();
                  timeDiff 
      = afterTime - beforeTime;
                  
      // 換算間隔時間
                  sleepTime = (FPSListen.PERIOD - timeDiff) - overSleepTime;
                  
      if (sleepTime > 0{
                      
      // 制造延遲
                      try {
                          Thread.sleep(sleepTime 
      / 1000000L); // nano->ms
                      }
       catch (InterruptedException e) {
                      }

                      
      // 獲得延遲時間
                      overSleepTime = (System.nanoTime() - afterTime) - sleepTime;
                  }
       else {
                      
      // 重新計算
                      overSleepTime = 0L;
                      
      // 判斷noDelays值
                      if (++noDelays >= 16{
                          Thread.yield(); 
      // 令線程讓步
                          noDelays = 0;
                      }

                  }


                  
      // 重新獲得beforeTime
                  beforeTime = System.nanoTime();

                  
      // 制造FPS結果
                  fps.makeFPS();
              }


          }


          
      /**
           * 變更球體軌跡
           * 
           
      */

          
      private void gameUpdate() {
              
      for (int i = 0; i < NUM_BALLS; i++{
                  ball[i].move();
              }

          }


          
      /**
           * 變更圖形
           
      */

          
      public void update(Graphics g) {
              paint(g);
          }


          
      /**
           * 顯示圖形
           
      */

          
      public void paint(Graphics g) {

              
      // 設定背景為白色,并清空圖形
              bg.setColor(Color.WHITE);
              bg.fillRect(
      00, WIDTH, HEIGHT);

              
      // FPS數值顯示
              bg.setColor(Color.BLUE);
              bg.drawString(
      "FPS: " + fps.getFPS(), 416);

              
      // 分別繪制相應球體
              for (int i = 0; i < NUM_BALLS; i++{
                  ball[i].draw(bg);
              }

              g.drawImage(screen, 
      00this);
              g.dispose();
          }


          
      public static void main(String[] args) {

              Frame frm 
      = new Frame();
              frm.setTitle(
      "Java FPS速度測試(由Loonframework框架提供)");
              frm.setSize(WIDTH, HEIGHT
      +20);
              frm.setResizable(
      false);
              frm.add(
      new BallPanel());
              frm.setVisible(
      true);
              frm.addWindowListener(
      new WindowAdapter(){
                  
      public void windowClosing(WindowEvent e){
                      System.exit(
      0);
                  }

              }
      );
          }


      }


      posted on 2007-10-17 11:19  cping  閱讀(472)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 色吊丝中文字幕在线观看| 国产精品国产高清国产专区| 99热精品毛片全部国产无缓冲| 国产系列丝袜熟女精品视频 | 国产av一区二区三区精品| 最新偷拍一区二区三区| 祥云县| 亚洲一区二区三午夜福利| 国产精品剧情亚洲二区| 少妇和邻居做不戴套视频| 国产欧美精品一区二区三区-老狼| 麻豆一区二区三区香蕉视频| 亚洲日韩乱码中文无码蜜桃| 中文国产不卡一区二区| 闽侯县| 老熟妇国产一区二区三区 | 亚洲v欧美v日韩v国产v| 久久久久久亚洲精品a片成人| 成人福利国产午夜AV免费不卡在线| 正在播放酒店约少妇高潮| 国产精品推荐视频一区二区 | 最新国产AV最新国产在钱 | 亚洲中文字幕人妻系列| 国产短视频精品一区二区| 久久亚洲中文字幕伊人久久大 | 国产成人免费一区二区三区| 三上悠亚精品一区二区久久| 亚洲a∨无码一区二区三区| 不卡一区二区三区在线视频| 一区二区三区精品偷拍| 插插无码视频大全不卡网站| 久久综合伊人| 欧美一区二区三区成人久久片| 国产精品一区二区三区卡| 麻豆亚洲精品一区二区| 亚洲蜜臀av乱码久久| 国产精品美女一区二三区| 国产在线视频导航| 亚洲第一视频区| 精品无码一区二区三区在线 | 欧美 日韩 国产 成人 在线观看|