铁血丹心

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

[通用] 解决播放动画会卡的问题

[复制链接]
发表于 2013-1-19 11:32 | 显示全部楼层 |阅读模式

马上注册,结交更多侠友!

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

x
本帖最后由 weyl 于 2013-1-19 11:41 编辑

目前论坛上很多改版游戏,在战斗或事件播放动画时,常常会失去响应,鼠标要停止一段时间,有时甚至画面停顿。很多建议是使用兼容模式。

经我分析,这是由于在播放这些动画时,大致使用了这样的语句:
  1. for i := beginpic to endpic do
  2.   begin
  3.     DrawSomething;
  4.     SDL_UpdateRect(screen, 0, 0, screen.w, screen.h);
  5.     sdl_delay(20);
  6.   end;
复制代码
这类语句在执行时不接受外来事件,所以时间一长可能卡死。建议改成这样:
  1. i := beginpic;
  2.   while (SDL_PollEvent(@event) >= 0) do
  3.   begin
  4.     DrawSomething;
  5.     SDL_UpdateRect(screen, 0, 0, screen.w, screen.h);
  6.     sdl_delay(20);
  7.     i := i + 1;
  8.     if i > endpic then break;
  9.   end;
复制代码
这样在动画过程中仍能接受外来事件,就不会卡死了。

我没有严格试过,但是理论上应该能解决问题。

【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-1-19 22:41 | 显示全部楼层
就是这个问题,lua版的循环內加个getkey就好了
当初也是困扰了我很久

点评

其实原理就是让PollEvent没事就出来溜溜  发表于 2013-1-20 16:58
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-1-20 17:06 | 显示全部楼层
不过为什么不这样就会卡?我一直都没弄明白

点评

KA
类似于doevents吧,不会卡进程了  发表于 2013-1-21 12:40
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-4-22 14:58 | 显示全部楼层
我来测下        
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-5-13 09:51 | 显示全部楼层
回复 KA 的帖子

while 在外围,明显就是一个悲剧。。。
其实原来的代码不变,在for循环最后一行加上这么一句就可以了 SDL_PollEvent(0)

点评

循环内加上PollEvent, 和检查一些公用事件的就可以了。  发表于 2013-5-13 15:54
我觉得不用判断这个值啊。。。本身又不拿来用 - -  发表于 2013-5-13 10:39
KA
俺后面解决了,似乎要pollevent>0  发表于 2013-5-13 10:09
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2013-5-13 09:33 | 显示全部楼层
今日试了下lua版,基本代码是场景变暗,效果不是很理想求解答


  1.         i = 0;
  2.     while(SDL_PollEvent(&event))
  3.         {
  4.         if(Flag==0)
  5.                         step=i;
  6.             else
  7.                         step=32-i;

  8.         t1=(int)JY_GetTime();

  9.         SDL_FillRect(g_Surface,NULL,0);          //当前表面变黑

  10.         alpha=step<<3;
  11.                 if(alpha>255)
  12.                         alpha=255;

  13.         SDL_SetAlpha(lps1,SDL_SRCALPHA,(Uint8)alpha);  //设置alpha


  14.                 SDL_BlitSurface(lps1 ,NULL,g_Surface,NULL);

  15.         JY_ShowSurface(0);

  16.         t2=(int)JY_GetTime();

  17.                 if(delaytime > t2-t1)
  18.                         JY_Delay(delaytime-(t2-t1));
  19.                 i++;
  20.                 if(i>32)break;
  21.         }
复制代码
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

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

GMT+8, 2024-12-22 01:53

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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