LG KG90n是中国移动游戏基地手机系列中的一款,240x320分辨率的屏幕,不支持蓝牙,下载jar的时候只能使用OTA (Over The Air)下载且下载速度极慢,一般需要五六分钟。不过总体来说性能还可以。做j2me应用时,jar包可以达到600k以上,内存也还算充裕。但是有手机的jvm不是特别完善,开发时如果不注意会出现一些难缠的问题。
以下就是我遇到过的2个问题,试验了多遍得出的结果。
1,屏幕闪动问题
现象:进入游戏后,屏幕总是会闪动,但其实游戏还算流畅。
问题出在屏幕刷新,该手机不允许一帧内对屏幕进行两次刷新。何谓两次刷新?对比一下代码比较好理解一点。
问题代码:
public void paint(Graphics g){
g.setColor(-1);
g.fillRect(0, 0, SCR_W, SCR_H);
Graphics gBuf = imgBuf.getGraphics(); //imgBuf is an Image of screen size as the screen buffer
game.draw(gBuf);
g.draw(imgBuf, 0, 0, 0);
}
修改后无问题的代码:
public void paint(Graphics g){
Graphics gg = g;
if(imgBuf != null)//imgBuf is an Image of screen size as the screen buffer
gg = imgBuf.getGraphics();
gg.setColor(-1);
gg.fillRect(0, 0, SCR_W, SCR_H);
game.draw(gg);
if(imgBuf != null)
g.draw(imgBuf, 0, 0, 0);
}
对比代码可以发现,看问题代码,可以知道前面说的‘两次’是:一次是直接网手机屏幕上画东西,一次是在buffer上画东西,然后再画到屏幕上。而无问题代码的做法是:在画图之前,先看是否有buffer,如果有buffer则把所有东西都画到buffer上,然后再一次性画到手机屏幕上,如果没有buffer,则把所有内容直接画到手机屏幕上——这样就不会出现闪动的问题了。
2,在联网时弹出系统提示窗口问是否允许联网时,也闪动。
现象:正常的情况是弹出一个系统窗口,但是该窗口没有完全遮住屏幕,可以看到j2me应用暂停了,变成了灰色。但是我遇到的问题时,画面不断在我的j2me应用和系统提示窗口之间来回切换闪动,且应用没哟变灰色,还是正常的色彩,提示窗口没有显示出来,只显示出屏幕底部的‘是’和‘否’两个提示按钮。
原因:按键响应的机制有问题。如果直接在按键响应函数中去做逻辑响应——keyPressed()和keyReleased()函数,就会出现这样的问题,如果在这两个函数里只是保存着按键的值,而在线程的run()函数的while循环中去做逻辑处理的话,则能避免改问题(我做的是一个游戏,一般来说游戏都是起一个线程,在run()函数中是否一个while(true)的无限循环不断重画屏幕来实现游戏的运行)。还是对比一下代码:
有问题代码:
public void run(){
while(true){
repaint();
serviceRepaints();
}
}
public void keyPressed(int keycode){
if(keycode == NUM_0){
midlet.platformRequest(url); //此处会出现系统联网提示
}
}
无问题代码:
public void run(){
while(true){
gamelogic();
repaint();
serviceRepaints();
if(keyHold != INVALID_KEY)
keyHold = INVALID_KEY;
}
}
int keyHold;
void gamelogic(){
if(keyHold == NUM_0)
midlet.platformRequest(url);
}
public void keyPressed(int keycode){
keyHold = keycode;
}
对比代码可以发现,后者保证了逻辑处理(gamelogic())在画图之前处理完,逻辑处理和画图不会相互干扰;而前者直接在keyPressed()中处理,则很可能会打断画图的过程——即在画图还未完成的时候,弹出了系统提示框,弹出之后,又要进行剩余的画图过程从而导致了闪屏——似乎也可以这样总结:系统的画图线程和应用的画图线程相互穿插了,导致了闪屏。避免穿插的办法就是在系统画图线程启动的根源处做处理——即按键处理的地方,将逻辑处理和画图过程完全分开。
分享到:
相关推荐
想知道QQ里面的屏幕闪动原理吗?本代码告诉你该怎么去实现
Unity ASE连接的第一视角流血受伤受攻击屏幕流血效果Shader ,可以控制受伤是否显示血屏幕开关,闪烁,边缘发光,叠加颜色。
右键桌面-屏幕闪动-出现“windows资源管理器已停止工作”-一直如此.pdf
C#开发的在windows右下角状态栏闪动提示消息, 类似QQ
托盘闪动消息提醒(有声音+源码) 本实例基于Eclipse开发。
可以闪动的图标可以闪动的图标可以闪动的图标可以闪动的图标
js 特效 html 特效 闪动的提示文字 js 特效 html 特效 闪动的提示文字
本人电脑戴尔G3,win10系统,升级到最新显卡驱动后,再使用谷歌、edge浏览器、office后均出现屏幕闪烁的问题,经测试把浏览器和office设置里的硬件加速模式关闭即可。也可使用低版本的集显驱动解决此问题。在此把...
.NET(C#): 任务栏窗口和状态图标的闪动。 。。。。。。。。。。。
input,验证,闪动,自动删除,限制输入
C#在任务栏显示仿QQ闪动的消息通知窗口
这是一个小小的压缩包文件,但你在解压的过程中你的屏幕会频繁闪动,你等一会儿就没事了!不会对你的电脑造成任何损伤...
WPF自定义窗口,保留原生窗口的所有功能,如阴影, 模态闪动,窗口外部拖动改变大小,拖动到屏幕边缘行为,最大最小化动画。 使用阿瓦隆dock高仿vs2017+vs2019样式。 自定义简单画布控件,可移动或缩放,类似ps设计...
关于托盘程序的一个图标连续闪动的超简单程序。
这个是不错的代码!新手可以保存! 主要就是让窗体刷新时不闪!
c# icon 图标 特效 WINDOWS任务栏 动态生成 显示 闪动 变化 winform 难得的效果 打包 源码 如果要像QQ那样闪动,其实很简单我里面这个例子,就是用一个TIME定时更改ICON图标.不过这里看起来的效果就是任务栏图标在...
地图实现分布带闪动提示---地图分布,可以再开发,纯CSS效果,包括着重闪动效果
QQ托盘图标闪动
AsyncTask应用练习,图片的三级缓存,以及解决快速滑动图片闪动问题
@浅浅`。