J2ME笔试.docx
《J2ME笔试.docx》由会员分享,可在线阅读,更多相关《J2ME笔试.docx(22页珍藏版)》请在冰豆网上搜索。
J2ME笔试
1.midlet类种中主要的方法有哪些?
各自的作用是什么?
2.什么是双缓冲?
使用双缓冲的有点是什么?
对于堆栈的影响有哪些?
可能在开发中引起什么问题?
双缓冲其实就是在画屏幕的时候,另外用一个Image保存一样的画。
在屏幕重绘的时候,把Image的内容画上去。
1、OpenGL的前缓存并不保证位于显存显示区之外。
对于一些集成显卡,由于显存有限,它可能直接位于显示区。
2、前缓存并不保证在所有指令都处理完毕之后再显示。
由于这两点,加之各OpenGL实现的缓存刷新后状态不确定,可能导致以下问题:
1、画面闪烁。
2、图象被撕裂。
3、混合不正确。
4、遮挡顺序不正确。
昨天在论坛上,有人问起双缓冲的实现问题,想起网上这方面资料比较凌乱,而且多是DirectX相关的,今天特地在这里给大家简要的介绍一下双缓冲技术及其在VC++的GDI绘图环境下的实现。
1、Windows绘图原理
我们在Windows环境下看到各种元素,如菜单、按钮、窗口、图像,从根本上说,都是“画”出来的。
这时的屏幕,就相当于一块黑板,而Windows下的各种GDI要素,如画笔、画刷等,就相当于彩色粉笔了。
我们在黑板上手工画图时,是一笔一划的,电脑亦然。
只不过电脑的速度比手工快的太多,所以在我们看起来好像所有的图形文字都是同时出现的。
2、普通绘图方式的局限
上述绘图方式我们暂且称之为普通绘图方式吧。
虽然这种方式能满足相当一部分的绘图需要,但是当要绘制的对象太复杂,尤其是含有位图时,电脑便力不从心了。
这时的画面会显示的很慢,对于运动的画面,会给人“卡”住了的感觉,总之一个字:
不爽。
3、解决之道:
双缓冲
双缓冲的原理可以这样形象的理解:
把电脑屏幕看作一块黑板。
首先我们在内存环境中建立一个“虚拟“的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制好的图形“拷贝”到另一块黑板(屏幕)上。
采取这种方法可以提高绘图速度,极大的改善绘图效果。
下面是原理图:
图一双缓冲原理示意图
4、相关的函数介绍
1)、为屏幕DC创建兼容的内存DC:
CreateCompatibleDC()
if(!
m_dcMemory.CreateCompatibleDC(NULL))//CDCm_dcMemory;
{
:
:
PostQuitMessage(0);
}
2)、创建位图:
CreateCompatibleBitmap()
m_Bmp.CreateCompatibleBitmap(&m_dcMemory,rt.Width(),rt.Height());//CBitmapm_Bmp;
3)、把位图选入设备环境:
SelectObject(),可以理解为选择画布
:
:
SelectObject(m_dcMemory.GetSafeHdc(),m_Bmp);
4)、把绘制好的图形“拷贝“到屏幕上:
BitBlt()
pdcView->BitBlt(0,0,rt.Width(),rt.Height(),&m_dcMemory,0,0,SRCCOPY);
函数的具体用法详见MSDN。
有一句话我重复了多遍,再说一遍也无妨:
MSDN是最好的老师。
5、本文给出了一个例子,用效果对比的方法说明普通绘图方式的局限和双缓冲技术的好处。
这个例子在一个View上画出很多半径渐变的圆,大家可以注意两种不同的绘图方式下动画的效果:
具体实现请参考源代码例子。
最新评论[发表评论][文章投稿]
查看所有评论
推荐给好友
打印
VC知识库!
你个垃圾...现在还要钱了....(AnyDean发表于2010-8-2416:
11:
00)
双缓冲要注意将ERASEBAKE的函数直接返回TRUE就OK了(jayden发表于2010-4-2411:
04:
00)
建议采用wgf双缓冲绘图框架,关于该框架详细信息见:
(chendeng8899发表于2009-5-11:
42:
00)
我按照搂主的方法自己新建了一个默认的单文档MFC程序,然后代码什么的都是粘贴的都不行,还是闪烁,需要注意什么设置吗?
(moweiguo2000发表于2006-6-1515:
59:
00)
请问又缓存要显示的图像最大能有多大呀(loveluckily发表于2006-6-1017:
26:
00)
为何将初始化和双缓冲相应的代码放入 DrawManyCircleUseDBB()函数中运行到使用双缓冲就出错?
void CDBBTestView:
:
DrawManyCircleUseDBB()
{
// 在View内用双缓冲画很多的圆
CDC *pdcView = this->GetDC();
CRect rt;
this->GetClientRect(&rt);
if(!
m_dcMemory.CreateCompatibleDC(NULL))
{
:
:
PostQuitMessage(0);
}
// 创建位图
m_Bmp.CreateCompatibleBitmap(&m_dcMemory, rt.Width(), rt.Height());
// 相当于选择画布
:
:
SelectObject(m_dcMemory.GetSafeHdc(), m_Bmp);
.....
(leman_76发表于2006-2-261:
30:
00)
呵呵
对于运动的画面,会给人“卡”住了的感觉,总之一个字:
不爽。
(goodname发表于2006-2-2213:
13:
00)
3.如何创建一个画布?
4.ServiceRepaints()方法的作用是什么?
serviceRepaints()有强制重绘的作用
repaint()调用完后,会立刻返回.因为repaint()之所以产生重绘事件,是因为它调用了另外的函数paint(),但是我们不能认为repaint是在等paint()完后再才返回,那是因为paint()是由另外的一个专门处理UI的线程来完成的.这里可以将repaint()比喻成一个重要的标志.
serviceRepaints()则不同.它是在paint()完成后再返回.注意,它要强制执行paint(),并等待它顺利完成.
使用serviceRepaints()强制绘制进度条的显示进度时,务必把所要绘制的事件放在paint()函数中执行,否则在真机中不能显示进度。
repaint是发送重绘请求,系统不一定立刻重绘
serviceRepaints是强制系统执行当前未重绘的请求。
5.MIDP2.0所支持的音乐格式有哪些?
wav和au格式,midi(mp3不知道支不支持)
6.使用伪码或者文字描述一下,如何在游戏中切换背景音乐。
举出切换过程中可能存在的问题,并写明解决方法。
?
?
?
7.Image[] img=new Image[10];
For(int i=0;i{ img[i]=Image.creatImage(“/res/”+i+”.png”); }
img=null;
以上代码在执行以后是否释放了堆栈空间?
说明理由。
如果没有释放,写出正确的释放方法。
8.Finalfinally和finalize有什么不同
这是一道再经典不过的面试题了,我们在各个公司的面试题中几乎都能看到它的身影。
final、finally和finalize虽然长得像孪生三兄弟一样,但是它们的含义和用法却是大相径庭。
这一次我们就一起来回顾一下这方面的知识。
我们首先来说说final。
它可以用于以下四个地方:
定义变量,包括静态的和非静态的。
定义方法的参数。
定义方法。
定义类。
我们依次来回顾一下每种情况下final的作用。
首先来看第一种情况,如果final修饰的是一个基本类型,就表示这个变量被赋予的值是不可变的,即它是个常量;如果final修饰的是一个对象,就表示这个变量被赋予的引用是不可变的,这里需要提醒大家注意的是,不可改变的只是这个变量所保存的引用,并不是这个引用所指向的对象。
在第二种情况下,final的含义与第一种情况相同。
实际上对于前两种情况,有一种更贴切的表述final的含义的描述,那就是,如果一个变量或方法参数被final修饰,就表示它只能被赋值一次,但是JAVA虚拟机为变量设定的默认值不记作一次赋值。
被final修饰的变量必须被初始化。
初始化的方式有以下几种:
在定义的时候初始化。
final变量可以在初始化块中初始化,不可以在静态初始化块中初始化。
静态final变量可以在静态初始化块中初始化,不可以在初始化块中初始化。
final变量还可以在类的构造器中初始化,但是静态final变量不可以。
通过下面的代码可以验证以上的观点:
Java代码
publicclassFinalTest{
//在定义时初始化
publicfinalintA=10;
publicfinalintB;
//在初始化块中初始化
{
B=20;
}
//非静态final变量不能在静态初始化块中初始化
//publicfinalintC;
//static{
//C=30;
//}
//静态常量,在定义时初始化
publicstaticfinalintSTATIC_D=40;
publicstaticfinalintSTATIC_E;
//静态常量,在静态初始化块中初始化
static{
STATIC_E=50;
}
//静态变量不能在初始化块中初始化
//publicstaticfinalintSTATIC_F;
//{
//STATIC_F=60;
//}
publicfinalintG;
//静态final变量不可以在构造器中初始化
//publicstaticfinalintSTATIC_H;
//在构造器中初始化
publicFinalTest(){
G=70;
//静态final变量不可以在构造器中初始化
//STATIC_H=80;
//给final的变量第二次赋值时,编译会报错
//A=99;
//STATIC_D=99;
}
//final变量未被初始化,编译时就会报错
//publicfinalintI;
//静态final变量未被初始化,编译时就会报错
//publicstaticfinalintSTATIC_J;
}
我们运行上面的代码之后出了可以发现final变量(常量)和静态final变量(静态常量)未被初始化时,编译会报错;另外还可以发现,静态final变量可以在构造器中初始化,却不可以在初始化块中初始化。
用final修饰的变量(常量)比