游戏开发论坛

 找回密码
 立即注册
搜索
查看: 8436|回复: 11

大家帮忙看看这个函数该如何优化,不知为什么Asphyre贴BMP

[复制链接]

2

主题

22

帖子

22

积分

注册会员

Rank: 2

积分
22
发表于 2005-10-20 01:17:00 | 显示全部楼层 |阅读模式
Function GetAsphyreImage(Bmp:TBitmap;Image:TAsphyreImage):integer;
var
Target  : TBitmap;
Index   : Integer;
ScanIndx: Integer;
LineConv: TLineConvFunc;
AuxMem  : Pointer;
MemAddr : Pointer;
MemPitch: Integer;
Point   : TPoint;
begin
  if Bmp=nil then
  begin
    Result:=errBitmapLoad;
    Exit;
  end;
  Point.X:=Bmp.Width;
  Point.Y:=Bmp.Height;
  with Image do
  begin
    PatternSize:=Point;
    PatternCount:=1;
    TextureSize:=Point;
    TextureCount:=1;
  end;
  Target:= TBitmap.Create();
  try
    TileBitmap(Target, Bmp, Image.TextureSize, Image.PatternSize, Image.PatternSize, true,0, 0);
    Image.TextureCount:= Ceil(Target.Height / Image.TextureSize.Y);
    Result:= Image.Initialize;
    if (Result <> errNone) then Exit;
    LineConv:= GetLineConv32toX(D3DToFormat(Image.SurfaceFormat));
    for Index:= 0 to Image.TextureCount - 1 do
    begin
      Result:= Image.Lock(Index, MemAddr, MemPitch);
      if (Result <> errNone) then Break;
      for ScanIndx:= 0 to Image.TextureSize.Y - 1 do
      begin
        AuxMem:= Target.Scanline[(Index * Image.TextureSize.Y) + ScanIndx];
        LineConv(AuxMem, MemAddr, Image.TextureSize.X);
        Inc(Integer(MemAddr), MemPitch);
      end;
      Result:= Image.Unlock(Index);
      if (Result <> errNone) then Break;
    end;
  finally
    Target.Free();
  end;
end;

2

主题

22

帖子

22

积分

注册会员

Rank: 2

积分
22
 楼主| 发表于 2005-10-21 18:15:00 | 显示全部楼层

Re:大家帮忙看看这个函数该如何优化,不知为什么Asphyre贴B

经过优化,性能提升了不少,但资源占用还是很高,不知道还能不能优化,或是能直接在Asphyre中贴24位位图的方法,或是其它提升性能的方法。
Function LoadFromBMP(Bitmap:TBitmap;Image:TAsphyreImage):integer;
  type
    PRGBRec = ^TRGBRec;
    TRGBRec = packed record
      b, g, r: Byte
    end;

    PARGBRec = ^TARGBRec;
    TARGBRec = packed record
      b, g, r, a: Byte
    end;

  procedure FLineConv(ps: PRGBRec; pt: PARGBRec; sz: integer);
  var
    i: integer;
  begin
    for i:=0 to sz-1 do begin
      pt^.r := ps^.r;
      pt^.g := ps^.g;
      pt^.b := ps^.b;
      pt^.a := 255;
      Inc(ps);
      Inc(pt);
    end;
  end;
var Index   : Integer;
    Point   : TPoint;
    AuxMem  : Pointer;
    MemAddr : Pointer;
    MemPitch: Integer;
    ScanIndx: Integer;
begin
  Result:=errNone;
  Point.X:=Bitmap.Width;
  Point.Y:=Bitmap.Height;
  Image.PatternSize:=Point;
  Image.PatternCount:=1;
  Image.TextureSize:=Point;
  Image.TextureCount:=1;
  Image.Initialize;

  for Index:= 0 to Image.TextureCount - 1 do
  begin
    Result:= Image.Lock(Index, MemAddr, MemPitch);
    if (Result <> errNone) then Break;
    for ScanIndx:= 0 to Image.TextureSize.Y - 1 do
    begin
      AuxMem:= Bitmap.Scanline[(Index * Image.TextureSize.Y) + ScanIndx];
      FLineConv(AuxMem, MemAddr, Image.TextureSize.X);
      Inc(Integer(MemAddr), MemPitch);
    end;
    Result:= Image.Unlock(Index);
    if (Result <> errNone) then Break;
  end;
end;

2

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2005-10-24 00:12:00 | 显示全部楼层

Re:大家帮忙看看这个函数该如何优化,不知为什么Asphyre贴B

使用VTDTool.exe的文件方式加载BMP文件 如果文件是24位格式的不就可以了么?

27

主题

295

帖子

305

积分

中级会员

Rank: 3Rank: 3

积分
305
发表于 2005-10-24 03:14:00 | 显示全部楼层

Re:大家帮忙看看这个函数该如何优化,不知为什么Asphyre贴B

搞不懂你???函式的用途?
Asphyre本身就有很多?功能...

2

主题

22

帖子

22

积分

注册会员

Rank: 2

积分
22
 楼主| 发表于 2005-10-24 10:08:00 | 显示全部楼层

Re:大家帮忙看看这个函数该如何优化,不知为什么Asphyre贴B

因为我的Bitmap不是从文件加载的,是在内存中获取的,但Asphyre并没有把Surface公布出来供大家用,而且它的格是也是特定的TAsphyreImage格式,所以我内存中的Bitmap是无法直接画出来的,所以就有了这个函数的产生

2

主题

22

帖子

22

积分

注册会员

Rank: 2

积分
22
 楼主| 发表于 2005-10-24 10:26:00 | 显示全部楼层

Re:大家帮忙看看这个函数该如何优化,不知为什么Asphyre贴B

如果大家还有更好的方法,欢迎继续讨论

27

主题

295

帖子

305

积分

中级会员

Rank: 3Rank: 3

积分
305
发表于 2005-10-24 17:48:00 | 显示全部楼层

Re:大家帮忙看看这个函数该如何优化,不知为什么Asphyre贴B

??了
?是?o法了解你要做甚?
在??却婊袢≈???不是一?右?游募?釉??
何必??麻??
直接?明你要???甚??|西

2

主题

22

帖子

22

积分

注册会员

Rank: 2

积分
22
 楼主| 发表于 2005-10-26 10:02:00 | 显示全部楼层

Re:大家帮忙看看这个函数该如何优化,不知为什么Asphyre贴B

Bitmap不一定从文件加载呀,比如截的屏幕,或者从其它程序传过来的流等等(TAsphyreImage的流加载好像也要是32位的图,不支持24位的),所以要转换,我以上那个函数的效率非常高了,几乎不费时间,问题基本算是解决了吧,便我还是想知道,真的有其它方法吗?好像Asphyre的作者回复别人贴子的时候也没有提到有更好的方法。

2

主题

22

帖子

22

积分

注册会员

Rank: 2

积分
22
 楼主| 发表于 2005-11-3 22:33:00 | 显示全部楼层

Re:大家帮忙看看这个函数该如何优化,不知为什么Asphyre贴B

快疯了,换了个主板,换了块显卡,以上的函数竟画不出图来了,救命呀~~~~~~~~,找不到原因~~~~~~~~~~~~~~~~~~~~~~~~~~~

24

主题

116

帖子

116

积分

注册会员

Rank: 2

积分
116
发表于 2005-11-4 10:21:00 | 显示全部楼层

Re:大家帮忙看看这个函数该如何优化,不知为什么Asphyre贴B

"pngimage143"中的.png格式好像支持流,不知能否解决您的问题。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-21 08:49

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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