3D程序员面试题

  • 下面是一技术问题,用于考察应聘人员的各方面的知识程度。回答请尽量详细,最好能举例说明。


一、一些3D问题:

(公司使用的是D3D,如果不熟,用OpenGL举例回答也可以)

1.请介绍D3D或OpenGL中渲染对象时需要设置的3个矩阵及它们各自的作用
世界矩阵(World Matrix)、视图矩阵(View Matrix)以及投影矩阵(Projection Matirx);
世界矩阵确定一个统一的世界坐标,用于组织独立的物体形成一个完整的场景;
视图矩阵就是我们能看到的那部分场景,由虚拟摄像机负责拍摄;
投影矩阵就是3维物体的平面影射.把三维场景在一个二维的平面上显示.

2.请简单介绍D3D的渲染流水线流程及各步骤的作用,以及实际应用中我们可以在这些步骤做些什么效果应用?

可分为两个阶段,T&L和光栅化处理;主要步骤包括世界变换、视图变换、照明、投影变换、裁剪、w切分、视口变换等.通过渲染流水线可以得到视觉上的三维场景及其变换效果.

3.ZBuffer有什么作用,渲染任何物体时是否都一定要打开ZBuffer?为什么?
深度缓冲.作用是确保多边形能够正确的显示在它们本来的深度.对于两个物体以上的场景来说,一般都要求打开ZBuffer,否则可能出现非正常的立体感观.

4.请介绍你所有知道的纹理Alpha混合方式,原理(公式),以及他们的实际应用(做什么样的效果时需要这种方式)
公式为: Color = (源颜色 * 源系数) OP (目标颜色 * 目标系数);其中OP(混合方式)有
加,减,反减,取最小,取最大; Alpha混合用于做半透明效果.

5.请介绍你所知道的所有3D动画方式、实现原理,以及他们的实际应用(做什么样的效果时需要这种方式)
主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画.关节动画把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连接成一个整体的动画,角色比较灵活Quake2中使用了这种动画;单一网络模型动画由一个完整的网格模型构成,在动画序列的关键帧里记录各个顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实;骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点;骨骼按角色特点组成一定的层次结构,由关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼之外,决定角色的外观。皮肤网格每一个顶点都会受到骨骼的影响,从而实现完美的动画.

6.现在的显卡已经可以每秒渲染上千万个三角形以上(而一般的游戏场景也就几万个三角形),而已已经有了很多自动的显示剪裁,是否意味着使用BSP或其他优化方法组织场景数据已经没有必要了?为什么?
不是。MMORPG一个特别重要的问题就是同步,如果不使用优化方法组织场景数据,减轻计算负荷,在数据访问量过大时,可能会造成服务响应命令延迟的问题,从而造成玩家异步,严重损害网络游戏的可玩性。在时效与技术允许的情况下,依赖硬件处理的思想都不值得提倡。

7.使用硬件支持的D3D灯光有什么优点和缺点,好的3D引擎一般用什么方法弥补这种缺点?
硬件支持的D3D灯光使游戏逼真,渲染速度快,效果显著.但并非所有的硬件都支持D3D灯光。游戏引擎必须检测显示卡是否支持D3D灯光以决定是否依赖硬件抽象层(HAL)来完成这个渲染工作.

8.GF4 MX系列与GF4 TI系列显卡有什么不同点?这些不同有什么作用?
GF4 TI 是先进的硬件显示卡,性能好,价格高,完全支持DX8.1,有灯光效果和动态模糊等特效;
GF4 MX 不支持DX8.1,渲染的图形质量没GF4 TI系列高,逼真度较低。
这个不同将导致3D程序员不得不考虑是否使用DX8里的一些已经不继续更新的内容,比如DirectShow等以及一些特殊动态链接库的使用问题.

二、关于网络及其他的问题:


1. 如果使用TCP/IP,使用什么方法可以让一个服务器同时接受上千个客户端连接而且能高效的工作?
IOCP. IOCP是一个异步I/O的API,它可以高效地将I/O事件通知给应用程序, 当一个事件发生的时候,此完成端口就将被操作系统加入一个队列中。然后应用程序可以对核心层进行查询以得到此完成端口。

2. 使用DXPlay与直接使用TCP/IP有什么关系和区别?
TCP/IP协议相当于一组Windows API DXPlay集成了里面的一些功能API,使用DXPlay开发起来更简单快捷。


3. 线程与进程有什么区别。
线程是进程的一个实体,是CPU调度和分派的基本单位。进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,每个程序至少都有一个进程程,每个进程至少有一个线程,同一进程所产生的一个或多个线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如寄存器、栈、程序计数器)。多个线程可看做多个功能模块的独立应用,来实现进程的调度和管理以及资源分配。

4. 在使用多线程程序时,最主要要注意的问题在哪里?如何解决?
同步、互斥、死锁等;.
解决方法:(1)特殊的全局变量,每个线程单独设置一个;这样从每个线程中可以获取正确的错误信息。(2)多线程库中的数据结构以同步机制加以保护。这样可以避免访问时候的冲突。(3)如果要访问的资源比较复杂,使用临界区或互斥,并具注意获得临界区的顺序,防止线程相互等待资源而发生死锁现象.

5. 设计服务器程序,最主要的设计要求是在哪方面?
做交互逻辑程序开发时,不要对服务器产生负面影响.服务器程序要保证”实时”,畅通。


6. 使用DLL有什么好处。linux下如何实现类似DLL的功能?
使用DLL可以使减少资源消耗,只在需要的时候动态加载。Linux在编译函数库源程序时加上-shared选项即可,这样所生成的执行程序即为动态链接库,动态加载可使用dlopen、dlSys、dlclose。

