ダブルバッファリングまたは過去に戻る。 パート2

良い一日!



はじめに



すでに1月4日であり、私の魂はまだ落ち着いていません。 そこで、私はJ2MEアプリケーションを書くというトピックを続けることにしました。 さらに、このトピックに深刻な関心を示した人もいました。 また、これらはHabrの一般ユーザーだけでなく、 読み取り専用アカウントでもありました。 まあ、大丈夫、トピックに近い。

文字通り、 トピックの公開直後に、非常に賢明なコメントがバーカーhabrayuzerから受け取られました。つまり、 commentは本質的に共通の真実であり、2番目のコメントは修正です。





今日は何について話しますか



今日は、 javax.microedition.lcdui.Canvasでのダブルバッファリングのプロセスと、 javax.microedition.lcdui.game.GameCanvasが作成された理由について説明します



ダブルバッファリングとは何ですか?



ダブルバッファリングは、2番目の(画面外)バッファを使用して図形やスプライトなどを描画し、その内容を画面にコピーする技術に過ぎません。 問題は、直接描画するとき、つまり 時間ごとに画面バッファーに直接描画すると、画面の再描画の時間間隔に適合せず( Canvasではこれはrepaint()関数によって行われます)、画面は単に「点滅」を開始します。 ユーザーには、この描画自体の中間結果が表示されます。 この手法を使用すると、開発者はこれらの「点滅」を回避できます。 ただし、 Canvasでは、この手法使用は自転車の構築プロセスです。 標準およびJ2MEプラットフォームの開発者はこれを考慮しませんでした。



Canvasのダブルバッファリング



Canvasの「ダブルバッファリング」プロセスは、画像( javax.microedition.lcduiパッケージのImageオブジェクト)をオフスクリーンバッファとして使用することで実現されます。 このように:

import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Graphics; /*      */ import javax.microedition.lcdui.Image; public class OurCanvas extends Canvas { Image img; //  Image Graphics buf; //  ,  int w; //   int h; //   public OurCanvas() { //  Lego w = getWidth(); //    h = getHeight(); //  //  ,   " "   //  ,           //   ,   Image if (!isDoubleBuffered()) { buffer = Image.createImage(w,h); } //     img buf = img.getGraphics(); } //     public void draw(Graphics g) { g.setColor(0xffffff); g.fillRect(0,0,w,h); g.setColor(0x111111); g.fillRect(25,25,125,125); g.setColor(0xababab); g.fillRect(70,60,70,60); } public void paint(Graphics g) { g.drawImage(0,0,w,h); //    draw(buf); //    } }
      
      







以上です。 コードには視覚的なコメント以上のものが含まれているため、コードを解析しても問題は発生しません。 ここでGameCanvasの 「ダブルバッファリング」を検討してください。



GameCanvasのダブルバッファリング



しばらく経ち、J2MEコンソーシアムはjavax.microedition.lcdui.gameパッケージを開発しました。このパッケージにはGameCanvasが含まれていましたが、これは同じCanvasでしたが、「ダブルバッファリング」問題が解決されました。 プログラマーはそれを気にする必要がなくなりました。 コードは次のようになります。

 import javax.microedition.lcdui.game.GameCanvas; import javax.microedition.lcdui.Graphics; /*      */ import javax.microedition.lcdui.Image; public class OurCanvas extends GameCanvas implements Runnable { Graphics buf; Thread t; int w; //   int h; //   public OurCanvas() { //   OurCanvas w = getWidth(); //    h = getHeight(); //  //     Graphics buf = getGraphics(); //   t = new Thread(this); } // let's draw public void run { g.setColor(0xffffff); g.fillRect(0,0,w,h); g.setColor(0x111111); g.fillRect(25,25,125,125); g.setColor(0xababab); g.fillRect(70,60,70,60); flushGraphics(); //     " " } }
      
      





ここでは、バッファについて心配する必要はありません-すべてがすぐに描画され、 flushGraphicsが呼び出されるとオフスクリーンバッファのすべてのコンテンツがスクリーンバッファにコピーされます。



それだけです



このレンダリングタスクはいくつかの行で解決されるという事実にもかかわらず、これは開発者が「泳ぐ」べきではないかなり重要なトピックです。 今日のレッスンが前回よりも有益であったことを願っています。 それだけです、休暇を取らせてください。



じゃあね!



コーヒーを飲み、Javaで書きます。





ポスト台本



Pastebinで確立された伝統に従ってソースコードを取得できます。

これが最初の例です。

そして、これが2番目です。



All Articles