為什么很多游戲要加入Loading滾動條呢?加入Loading狀態并不是為了使軟件顯得更專業美觀,而是為了保證程序的運行內存不溢出。通常計算機/手機的存儲系統分為:cup 的緩存,磁盤(或者手機中的存儲用的的Flash RAM或者其他類型的可以持久保存的存儲系統),運行內存。我們知道通常NOKIA S40的heap size為200KB大小,而通常我們加入程序和3張128*128的圖片之后內存就趨于崩潰了,再加入聲音和地圖,程序的運算內存就顯得太不夠了。一般來講,很多游戲僅僅在運行的時候把所有的資源一次性讀入heap memory這樣,我們在模擬器看到程序運行的狀況就非常接近崩潰的邊緣,如果不小心加入了新的圖片,可能就沒有足夠的運算內存了。
我們如何解決heap size不夠的事情呢?手機是不能夠改變其heap size的,我們只有想辦法控制heap memory的使用。最直觀的做法就是:存儲內存與運算內存的優化使用,當運算內存需要資源時從存儲內存中調用,需要新的資源時,就把不需要的釋放掉。下面我就結合一段代碼解釋我們是如何制作Loading狀態的。
眾所周知,java是內置多線程的,我們可以使用兩個線程來解決loading的問題,一個讀資源的線程,一個繪制資源的線程。程序代碼:
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
/**
* Loading演示
* @author gaogao
* */
class MainCanvas
extends Canvas
implements Runnable {
//程序狀態
static final int LOADING = 0;
static final int GAMEING = 1;
//程序狀態控制器
int state = LOADING;
//主線程
Thread thread = null;
//是否loading完畢,
boolean isLoaded = false;
//內部類,新開讀取資源的 線程
class Loading
implements Runnable {
//內線程
Thread innerThread = null;
public Loading() {
innerThread = new Thread(this);
innerThread.start();
}
int counter = 100;
public void run() {
//模擬讀取資源
//把下面的東西改成讀取資源的代碼即可
while (counter > 0) {
counter--;
try {
Thread.sleep(20);
}
catch (Exception ex) {}
}
//loading結束
isLoaded = true;
}
}
Loading loading = null;
public MainCanvas() {
loading = new Loading();
thread = new Thread(this);
thread.start();
}
int loadingCounter = 0;
//繪制..
public void paint(Graphics g) {
g.setColor(0);
g.fillRect(0, 0, getWidth(), getHeight());
switch (state) {
case LOADING: {
g.setColor(0XFFFFFF);
g.drawString("LOADING" + ">>>>>".substring(0, loadingCounter),
getWidth() >> 1, getHeight() >> 1,
Graphics.HCENTER Graphics.TOP);
loadingCounter = ++loadingCounter % 5;
}
break;
case GAMEING: {
g.setColor(0XFFFFFF);
g.drawString("GAME", getWidth() >> 1, getHeight() >> 1,
Graphics.HCENTER Graphics.TOP);
}
break;
}
}
public void run() {
while (true) {
try {
Thread.sleep(100);
}
catch (Exception ex) {
}
if (isLoaded) {
loading = null;
state = GAMEING;
}
repaint(0, 0, getWidth(), getHeight());
serviceRepaints();
}
}
}
public class Main
extends MIDlet {
MainCanvas mc;
public void startApp() {
if (mc == null) {
mc = new MainCanvas();
Display disp = Display.getDisplay(this);
disp.setCurrent(mc);
}
}
public void destroyApp(boolean bool) {}
public void pauseApp() {}
}
(出處:http://www.companysz.com)
|
新聞熱點
疑難解答