[PSP教程00]libnge介绍



掌叔
2008-06-05 16:52:41

摘自:TOPOC studio
作者:newcreat

nge是 nge's not a game engine.的递归缩写.它采用改进了图形系统的sdl.所有代码遵循GPL发布.

众所周知,写psp程序时调试是一大难题,可能你写好一个程序之后,放到psp上调试,结果需要做这些工作:

1 打开psp的usb连接.

2 拷贝写好的程序到game下.

3 运行程序,查看结果.

这个可能是最好情况,可能你不小心写出程序了,psp挂了,结果还要关机拔电池等等,极大的浪费了开发人员的宝贵时间.可能绝大多数时间浪费在这个无聊的psp调试方面了.

基于这个原因,所以需要一个与平台无关的库,这样在windows下开发程序就可以了.开发人员不需要在psp下调试,甚至可以连psp都不用买,一样可以开发psp程序.

1 为什么nge采用SDL?

  sdl是一个非常出色的框架,而且是跨平台,nge采用了除图形显示的其他部分.原因是sdl显示是软件加速,而且放大,缩小,旋转,也是用的 sdl_gfx做的软件加速.完全不能达到做游戏的需求.所以需要改写一个接口能够实现硬件加速的放大,缩小,旋转.此外可能有的开发人员会考虑sdl+ opengl的方式,的确这个对图象旋转等能够实现硬件加速,不过还是不够快.以下是一个在psp上的对比:

(1) 512*512*32 贴图 psp采用默认222mhz

sdl+softrender <30fps

sdl+pspgl   约55fsp 

sdl+nge    >270fps

(2)512*512*16贴图 psp采用默认222mhz

sdl+softrender <60fps

sdl+pspgl   约120fsp 

sdl+nge    >400fps

所以用pspgl可以满足一般应用程序的要求,但是如果需要复杂的显示,比如更多画面特效,用它就不太适合了.采用sdl+nge就基本能满足开发游戏的要求.

2 nge的设计.

  nge主要是替换sdl的显示系统,在windows下采用opengl实现,在psp下直接采用gu实现,这样达到最大的显示效率.提供一套一致的接口,这样一份代码可以在windows和psp下都可以运行,不用做任何的修改.开发人员在windows下开发并且调试,最后只需在发布的时候编译一份psp版的发布就行了,可以完全抛弃psp.

3 nge的特点.

  完全延续sdl的所有东西:

1 各种图片格式支持,png,jpg,bmp,gif,tga...

2 sdl的消息队列,这个对习惯消息机制开发者有很大用处.

3 多线程程序,mutex,condition...

4 输入输出

5 更强大的SDL_BlitSurface函数功能,采用RendQuad函数名,可以在这个函数里实现旋转,放大,缩小,变换颜色,半透明效果.非常方便.

6 完美的中文freetype支持.并且字的实时旋转,放大,缩小非常简单.

  另外新加的部分

7 网络子系统 简单的异步网络,可以通过这个库编写psp网络程序,例如邮件收发,ftp下载等等.

8 gui系统OCCULT,一个类似java的gui系统,采用xml作为配置文件,文档地址:

     [url]http://www.zgnongyi.com/jackstop/Occult%20API%20Documentation.mht[/url]

9 小型sql数据库,可以用于配置和大量数据的管理,非常方便

4  最新一键安装包,包含了用于psp和windows的所有最新库,真正做到一键安装,无须配置.

下载地址:一共4个包,共40m,解压之后运行setup.exe即可.

[url]http://code.google.com/p/topoc/downloads/list[/url]

windows版的设置:

下载了windows版的会有下面几个目录:
[attach]1[/attach]
配置vc++ 6.0

1 库的头文件设置,请看图
[attach]2[/attach]
2 lib文件设置,请看图
[attach]3[/attach]
3 设置好了就可以进入demo目录用vc打开工程测试环境了,如果demo编译没问题的话说明windows下配置好了(把dll目录里的dll拷到system32下).

4 新建工程需要注意2个问题:由于是采用的多线程的库,所以新建工程需要注意2个地方的设置,一是需要用Multithreaded dll ,二是不用libcd,/nodefaultlib:"libcd.lib", 具体设置请看本节最后.

psp版的配置:

采用整合包的可以直接启动start编译即可.(请看教程04)下面可以不用看了.

1 请在ps2dev上下载并安装sdl,sdl_ttf,freeype,sdl_image,sdl_mixer,jpeg,libpng,zlib.

2 将libnge_psp拷贝到任意目录,然后cd进入test.cpp所在目录,键入make SCEkxploit,如果没有错误说明libnge_psp已经装好了.

开发实例:

中国象棋pspv1.2采用的就是nge制作,在画面上有了很大的提高,而且整个制作过程中没有使用过一次psp,全部是在windows下完成的,只是在最后发布时编译了一份psp版程序.所以能够极大的加快开发进程和降低调试难度.

-----------------vc编译时问题的解答-------------------

Q&A:

Q1.出现linkerror

msvcrt.lib(MSVCRT.dll) : error LNK2005: _exit already defined in LIBCD.lib(crt0dat.obj)
msvcrt.lib(MSVCRT.dll) : error LNK2005: _strncpy already defined in LIBCD.lib(strncpy.obj)
msvcrt.lib(MSVCRT.dll) : error LNK2005: _fclose already defined in LIBCD.lib(fclose.obj)
msvcrt.lib(MSVCRT.dll) : error LNK2005: __isctype already defined in LIBCD.lib(isctype.obj)
LIBCD.lib(crt0init.obj) : warning LNK4098: defaultlib "msvcrt.lib" conflicts with use of other libs; use /NODEFAULTLIB:library...

A1.这个是用多线成的libc的问题,解决方法采用Multithreaded dll即可,如下图设置:
[attach]4[/attach]
Q2:出现错误

--------------------Configuration: text - Win32 Debug--------------------
Linking...
libcd.lib(strcat.obj) : error LNK2005: _strcpy already defined in MSVCRT.lib(MSVCRT.dll)
libcd.lib(dbgheap.obj) : error LNK2005: _malloc already defined in MSVCRT.lib(MSVCRT.dll)
libcd.lib(dbgheap.obj) : error LNK2005: _realloc already defined in MSVCRT.lib(MSVCRT.dll)
libcd.lib(crt0dat.obj) : error LNK2005: _exit already defined in MSVCRT.lib(MSVCRT.dll)
libcd.lib(crt0dat.obj) : error LNK2005: __exit already defined in MSVCRT.lib(MSVCRT.dll)
libcd.lib(crt0.obj) : error LNK2005: _mainCRTStartup already defined in MSVCRT.lib(crtexe.obj)
libcd.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in MSVCRT.lib(cinitexe.obj)
libcd.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in MSVCRT.lib(cinitexe.obj)
libcd.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in MSVCRT.lib(cinitexe.obj)
libcd.lib(crt0init.obj) : error LNK2005: ___xi_a already defined in MSVCRT.lib(cinitexe.obj)
libcd.lib(winxfltr.obj) : error LNK2005: __XcptFilter already defined in MSVCRT.lib(MSVCRT.dll)
MSVCRT.lib(MSVCRT.dll) : error LNK2005: _strncpy already defined in libcd.lib(strncpy.obj)
MSVCRT.lib(MSVCRT.dll) : error LNK2005: _fclose already defined in libcd.lib(fclose.obj)
MSVCRT.lib(MSVCRT.dll) : error LNK2005: __isctype already defined in libcd.lib(isctype.obj)
LINK : warning LNK4098: defaultlib "MSVCRT" conflicts with use of other libs; use /NODEFAULTLIB:library
MSVCRT.lib(cinitexe.obj) : warning LNK4098: defaultlib "libcd.lib" conflicts with use of other libs; use /NODEFAULTLIB:library
Debug/text.exe : fatal error LNK1169: one or more multiply defined symbols found
执行 link.exe 时出错.

text.exe - 1 error(s), 0 warning(s)

A2:解决方法:加入/nodefaultlib:"libcd.lib"如图所示
[attach]5[/attach]
这2个问题是vc下写多线程都会遇到的,原因请baidu,google,我就不废话了.

Q3: 如何去掉psp版的debug信息?
psp默认是debug版的,标明有当前fps和内存剩余量,主要是方便检测速度和内存泄露问题,如果经过一个操作你内存不断变少,说明有内存问题,则需要修改.
A3:编译release版的nge.

你用-D RELEASE 编译release版的libnge,cd 进入pspdevlibnge_pspsrc 修改makefile,makefile修改的地方见红字

TARGET_LIB = libnge.a
OBJS = vram.o GuSystem.o libnge.o libnge_global.o

INCDIR = /usr/local/pspdev/psp/include/freetype2 /usr/local/pspdev/psp/include
CFLAGS = -G0 -w -DRELEASE
CXXFLAGS = $(CFLAGS) -fno-rtti
ASFLAGS = $(CFLAGS)

PSPSDK=$(shell psp-config --pspsdk-path)
PSPBIN = $(PSPSDK)/../bin
CFLAGS += $(shell $(PSPBIN)/sdl-config --cflags)
LIBS += $(shell $(PSPBIN)/sdl-config --libs)
include $(PSPSDK)/lib/build.mak
install:
cp libnge.a ../lib/
cp *.h ../include/

然后
make clean
make
make install
就可以了生成release的libnge.a

--------------------------------------------

Q3: VS2005如何使用?

A3:需要改一下工程设置.以下是步骤:

1 打开xxxx.dsw会出现一个对话框,问你是否转换旧工程,选择 是.编译时出现那个DataCache重复定义问题可以把那个定义删除或者改个名字,那个定义没有用到.设置参考vc6.0 设置inlcude和lib
[attach]6[/attach]
编译会,出下边的问题
错误 1 error C2365: “CacheData”: 重定义;以前的定义是“枚举数” e:zxpc++libnge_winlibngeincludedatatype.h 121
错误 2 error C2143: 语法错误 : 缺少“;”(在“*”的前面) libnge_winlibngeincludedatatype.h 127 错误 3 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int libnge_winlibngeincludedatatype.h 127
请将CacheData重新改个名字即可,或者删除他

2 设置include和lib

参照vc6的方式设置那5个include和lib(“工具->选项->项目和解决方案->VC++目录”里设置库文件Include和Lib路径;")
[attach]7[/attach]
3 更改工程属性,选择linker,加入需要的库文件,可以用哪些添加哪些(例如sdl_ttf.lib 是lesson2才要的),如下图,我的是万恶的中文版的vs2005.

附加依赖项 sdl_ttf.lib SDLmain.lib sdl.lib sdl_image.lib libnge.lib opengl.lib glu.lib msvcprtd.lib msvcrtd.lib

忽略所有默认库  选择 是
[attach]8[/attach]
3编译即可.
注:vs2005可能会需要opengl.dll请在这里下载(vc6会安装这个dll所以不用下,vs2005安装的是opengl32.dll)
[url]http://code.google.com/p/topoc/downloads/list[/url]
5 以后自建工程需要选择console,然后工程设置按第3步即可
[attach]9[/attach]


大猫
2008-06-05 17:05:42

支持一下老大,俺对psp的库了解很少,希望能看到更多类似的文章:D


zhkza99c
2008-06-05 17:17:01

= =+新人,报道。


TW241
2009-05-12 11:12:37

好东西 !!!!!!!