|
本帖最后由 winson7891 于 2011-11-27 20:54 编辑
鉴于最近有MOD用PNG,显示速度杯具了
那我也不藏私了,反正不是什么高技术的东西,说说吧
哦另外强调一下,这里说提高PNG显示速度,不是说按着这里做,游戏速度必定会提高!请注意。
废话不说,直接正题
设置是有两点,这两个做法都可提高PNG图显示速度,而两者之间没有关联
第一. 改变PNG图片格式
虽然都是PNG图,但是PNG与PNG之间也不尽相同,其中重要的区别就是色深与调色板的区别。
有很多时候,对于一些图片,即使颜色数量不一样,用肉眼也是难以看出的,特别是业余制作的图片,杂边,杂色多不要紧,图片格式不一,造成的速度浪费是很常见的现象
是的,只要把PNG图片的格式设置好,其显示速度将大大提高。
在这里,我们要用到伟大的photoshop:
打开一幅例图,我们可以看到是一幅带半透明的图片,这例子颜色单一,随便找的,勿怪
然后我们看图像--> 模式
我们可以看到,这图片是一幅RGB颜色图,8位通道的(靠没截出来,不过大家知道就好了)
把贴图格式改成“索引颜色”!
确定,记得带透明度,在索引颜色的模式下,所谓的透明度,其实是选一个颜色作透明色,当显示贴图时,该颜色的部分全部不显示
确定后,图片变成这样:
是不是很不一样呢?
这里大家可能会疑惑,尼玛图片颜色都不一样了,这在游戏中显示肯定达不到原有的效果,这不坑爹么……
的确坑爹,但是,对于没有不透明的图片呢?对于只有主图像,没有半透明效果要求的图片呢?整个游戏绝大部分都是这类贴图,全部换成索引,不单原效果没变,而且速度会比RGB快!(两倍左右吧)
而且,难道读入游戏之后,不可以再作半透明处理么?完全没有必要把原图就射成半透明
第二,源码上的设置
在讲述方法之前,首先来看看一个比较原始,也比较完整的PNG读取显示代码(出处Delphi原版复刻,作者weyl):
- //显示tif, png, jpg等格式图片
- procedure display_img(file_name: PChar; x, y: integer); overload;
- var
- image: PSDL_Surface;
- dest: TSDL_Rect;
- begin
- if fileexists(file_name) then
- begin
- image := IMG_Load(file_name);
- if (image = nil) then
- begin
- MessageBox(0, PChar(Format('Couldn''t load %s : %s',
- [file_name, SDL_GetError])), 'Error', MB_OK or MB_ICONHAND);
- exit;
- end;
- dest.x := x;
- dest.y := y;
- if (SDL_BlitSurface(image, nil, screen, @dest) < 0) then
- MessageBox(0, PChar(Format('BlitSurface error : %s', [SDL_GetError])), 'Error', MB_OK or MB_ICONHAND);
- SDL_FreeSurface(image);
- end;
- end;
复制代码 以上代码已经包括了PNG显示的几个大的部分:定义图像,读取图像,设定显示位置,画图,释放图像
如果忽略安全判断(就是如果图像不存在啊,输入错误等),代码会简化成这样:
- //显示tif, png, jpg等格式图片
- procedure display_img(file_name: PChar; x, y: integer); overload;
- var
- image: PSDL_Surface;
- dest: TSDL_Rect;
- begin
- image := IMG_Load(file_name);
- dest.x := x;
- dest.y := y;
- SDL_BlitSurface(image, nil, screen, @dest);
- SDL_FreeSurface(image);
- end;
复制代码
|
|