频繁调用getpixels 增大mono内存

哇 好久不写了 发现坚持写点东西真的有点难

  最近发现一个问题,在写一些接口的时候 有频繁从图片里面扣一块一块的小图 代码大概是这么写的

var pixels = tex.getPixels(x, y, width, height);
var tex = new Tex2D(...);
tex.SetPixels(x2, y2, width2, height2, pixels);
tex.Apply();

  那我的关注点在于new 出来的图片的内存大小,但是我忽略了频繁操作对于 pixels 在mono堆上分配的内存。测了一下 发现mono被撑大到300多m 真可怕。。

所以写这篇文章 是想说一下解决这个问题的思路

  1.那你频繁分配,那我做缓存好了嘛。于是产生了18个大大小小不一致的 Color数组 嗯 看了一下 挺大的 。
  2.那我自己实现getpixels 呗,不用你native的自己扣了,想了一下还是没办法避免在mono上不分配内存
  3.我使用最大的1024*1024的 color数组,看你native代码抛异常么,(这个时候就无比想念c++的指针),结果发现可行,实际上处理也应该就是自己截取了需要的部分。毕竟不需要的数据,后者不取截断即可。

var pixels = new Color[1024 * 1024]; //缓存下来
var tex = new Tex2D(...);
tex.SetPixels(x2, y2, width2, height2, pixels);
tex.Apply();
总结一下

  我没有跑真机测,editor下看 一个1024 * 1024 的color数组 mono内存会大15MB左右,emm确实很大 但是已经可以达到我的目标需求了,可以进一步优化。
  之前弄recast导航相关的c++接口的时候,也遇到过从c#传递数组到c++类似的一些问题,实际上也是把数组首地址传过去了(我比较懒,没有深入分析),之前遇到传结构体的问题还是没改好,内存布局不一致不太好解决,后来想,好像确实没有什么库的接口是传结构体的吧(参考fmod),我也就大概看了一眼,毕竟不是特别感兴趣 哈哈哈

你可能感兴趣的:(频繁调用getpixels 增大mono内存)