文档章节

OpenGL ES 小例子在笔记本上崩溃问题

ylme
 ylme
发布于 2017/03/29 23:37
字数 633
阅读 36
收藏 0

之前有把《OpenGL ES 应用开发指南 Android 卷》书中示例代码移植到 Windows 上的 MinGW 平台。在移植 Heightmap 示例时一开始在公司电脑上是可以运行的。回到家自己的笔记本电脑运行确神奇的崩溃了。后面初步定为是生成地形时顶点数太多导致的。我的笔记本显卡是 Geforce 820M 。生成的地形顶点有 30w+ ,按理说不会这么脆弱吧,连几十万个顶点都绘制不了。因为书中采用的生成地形并绘制的方式超级的简单,并没有做优化,这样的好处有利于初学者理解概念,如果能用 Instance Draw 绘制方式可以优化很多。

我一开始想法就是这样的,认为是程序问题,要靠优化解决问题。所以挂起了一个 issue 等之后再处理。最近碰巧有空了就想用个简单的办法来处理。于是用 GL_TRIANGLE_STRIP 来代替 GL_TRIANGLES 绘制,这样地形顶点可以减少到 13w+ ,开心而期待的编译然后运行发现还是崩了。这时真的到我郁闷了。我之所以不想尝试 Instance Draw 因为不想太过修改书中的逻辑,想尽量让示例程序简单。

后面就想用 Vertex Array Object 会不会有效果,然后就是改代码尝试。最后偶尔的机会发现下面的绘制代码中,只要 draw_heightmapdraw_particle 不同时进行,程序就不会崩溃。draw_particle 绘制粒子时都没有用 Buffer Object 。

static void
cb_display() {
	// logv("cb_display");
   	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

   	draw_heightmap();
   	draw_skybox();
   	draw_particle();
	
	glutSwapBuffers(); // or we can simply call glFlush
}

于是幡然醒悟。可能问题并不在于优化方面,而是绘制粒子系统时出了问题。然后就开始采用 Buffer Object 传递数据,想试试会不会出现奇迹。果然奇迹出现了。程序正常运行了。

Heightmap

这其实就是一个很普通不过的小问题。之所以还特地写篇博客是因为标记一下并不是出了问题,一定要往底层优化上面考虑。日常开发中出现了 bug ,当未能直观解决时,总会就下定论是底层问题,最后偶然机会找到原因时发现还是自己的逻辑有问题。所以当出现问题时,能静下心来认真分析写过的代码,给出客观的分析。

© 著作权归作者所有

共有 人打赏支持
ylme
粉丝 12
博文 42
码字总数 42711
作品 0
广州
程序员
私信 提问
多平台游戏渲染开发

多平台游戏渲染开发 跨平台移动应用开发的渲染解决方案综述 在移动设备上做应用/游戏开发,实现跨平台是主流。对于应用/游戏的逻辑功能和核心算法部分,如果是用C++进行开发的,因为iOS/And...

失足处男的倒霉孩子
2013/12/25
1K
0
OpenGL ES 3.1 发布,Tegra/PowerVR均已支持

一月初的CES 2014大会上,Khronos Group简短预告了新版本的OpenGL ES,当时称之为OpenGL ES Next,而在GDC 2014大会即将开幕之际,Khronos Group正式发布了新的“OpenGL ES 3.1”。 OpenGL E...

oschina
2014/03/18
2K
2
Android图形---OpenGL(二)

本文译自:http://developer.android.com/guide/topics/graphics/opengl.html OpenGL 包 一旦使用GLSurfaceView和GLSurfaceView.Renderer类给OpenGL建立了一个View容器,那么就可以开始使用以...

长平狐
2012/10/16
81
0
OpenGL ES Programming Guide for iOS 第一章

关于OpenGL ES Open Graphics Library(OpenGL)用于二维及三维数据的可视化。它是一种多用途的开放标准图形库,支持二维和三维数位内容创作,机械和建筑设计,虚拟样,飞行模拟,游戏,以及更...

长平狐
2012/10/08
459
0
Metal入门教程(八)Metal与OpenGL ES交互

前言 Metal入门教程(一)图片绘制 Metal入门教程(二)三维变换 Metal入门教程(三)摄像头采集渲染 Metal入门教程(四)灰度计算 Metal入门教程(五)视频渲染 Metal入门教程(六)边界检测...

落影loyinglin
2018/08/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

centos7重置密码、单用户模式、救援模式、ls命令、chmod命令

在工作当中如果我们错误的配置了文件使服务器不能正常启动或者忘记密码不能登录系统,如何解决这些问题呢?重装系统是可以实现的,但是往往不能轻易重装系统的,下面用忘记密码作为例子讲解如...

李超小牛子
今天
3
0
Python如何开发桌面应用程序?Python基础教程,第十三讲,图形界面

当使用桌面应用程序的时候,有没有那么一瞬间,想学习一下桌面应用程序开发?行业内专业的桌面应用程序开发一般是C++,C#来做,Java开发的也有,但是比较少。本节课会介绍Python的GUI(图形用...

程序员补给栈
今天
5
0
kafka在的使用

一、基本概念 介绍 Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统...

狼王黄师傅
今天
3
0
Android JNI总结

0x01 JNI介绍 JNI是Java Native Interface的缩写,JNI不是Android专有的东西,它是从Java继承而来,但是在Android中,JNI的作用和重要性大大增强。 JNI在Android中起着连接Java和C/C++层的作...

天王盖地虎626
昨天
3
0
大数据教程(11.8)Hive1.2.2简介&初体验

上一篇文章分析了Hive1.2.2的安装,本节博主将分享Hive的体验&Hive服务端和客户端的使用方法。 一、Hive与hadoop直接的关系 Hive利用HDFS存储数据,利用MapReduce查询数据。 二、Hive与传统数...

em_aaron
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部