在还没有研究Android的原生(Native)开发之前,就一直很好奇google用的是哪一种OpenGL ES的实现,也写过一些Java 3D的代码去测试3D的性能,但结果很不理想(http://blog.sina.com.cn/s/blog_4a0a39c30100auh6.html),显示一个MD2低模,也只能达到 6FPS左右,后来也尝试过通过SDL来实现的3D:TinySDGL,gears Demo能达到14 FPS左右,但显示MD2低模,可能也好不到哪去。
后来有时间下载了Android的代码,在翻阅代码的时候,发现 $android_src/frameworks/base/opengl/tests 竟然有一个angeles目录,San angeles是OpenGL ES 2005编程挑战赛的一个项目,它是一个OpenGL ES的自运行演示程序,包含超过60000 render faces,看样子Google是想port这个项目来做测试。
因为用的Cygwin+Toolchain环境,源码中的Android.mk编译不过去,于是就写了个简单的Makefile,如下:
# Compiler, linker, lib and other tools
CC = arm-eabi-gcc LD = arm-eabi-g++ RM = rm -f
CFLAGS = -O2 -include AndroidConfig.h -DANDROID CFLAGS+= -msoft-float -fpic / -ffunction-sections / -funwind-tables / -fstack-protector / -fno-short-enums / -fomit-frame-pointer LDFLAGS = -s -nostdlib -Bdynamic -Wl,-T,armelf.x -Wl,-dynamic-linker,/system/bin/linker LDFLAGS+= -Wl,--gc-sections / -Wl,-z,nocopyreloc / -lc -lm -lGLES_CM
#android dir LIB_DIR = /cygdrive/e/toolchain/arm-eabi/lib CRT_OBJS= $(LIB_DIR)/crtbegin_dynamic.o $(LIB_DIR)/crtend.o
# Variables OBJS = app-linux.o demo.o
# Targets all: angeles
angeles: $(OBJS) $(LD) $(LDFLAGS) -o $@ $(OBJS) $(CRT_OBJS)
push: angeles adb push angeles /dev/sample/angeles adb shell chmod 777 /dev/sample/angeles
clean: $(RM) *.o angeles
app-linux.o: app.h demo.o: app.h shapes.h cams.h
|
启动模拟器,进入目录编译即可:
$make
$make push
$adb shell ./dev/sample/angeles &
如果一切顺利,看看你的模拟器,你将看到有点卡的一些画面,包括一些圆开或柱形,然后镜头在自动移动,如图:
在源码app-linux.c的201行,加入如下代码:
printf("GL_VENDOR:/t%s/n", glGetString(GL_VENDOR)); printf("GL_RENDERER:/t%s/n", glGetString(GL_RENDERER)); printf("GL_VERSION:/t%s/n", glGetString(GL_VERSION)); printf("GL_EXTENSIONS:/t%s/n", glGetString(GL_EXTENSIONS)); |
重新编译运行,命令行会显示:
GL_VENDOR: Google Inc. GL_RENDERER: Android PixelFlinger 1.0 GL_VERSION: OpenGL ES-CM 1.0 GL_EXTENSIONS: GL_OES_byte_coordinates GL_OES_fixed_point GL_OES_single_precisi on GL_OES_read_format GL_OES_compressed_paletted_texture GL_OES_draw_texture GL_ OES_matrix_get GL_OES_query_matrix GL_ARB_texture_compression GL_ARB_texture_non _power_of_two GL_ANDROID_direct_texture GL_ANDROID_user_clip_plane GL_ANDROID_ve rtex_buffer_object GL_ANDROID_generate_mipmap |
从上面的信息可以看出,Android用的是soft render,是Google自已写的PixelFlinger,支持的扩展不是很多,虽然有点卡,但整体效果还是不错的,我在Win32上面跑这个Demo也不是很流利,Android能达到这个效果已经很不错了。
通过这个例子,基本上证明在Native上开发3D程序是可行的。于是又写了两个简单的demo做测试,如下图所示,第一个demo,最经典三角形:
分享到:
相关推荐
Flutter与Android Native原生进行混合开发(flutter module),Flutter和Android Native相互跳转,Flutter和Android Native进行通信的示例Demo 有Flutter官方API和引入FlutterBoost两种方式,具体可以看我的博客 第一...
Android和ReactNative混合开发Demo,包含Android原生加载RN页面,Android原生调用RN函数,RN函数调用原生函数
该组件用于React-Native中获取Android原生层面的键盘响应事件,目前开发者本人的主要使用场景是Android-TV端获取遥控器的按键事件。
基于ReactNative 的 android原生组件模块的工具箱
6个android原生开发小游戏
ReactNative与Android原生简单交互,有什么不对的地方请指教。
RN与android混合开发及RN调用原生方法
Android开发之原生定位的方法(GPS,网络定位)更多查看我的博客:https://blog.csdn.net/xiayiye5/article/details/83686286
react-native 调用android原生模块-Toast 学习笔记
原生NDK的公布可以让开发者更加直接的接触Android系统资源,并使用传统的C或C++语 言编写程序,并在程序封包文件(.apks)中直接嵌入原生库文件。NDK的公布让原来从事C语言 开发者也参与到Android平台,也让java...
Android原生人脸识别,包含Camera和Camera2两种实现方法
android原生系统签名文件 (也可通过以下网址下载 http://androidxref.com/9.0.0_r3/xref/build/target/product/security/
这是一个 Playground 项目,探索 Android Gradle 插件 1.1.0 版发布的全新原生 Android 单元测试支持。 有关进一步阅读,请参阅。 ##用法 git clone https://github.com/a11n/android-native-unit-testing.git ...
Android开发的原生登陆界面。支持手机横屏和竖屏。
基于原生相机的二次开发源码可以设置包括分辨率、闪光灯、构图、触屏拍照等信息
android 原生日期组件,kycalendar android 原生日期组件.zip 功能: 1) 可自定义日期格式, 2)支持滑动翻滚月份
Android原生开发跳转到某个RN单页面的demo。 目前公司项目全部采用原生开发,现在想提升开发效率,把部分Android,iOS两端公共高复用的界面使用RN去做。就需要在原有的项目基础上加入RN并且单独跳转到不同的RN界面去...
OpenGLES20是安卓源码树下的opengl开发例子工程,用eclipse建的工程,我在里面加上了地球和月亮的球体+纹理,还有用点精灵绘画的夜空星星。纯粹是工作之余学习记录,有需要的下载参考,我也是参考网上的帖子搞的。...
Android原生方式实现程序夜间模式,相应文档地址: http://blog.csdn.net/qq_23383563/article/details/52493320
opencv_native_androidstudio, 一个带有原生Opencv的Android Studio 项目 原生OpenCV与 Android Studio这个应用程序是一个示例 Android Studio 项目( 在版本 3.0上测试),带有原生 OpenCV 。它获得相机框架,使JNI...