J2ME笔试.docx

上传人:b****5 文档编号:2890049 上传时间:2022-11-16 格式:DOCX 页数:22 大小:70.49KB
下载 相关 举报
J2ME笔试.docx_第1页
第1页 / 共22页
J2ME笔试.docx_第2页
第2页 / 共22页
J2ME笔试.docx_第3页
第3页 / 共22页
J2ME笔试.docx_第4页
第4页 / 共22页
J2ME笔试.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

J2ME笔试.docx

《J2ME笔试.docx》由会员分享,可在线阅读,更多相关《J2ME笔试.docx(22页珍藏版)》请在冰豆网上搜索。

J2ME笔试.docx

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修饰的变量(常量)比

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1