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

之前有把《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 。

1static void 2cb_display() { 3 // logv("cb_display"); 4 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 5 6 draw_heightmap(); 7 draw_skybox(); 8 draw_particle(); 9 10 glutSwapBuffers(); // or we can simply call glFlush 11}

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

Heightmap

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )