首页 » 技术文章 » Unity游戏性能优化时的截图方案分析

Unity游戏性能优化时的截图方案分析

 

前言

在进行Unity游戏的优化时,除了需要收集各种数据,也需要将此时的游戏画面截取下来,以便辅助定位问题。

那么,常用的截屏方法都有哪些优缺点呢?

截图常用方法

常用的截屏几种方法:

1.使用Application类下的CaptureScreenshot方法

E.g: Application.CaptureScreenshot("Screenshot.png");

  • 优点:简单暴力。
  • 缺点:全阻塞型,如果是普通的APP程序,一般问题不大,但应用于游戏时,会导致顿卡,在操作人物走动时截屏,会一卡一卡的。

2. Texture2D.ReadPixels和Texture2D.EncoderToPng方法

目前比较普遍的用法。

原理也很简单,先创建一个指定大小的空白纹理,然后读取屏幕像素信息,最后将纹理数据生成一个图片,然后可以通过控制图片的清晰度来相对控制图片的大小。

  • 优点:对数据操作部分可通过异步处理,相对第一种方法,性能相对好一点。
  • 缺点:读取屏幕信息,生成图片阶段仍然是阻塞型,仍会感到卡顿现象,代码编写相对第一种麻烦点,得多啃几颗瓜子,多敲几行代码。

3. 通过ADB工具

帮助文档:

usage: screencap [-hp] [-d display-id] [FILENAME]  
   -h: this message
   -p: save the file as a png.
   -d: specify the display id to capture, default 0.
If FILENAME ends with .png it will be saved as a png.
If FILENAME is not given, the results will be printed to stdout.

使用相当简单:

adb shell screencap -p/sdcard/testscreen.png

备注:

  1. -d 参数为支持扩展的display设备
  2. 如果文件名以.png结尾时,它将保存为png文件,如果文件名没有给出,则结果被会被输出到stdout(导出会相当的卡)
  • 优点:无需代码基础即可使用。
  • 缺点:需要插根线,极为不便。

 

以上三种方法,无论哪种,对游戏都会产生致命性的干扰,那该怎么破?

我的解决方案

我们想到下面这种解决方案:

编写一个独立APP,专门响应截图,然后通过程序交互的通信方式完成截屏。

  • 优点: 解决在截屏时刻导致游戏卡顿现状了。
  • 缺点:因为性能监控是以SDK包方式提供,需要额外梱绑安装一个应用,让人讨厌。由于不同系统对后台运行的APP有限制,存在被杀的风险。

 

如何才能在不影响游戏正常运行的情况下,成功截取游戏画面呢?最终,将截屏代码提到jar及so文件上,暴露接口供unity调用,起到了非常好的效果。

更多详细请访问TestPlus官网,参考Unity性能调优SDK接入DEMO。

 

本文作者:辉辉

原文链接:Unity游戏性能优化时的截图方案分析,转载请注明来源!

7