铁血丹心

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

[lua复刻] savesur和freesur

[复制链接]
发表于 2017-11-2 16:35 | 显示全部楼层 |阅读模式

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

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

x
这两个设计必须配对,实际上存在一定问题,如果某个函数在中间返回,则可能配不上对,然后造成缓存很快就满了。

这样干脆不free了,到了一定程度自动清理。
代码:

  1. #define SURFACE_NUM  20
  2. std::map<int, SDL_Texture*> tmp_Surface;
  3. int tmp_Surface_count = 0;
  4. //保存屏幕到临时表面
  5. int JY_SaveSur(int x, int y, int w, int h)
  6. {
  7.     int id = tmp_Surface_count;
  8.     int i;
  9.     SDL_Rect r1;
  10.     if (w + x > g_ScreenW) { w = g_ScreenW - x; }
  11.     if (h + y > g_ScreenH) { h = g_ScreenH - h; }
  12.     if (w <= 0 || h <= 0) { return -1; }
  13.     r1.x = x;
  14.     r1.y = y;
  15.     r1.w = w;
  16.     r1.h = h;

  17.     tmp_Surface[id] = SDL_CreateTexture(g_Renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, w, h);
  18.     SDL_SetRenderTarget(g_Renderer, tmp_Surface[id]);
  19.     SDL_RenderCopy(g_Renderer, g_Texture, &r1, NULL);
  20.     tmp_Surface_count++;

  21.     if (tmp_Surface_count % 10 == 0 && tmp_Surface_count > SURFACE_NUM)
  22.     {
  23.         for (auto it = tmp_Surface.begin(); it != tmp_Surface.end();)
  24.         {
  25.             if (it->first < tmp_Surface_count - SURFACE_NUM)
  26.             {
  27.                 SDL_DestroyTexture(it->second);
  28.                 it = tmp_Surface.erase(it);
  29.             }
  30.             else
  31.             {
  32.                 it++;
  33.             }
  34.         }
  35.     }
  36.     JY_Debug("total temp surface: %d, real: %d", tmp_Surface_count, tmp_Surface.size());
  37.     return id;
  38. }

  39. int JY_LoadSur(int id, int x, int y)
  40. {
  41.     if (id < 0 || id >= tmp_Surface_count)
  42.     {
  43.         return 1;
  44.     }
  45.     if (tmp_Surface.count(id) == 0)
  46.     {
  47.         return 1;
  48.     }
  49.     SDL_Rect r1;
  50.     r1.x = (Sint16)x;
  51.     r1.y = (Sint16)y;
  52.     SDL_QueryTexture(tmp_Surface[id], NULL, NULL, &r1.w, &r1.h);
  53.     SDL_SetRenderTarget(g_Renderer, g_Texture);
  54.     SDL_RenderCopy(g_Renderer, tmp_Surface[id], NULL, &r1);
  55.     return 0;
  56. }

  57. int JY_FreeSur(int id)
  58. {
  59.     return 0;
  60. }
复制代码


【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2017-11-2 17:30 | 显示全部楼层
这个设定比较合理,
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2017-11-2 17:31 | 显示全部楼层
lua又有代码更新了。。。。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
发表于 2017-11-16 12:48 | 显示全部楼层
这个算法会不会导致永远只有map的前半部分数据被释放?
或许LZ可以针对该问题将代码精进。
最后晚辈只是一个弱鸡。
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。
 楼主| 发表于 2017-11-17 01:13 | 显示全部楼层
aawc1144 发表于 2017-11-16 12:48
这个算法会不会导致永远只有map的前半部分数据被释放?
或许LZ可以针对该问题将代码精进。
最后晚辈只是 ...





完美的方法是修改lua的垃圾收集器自动释放
【武侠.中国】铁血丹心论坛(大武侠):致力于推广和发展武侠文化,让我们一起努力,做全球最大的武侠社区。
可能是目前为止最好的金庸群侠传MOD游戏交流论坛,各种经典武侠游戏等你来玩,各种开源制作工具等你来实现你的游戏开发之梦。

本版积分规则

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

GMT+8, 2024-11-21 20:55

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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