铁血丹心

 找回密码
 我要成为铁血侠客
搜索
查看: 2412|回复: 1

[通用] 只要这样设置,即可提高PNG图片在MOD中的显示速度

[复制链接]
发表于 2011-11-21 15:13 | 显示全部楼层 |阅读模式
本帖最后由 winson7891 于 2011-11-27 20:54 编辑

鉴于最近有MOD用PNG,显示速度杯具了
那我也不藏私了,反正不是什么高技术的东西,说说吧

哦另外强调一下,这里说提高PNG显示速度,不是说按着这里做,游戏速度必定会提高!请注意。


废话不说,直接正题

设置是有两点,这两个做法都可提高PNG图显示速度,而两者之间没有关联

第一. 改变PNG图片格式
虽然都是PNG图,但是PNG与PNG之间也不尽相同,其中重要的区别就是色深与调色板的区别。
有很多时候,对于一些图片,即使颜色数量不一样,用肉眼也是难以看出的,特别是业余制作的图片,杂边,杂色多不要紧,图片格式不一,造成的速度浪费是很常见的现象

是的,只要把PNG图片的格式设置好,其显示速度将大大提高。
在这里,我们要用到伟大的photoshop:

打开一幅例图,我们可以看到是一幅带半透明的图片,这例子颜色单一,随便找的,勿怪

然后我们看图像--> 模式

我们可以看到,这图片是一幅RGB颜色图,8位通道的(靠没截出来,不过大家知道就好了)

把贴图格式改成“索引颜色”!

确定,记得带透明度,在索引颜色的模式下,所谓的透明度,其实是选一个颜色作透明色,当显示贴图时,该颜色的部分全部不显示

确定后,图片变成这样:

是不是很不一样呢?

这里大家可能会疑惑,尼玛图片颜色都不一样了,这在游戏中显示肯定达不到原有的效果,这不坑爹么……

的确坑爹,但是,对于没有不透明的图片呢?对于只有主图像,没有半透明效果要求的图片呢?整个游戏绝大部分都是这类贴图,全部换成索引,不单原效果没变,而且速度会比RGB快!(两倍左右吧)

而且,难道读入游戏之后,不可以再作半透明处理么?完全没有必要把原图就射成半透明

第二,源码上的设置

在讲述方法之前,首先来看看一个比较原始,也比较完整的PNG读取显示代码(出处Delphi原版复刻,作者weyl):
  1. //显示tif, png, jpg等格式图片

  2. procedure display_img(file_name: PChar; x, y: integer); overload;
  3. var
  4.   image: PSDL_Surface;
  5.   dest: TSDL_Rect;
  6. begin
  7.   if fileexists(file_name) then
  8.   begin
  9.     image := IMG_Load(file_name);
  10.     if (image = nil) then
  11.     begin
  12.       MessageBox(0, PChar(Format('Couldn''t load %s : %s',
  13.         [file_name, SDL_GetError])), 'Error', MB_OK or MB_ICONHAND);
  14.       exit;
  15.     end;
  16.     dest.x := x;
  17.     dest.y := y;
  18.     if (SDL_BlitSurface(image, nil, screen, @dest) < 0) then
  19.       MessageBox(0, PChar(Format('BlitSurface error : %s', [SDL_GetError])), 'Error', MB_OK or MB_ICONHAND);

  20.     SDL_FreeSurface(image);
  21.   end;
  22. end;
复制代码
以上代码已经包括了PNG显示的几个大的部分:定义图像,读取图像,设定显示位置,画图,释放图像

如果忽略安全判断(就是如果图像不存在啊,输入错误等),代码会简化成这样:
  1. //显示tif, png, jpg等格式图片

  2. procedure display_img(file_name: PChar; x, y: integer); overload;
  3. var
  4.   image: PSDL_Surface;
  5.   dest: TSDL_Rect;
  6. begin
  7.     image := IMG_Load(file_name);
  8.     dest.x := x;
  9.     dest.y := y;
  10.     SDL_BlitSurface(image, nil, screen, @dest);
  11.     SDL_FreeSurface(image);
  12. end;
复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要成为铁血侠客

x
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2011-11-22 00:24 | 显示全部楼层
这种图哪个mod中用过……
全部场景拼图都是这个格式吗?

点评

当然经过测试才会写出来的,至于哪个MOD,你懂的何必问呢~  发表于 2011-11-22 09:23
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

小黑屋|手机版|铁血丹心

GMT+8, 2024-6-9 18:41

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表