目前在做一个游戏,原来J2ME上的,移到android倒是不复杂,在Canvas绘图这个系统里,封装Image,封装Graphics这些都很容易,该优化的也优化了,但由于有些地方一屏里绘制了较多图片,性能相当不给力。
android既然提供了OpenGL ES,相比硬件图形处理比Canvas这种东东要给力的多,但这个转换也不是那么容易做,网上也没啥这方面介绍,有人做过这方面工作吗?交流交流吧。

首先Canvas不可能直接转化为OpenGLES(否则Google就这样运行Android UI岂不是很快,何必源码中不用),最多只能将Canvas内容绘制到Bitmap上,然后在GLSurfaceView中利用Android提供的GLUtils.texImage2D函数将其当作纹理贴到手机屏幕上,但这样100%会变得比原来还慢(纹理转换很耗时间:(……)

更何况GLES也不是万灵丹,如果真机硬件性能不成,GLES也未必就比Canvas更快,甚至可能低于Canvas(某些该死的低端Android机GLES其实是软件渲染,调用OpenGLES将比Canvas还慢)。

我个人认为,Canvas虽然性能较GLES方法为低(一个配置到位的SurfaceView,和一个配置到位的GLSurfaceView,其实最多也就差10FPS左右),但贵在兼容性够高,只要是Android系统就肯定能跑,而且无论低端或高端机上的表现都相对稳定。如果仅开发2D游戏,除即时战略类型外,基本上也还算得够用。

对于您的游戏帧率过低问题,小弟以为还是应该从您自己游戏方面找原因,比如是不是可以重用的画面没有缓存成一个Bitmap(即使是OpenGLES开发,遇到某一组图片会在一起反复出现时,通常也会将它们绘制到一起作为单独的Texture,而不是分别渲染到屏幕),是不是可以使用RGB565或ARGB4444的Bitmap却使用了ARGB8888,有没有直接使用旋转或缩放图片功能而不是现成的Bitmap贴图(在Android中无论是使用Matrix的scale、rotate等特效方法,还是Canvas的,全部慢的惊人,所以这些特效绝对要直接贴图(至少要绘制完毕后缓存结果成一个Bitmap,再读时利用缓存而不重新运算),一定不能靠这些现成函数去完成)。

还有通过getHolder获得SurfaceHolder后,您有没有将其设置为setType(SurfaceHolder.SURFACE_TYPE_HARDWARE)尝试硬件加速(看真机,试试也没坏处),有没有设置SurfaceHolder为setFormat(PixelFormat.RGB_565) 以减少Canvas本身的渲染损耗,有没有停止Android内置缓存,设置View为setWillNotCacheDrawing(false);setWillNotDraw(false);(这个也看真机,有些真机开缓存反而更快)要知道以上种种因素都会制约您的Canvas速度。

话说我用Canvas做弹幕都可以跑50FPS以上(320x480屏幕,如果是480x800会降到40FPS以上),注意以上几点,每帧几百次drawBitmap应该不会有大问题,至少也该有20多FPS吧……
__________________

先自己调调试试,实在不成把GLES做成J2ME样式的封装,也是出路(比如glColor4f基本等价setColor,glTranslatef基本等价translate,drawImage时就用glDrawArrays堆图像顶点,也无非是封装那些绘图API的事)……

非常感谢2楼。。。
不到万不得已,自然不会考虑改成GLES的,目前工期还是比较紧。但当前的帧率确实太有问题了,每帧300次左右的绘图,FPS只有8帧左右。。。
绘图重用画面之类的问题应该没有了,之前的引擎这方面应该没啥问题,有些地方确实用了ARGB8888创建图片,数量还不少,因为要画许多透明色,没办法,当然可以做采样,把不必要的改成RGB565或ARGB4444这些16位的,但今天我试了下全部写成RGB565,不画透明色,也没快几帧。。。
封装了J2ME里Craphics的drawRegion来画翻转之类,估计这个得改成加载时直接创出翻转后的Bitmap,但感觉用的地方也不多。。。
还有个问题是现在用的卡马可卷轴,我在考虑直接在内存中开出一块儿整张地图来每帧画背景,不使用卷轴的Tile算法,反正内存大,不知道有没有帮助。。。
另外你说的设置SurfaceHolder还没试过,回头试试看。。。
头疼啊,看到有英文介绍android游戏优化的达人推荐必使用GLES,说在绘制很多图片时性能跟Canvas有本质差别,心里有些忐忑,这样搞的话,不知道时间来不来得及,纠结啊。。。

转载于:https://www.cnblogs.com/dint/articles/5241580.html

android Canvas OpenGLES相关推荐

  1. android 画布控件,Android canvas画图操作之切割画布实现方法(clipRect)

    本文实例讲述了Android canvas画图操作之切割画布实现方法.分享给大家供大家参考,具体如下: android切割画布的历程不算很难,可是理解起来也比较麻烦,这里写一下我的理解 但是不一定正确 ...

  2. Android Canvas类介绍和Android Draw Rect 坐标图示

    当我们调整好画笔之后,现在需要绘制到画布上,这就得用Canvas类了.在Android中既然把Canvas当做画布,那么就可以在画布上绘制我们想要的任何东西.除了在画布上绘制之外,还需要设置一些关于画 ...

  3. android canvas添加文字居中,android Canvas drawText 文字居中

    1首先利用canvas获取画布的宽高, //获取屏幕的宽和高 int width = canvas.getWidth(); int height = canvas.getHeight(); 2获取文字 ...

  4. android 自定义画笔,在Android Canvas中使用撤销/重做操作的自定义画笔

    我想使用自定义画笔&撤消/重做操作实现画布绘制应用程序.首先,我的代码完美工作,无需使用自定义画笔(包括撤消/重做操作).根据这个答案How to make custom brush for ...

  5. Android Canvas类

    1. Canvas类 Canvas主要用于2D绘图,它提供了很多相应的drawXxx()方法,Canvas的获取方式有三种 重写View的onDraw(Canvas)方法 @Override prot ...

  6. Android Canvas总结

    0x00 前言 在Android开发中,有时产品需求会要我们实现一个复杂的控件,如果控件不是常用的类型,这时候我们不得不写一个自定义的控件来实现. 自定义一个控件,目前一般通过继承View或者Surf ...

  7. android Canvas 最基础知识总结

    学习Canvas 要先学习view 知识,这样才好学习 第一步 创建一个方法 让它继承 View 如下图 然后快捷键ait+/ 生成构造方法, 用来初始化View ,比如自定一个一些init()方法, ...

  8. android canvas绘制圆角_Android自定义View撸一个渐变的温度指示器(TmepView)

    秦子帅明确目标,每天进步一点点..... 作者 |  andy 地址 |  blog.csdn.net/Andy_l1/article/details/82910061 1.概述 自定义View对需要 ...

  9. android canvas 保存图片,ionic3 html5 video 抓图保存到手机相册,解决Android手机不支持Canvas drawImage问题...

    当然百度出上W条答案 上代码,相信下面代码和小伙伴大同吧 相信好多做webview app的小伙伴们都有同样的问题,在pc上能轻松实现video 抓图.但是在android手机大多是不支持canvas ...

最新文章

  1. SQL基本点—— 思维导图
  2. python中 str.strip()用法
  3. 旧金山漫记(四):夜困火车站
  4. php curl模拟https请求
  5. keyloadtool_phoenix 利用CsvBulkLoadTool 批量带入数据并自动创建索引
  6. laravel-admin grid中使用的switch必须form中同时具有switch才能生效的解决方案
  7. 简直要逆天!超炫的 HTML5 粒子效果进度条
  8. Linux Socket C语言网络编程:Select Socket
  9. 谷歌浏览器设置请求头_2020年 谷歌SEO优化 十大技巧(四)
  10. Python-字典遍历
  11. 零基础Python知识点回顾(三)
  12. 不确定性原理的前世今生 · 数学篇(二)
  13. 【ANSYS命令流】模型的建立(二):其他相关命令(图形控制、节点单元选择等)
  14. 兄弟打印机内存已满清零方法_打印机内存已满怎么处理
  15. Axure 9 简介【原型工具】
  16. alios thing - rhino内核 - 内存管理
  17. 在ESC云服务器中部署KodCloud云盘系统(四)
  18. PPI (手机屏幕的PPI 和计算方法)
  19. Ubuntu 11.04 安装后要做的20件事情
  20. 都要和硬件工程师“作对”吗?

热门文章

  1. 【改进篇】Python实现VRP常见求解算法——禁忌搜索算法(TS)
  2. Win 10装机量占据全球台式机总量的5%
  3. 帝国 ajax评论插件,帝国cms评论仿畅言评论插件兼容7.0/7.2版本
  4. postman 设置 中文版 9.2.0 汉化
  5. 2ASK的调制解调,编码解码,还有它的误码率,功率谱(语音信号的)
  6. 【小甲鱼C语言】课后笔记第一章第三节——常量和宏定义
  7. 【知识积累】saturn集成springboot2.*
  8. 在itext2.1.4中的pdfPcell没有行合并(setRowspan),只有列合并的处理方法
  9. Github Star 7.2K,超级好用的OCR数据合成与半自动标注工具,强烈推荐!
  10. asp.net网上商城系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目