7.win2000与win98的内存管理最主要的区别在哪里?
Win98 和 Win2000 都尽量在物理存储器上保持 dll 只有一份拷贝,然后将这一份拷贝映射到各个内存空间,这样最有效率.但是 dll 中的全局变量(一般的)必须相对独立.Win98 把包含全局变量的dll每个进程复制一份,共享所有代码段。win2000采用虚拟内存管理机制使对映射页面的写入不影响 dll 的全局拷贝,避免了dll 相互共享而又保证了大多数页面只有一份物理拷贝。


8.内存泻漏是怎么产生的?有什么害处?如何预防和检测?
应用程序一般使用malloc,realloc,new等函数从堆中分配到一块内存,使用完后,程序必须负责相应的调用free或delete释放该内存块,否则,这块内存就不能被再次使用,我们就说这块内存泄漏了。内存泄漏会占用掉宝贵的存储空间,使用程序运行缓慢,甚至使应用程序崩溃。
培养良好的命名习惯. 编程习惯,保证每一次开辟的内存不需时都会释放.
c++中检测内存泄漏可以引入系统定义的宏来查看,也可以使用专门的检测工具.

三、C++/C试题

本试题仅用于考查C++/C程序员的基本编程技能。内容限于C++/C常用语法,不涉及数据结构、算法以及深奥的语法。考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不能反映考生的智力和软件开发能力。
笔试时间90分钟。请考生认真答题,切勿轻视。请认真自己做一下,不要去查答案。

一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。(10分)
提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。例如 int 变量 n 与“零值”比较的 if 语句为:
if ( n == 0 )
if ( n != 0 )
以此类推。

请写出 BOOL flag 与“零值”比较的 if 语句:
请写出 float x 与“零值”比较的 if 语句:
请写出 char *p 与“零值”比较的 if 语句:

二、以下为Windows NT下的32位C++程序,请计算sizeof的值(10分)

char str[] = “Hello” ;
char *p = str ;
int n = 10;
请计算
sizeof (str ) =
sizeof ( p ) =
sizeof ( n ) =
void Func ( char str[100])
{
请计算
sizeof( str ) =
}

void *p = malloc( 100 );
请计算
sizeof ( p ) =

三、简答题(25分)

1、头文件中的 ifndef/define/endif 干什么用?
2、#include <filename.h> 和 #include “filename.h” 有什么区别?
3、const 有什么用途?(请至少说明两种)
4、在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”声明?
5、请简述以下两个for循环的优缺点

// 第一个
for (i=0; i<N; i++)
{
if (condition)
DoSomething();
else
DoOtherthing();
}
// 第二个
if (condition)
{
for (i=0; i<N; i++)
DoSomething();
}
else
{
for (i=0; i<N; i++)
DoOtherthing();
}
优点:
缺点:
优点:
缺点:

四、有关内存的思考题(20分)

void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}

请问运行Test函数会有什么样的结果?
答:
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}

请问运行Test函数会有什么样的结果?
答:
Void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory2(&str, 100);
strcpy(str, "hello");
printf(str);
}
请问运行Test函数会有什么样的结果?
答:
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
请问运行Test函数会有什么样的结果?
答:

五、编写strcpy函数(10分)
已知strcpy函数的原型是
char *strcpy(char *strDest, const char *strSrc);
其中strDest是目的字符串,strSrc是源字符串。

(1)不调用C++/C的字符串库函数,请编写函数 strcpy
(2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?

六、编写类String的构造函数、析构函数和赋值函数(25分)
已知类String的原型为:
class String
{
public:
String(const char *str = NULL);// 普通构造函数
String(const String &other); // 拷贝构造函数
~ String(void); // 析构函数
String & operate =(const String &other); // 赋值函数
private:
char *m_data; // 用于保存字符串
};
请编写String的上述4个函数。

四、关于程序员的问题:(请回答尽量详细) (注:1-11不限制于程序方面)


1. 介绍一下自己情况(用口语,说你心里想的东西,不要用简历上那种标准格式)。
2. 介绍一下你自己学习情况(同上,用口语)
3. 举几个你以前做过的事情中自认为最有成就感的事情。
4. 你对自己的哪些方面比较满意,哪些方面比较不满意。
5. 你曾经所做过的感觉最困难的事情是什么?你有解决这个困难吗?
6. 你曾经所做过的感觉最失败的事情是什么?为什么会感觉失败?
7. 你所了解的所有事物中,你觉得自己了解最深的是什么?你是怎么样加深对他的了解的?
8. 你觉得和你以前的同学或同事相比如何?你是否总能说服他们?如果是,你是如何做到的?如果否,你觉得是为什么?
9. 你是否有和别人合作完成一项任务的经历,情形如何?结果如何?
10. 在你以前的经历里,你认为对你帮助最大的人是谁?为什么?
11. 你有没有给自己定过什么目标?你达成情况如何?
12. 你认为做程序员,写程序时最重要的是注意些什么方面?为什么?
13. 说几个你认为非常好的设计方法(结构或模式)。为什么?
14. 说一个你所做过的感觉对自己的进步最大的一个项目。为什么?
15. 你认为自己在程序设计方面。哪方面是强项。哪方面是弱项。为什么?
16. 你觉得你做为程序员的发展方向是什么?为什么?
17. 你认为做游戏程序员和做其他程序员有什么不同?为什么?
18. 你离职的原因是什么?你想像中的蜗牛是一个什么样的公司?你理想中的公司是什么样的?

五、特别说明

这是以前从网上保存的一个网页上面的内容,网页比较乱,好像是《学生之家》什么论坛,网页原名为《蜗牛3D程序员面试题》,大概整理后发上来,所有内容版权归原作者所有,这里仅供本人学习。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值