`
freedomray
  • 浏览: 33521 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

LG KG90n屏幕闪动问题和联网时弹出系统提示窗口闪动问题

阅读更多
    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中,是一种常见的吸引用户注意力或者传递信息的方式。它的实现原理主要涉及到Windows操作系统的消息机制、多线程编程以及图形用户界面(GUI)的更新。 ...

    TrayIcon系统图标闪动

    - 首先,需要检查系统是否支持托盘图标,然后添加图标到系统托盘,通常还需要设置一个弹出菜单供用户交互。 - 在.NET Framework中,可以使用`System.Windows.Forms.NotifyIcon`类实现相同功能。 3. **图标闪动**...

    易语言程序栏窗口标题滚动+闪动

    程序栏窗口标题滚动和闪动是易语言中实现用户界面动态效果的常见技巧,这些功能可以提升软件的用户体验,吸引用户的注意力。下面将详细介绍这些知识点。 1. 易语言程序栏窗口: 易语言中的窗口是程序运行的可视化...

    防止屏幕闪动

    这样可以有效地减少由于刷新不同步引起的屏幕闪动问题。 ```plaintext 示例代码(伪代码): // 获取显示器的刷新频率 int refreshRate = 获取显示器刷新率(); // 设置应用程序的帧速率 设置帧速率为 refreshRate; ...

    电脑屏幕闪动的原因及解决方法.pdf

    综上所述,解决电脑屏幕闪动问题需要综合考虑各种可能的因素,通过逐一排查和调整,大多数情况下都能找到问题源头并修复。在日常使用中,保持良好的电脑维护习惯,及时更新驱动程序,以及定期进行系统检查,都能有效...

    易语言窗口闪烁

    窗口闪烁的核心在于改变窗口的状态,使其在屏幕中快速交替显示和隐藏,从而引起用户注意。在Windows操作系统中,这种功能可以通过调用API函数`FlashWindow`来实现。`FlashWindow`函数是Windows API的一部分,它的...

    电脑屏幕闪动的原因及解决方法.docx

    电脑屏幕闪动是一种常见的电脑问题,它可能是由多种原因引起的,包括电源插口接触不良、信号干扰、屏幕刷新率过低、显卡驱动程序不正确、使用劣质电源、硬件老化,甚至病毒感染。这些问题如果不及时解决,不仅可能...

    能使屏幕闪东的小文件

    【标题】"能使屏幕闪动的小文件"所指的是一个压缩包中的特定程序,该程序在解压时会导致用户的屏幕出现闪烁现象。这种闪烁通常是由快速改变屏幕亮度或颜色导致的视觉效果,可能会引起不适感,但如描述中所述,这并...

    可以闪动的图标-可以闪动的图标

    在IT行业中,"可以闪动的图标"这个概念通常与用户界面(UI)设计和图形用户界面(GUI)中的动态元素相关。图标是用户界面的重要组成部分,它们为用户提供了一种直观的方式来识别和操作软件功能。当谈到“可以闪动的...

    托盘闪动消息提醒(有声音+源码)-JAVA版

    在Java编程环境中,托盘(Tray)闪动消息提醒是一种常见的用户交互方式,它能够以不打扰用户正常工作的方式,向用户传达重要的系统或应用信息。本实例着重讲解如何在JAVA应用程序中实现托盘通知功能,同时伴有声音...

    屏幕出血.unitypackage

    Unity ASE连接的第一视角流血受伤受攻击屏幕流血效果Shader ,可以控制受伤是否显示血屏幕开关,闪烁,边缘发光,叠加颜色。

    .NET(C#): 任务栏窗口和状态图标的闪动

    在.NET框架,特别是C#编程语言中,任务栏窗口和状态图标的闪动是一个常见的功能,用于吸引用户的注意力。这个功能通常用在应用程序有新消息、通知或需要用户注意的事件时。本篇将深入探讨如何实现这一特性。 首先,...

    C#在任务栏显示仿QQ闪动的消息通知窗口

    在C#编程中,创建一个任务栏仿QQ闪动的消息通知窗口主要涉及到Windows API的调用和消息处理机制。这个功能通常用于提醒用户有新的消息或事件需要关注,而无需打开应用程序本身。以下是对这个主题的详细解释: 1. **...

    WPF之自定义窗口的深度技术 - 模态闪动(Blink)、窗口四边拖拽支持(WmNCHitTest)、自定义最大化位置和大小(WmGetMinMaxInfo)

    Vito博客园文章-WPF.UIShell UIFramework之自定义窗口的深度技术 - 模态闪动(Blink)、窗口四边拖拽支持(WmNCHitTest)、自定义最大化位置和大小(WmGetMinMaxInfo)的部分Code 文章链接: ...

    C# 右下角状态闪动提示

    在Windows桌面应用开发中,有时候我们需要向用户发送重要的通知,而C#提供了一种方法,可以在任务栏右下角的状态区域让应用程序图标闪烁,以吸引用户的注意力,这通常被称为“通知区域”或“系统托盘”的闪动效果。...

    Scroll Bar闪动

    当“Scroll Bar闪动”时,通常意味着滚动条在不断自动刷新或出现异常行为,这可能是由于软件错误、系统设置问题或者驱动程序不兼容等因素引起的。以下是对这一现象的详细分析及可能的解决方案。 首先,滚动条闪动...

    桌面ICON弹出提示信息

    在IT领域,尤其是在Windows系统开发中,"桌面ICON弹出提示信息"是一个常见的需求,它涉及到图形设备接口(GDI)技术的应用。GDI是Windows API提供的一种图形绘制机制,允许程序员控制屏幕上的图形输出,包括文字、...

    使窗口闪烁

    在IT领域,窗口闪烁是一种常见的视觉提示技术,用于吸引用户注意力或者表示某个进程正在进行。在Windows操作系统中,可以通过编程方式实现窗口的闪烁效果。这里,我们主要探讨如何使用C++来实现这一功能,同时结合...

    解决WIN7游戏时窗口闪小工具

    标题中的“解决WIN7游戏时窗口闪小工具”指的是针对Windows 7操作系统中,用户在进行全屏游戏时,窗口可能会出现闪烁问题的一种解决方案。这种现象可能是由于系统兼容性、驱动程序不匹配或是某些后台程序干扰导致的...

    仿QQ系统托盘闪动

    在IT领域,尤其是在Windows应用程序开发中,"仿QQ系统托盘闪动"是一个常见的需求,主要是为了模拟如QQ这样的即时通讯软件所具有的通知机制。QQ等应用在接收到新消息时,会在任务栏的系统托盘区域进行闪烁,以吸引...

Global site tag (gtag.js) - Google Analytics