minecraft吧 关注:2,568,284贴子:32,078,579

回复:【C++配OpenGL】 编程造MC!!!

取消只看楼主收藏回复

区块16*16*16,200*200个区块,实时生成关了,不用GL_LINE的效果




IP属地:美国201楼2017-01-27 11:33
收起回复
    为了给予自己足够的安慰,先把地形用的区块16*16*256调成16*16*16
    在搞多线程之前做了一个区块框架,可以把区块显示出来


    IP属地:美国202楼2017-01-27 23:43
    回复
      2026-01-07 02:36:25
      广告
      不感兴趣
      开通SVIP免广告
      新年快乐!


      IP属地:美国203楼2017-01-28 00:02
      回复
        多线程生成大概做出来了
        生成线程不停地从一个装满区块指针的地图里把要刷新的区块揪出来,生成数据,然后扔进缓冲区里。
        主线程不停地把缓冲区数据传到Opengl那儿并绘制
        缓冲区模拟了双缓冲区,生成线程用后缓冲区,主线程用前缓冲区,生成线程每次完成更新操作就将缓冲区互换。
        这样可以实现不同步生成,虽然速度不是很快,还会出现随机的访问冲突。。


        IP属地:美国204楼2017-01-28 00:03
        回复
          随机的访问冲突解决了,有些地方没加多线程锁。
          因为主线程和生成线程是同时运行的,有些共享的资源会冲突
          比如装满区块指针的地图,生成线程正用它更新到一半呢,主线程就急着拿去画了,访问能不冲突么
          在生成线程更新的时候加上锁,这样主线程就要等,直到更新完了以后就解锁
          (这样能用,但是主线程要等啊!这等一等的功夫几十fps就没了哈)


          IP属地:美国208楼2017-01-28 12:06
          回复
            在做物品栏,破坏建造方块之前先搞定纹理贴图和区块保存


            IP属地:美国210楼2017-01-28 12:08
            回复
              然而多线程好坑。
              每次程序关闭时,程序又发生冲突
              花了大半天debug, 发现问题是这样的:
              主线程没办法把生成线程关闭,所以主线程就在自己结束时自作主张地把共享的资源都回收掉了
              可生成线程还在工作,然后在处理“空气”时便报错了
              解决方案:主线程用一个bool控制生成线程,结束时把改bool变量,通知生成线程收工,等生成线程停止工作以后再回收资源


              IP属地:美国213楼2017-01-28 21:41
              回复
                制作纹理贴图中,纹理贴图就是把方块都集中在一块儿绘制
                比如说一个方块材质64*64大小,那可以把所有材质8个一行,一共8列的方式存储在256*256的图片里
                绘制的时候只要绑定材质一次,便可以提高效率



                IP属地:美国214楼2017-01-29 08:35
                回复
                  2026-01-07 02:30:25
                  广告
                  不感兴趣
                  开通SVIP免广告
                  每几秒改变一次材质,感觉蛮漂亮的。。。


                  IP属地:美国215楼2017-01-29 08:36
                  回复
                    有白边。。。


                    IP属地:美国216楼2017-01-29 09:27
                    收起回复
                      不会解决白边。。。可能要放弃材质贴图了。。。


                      IP属地:美国220楼2017-01-30 14:38
                      回复
                        修复了一个bug:生成中心位置偏移


                        IP属地:美国223楼2017-01-31 17:27
                        回复
                          区块存储完成!
                          超过渲染距离的区块会被存储,然后释放内存
                          存储的方式非常原始,给每个区块建立一个以其坐标命名的文件,然后把数据塞进去
                          上百个8KB的文件会放在一个Saves的子目录里

                          文件二进制存的,记事本开乱码


                          IP属地:美国224楼2017-01-31 22:14
                          收起回复
                            不知道为何弃坑了,突然惊醒自己贴吧上还有个帖子
                            几天前突然有兴致,就又继续搞了搞代码
                            1. EasyMinecraft 改名为 Blocky 将这个程序定位从模仿MC改为体素
                            2. 我将文件结构改的美观了些,并上传到了github上,但现在因为未知原因无法commit
                            链接: https://github.com/CharliePu/Blocky


                            IP属地:美国230楼2018-08-01 17:05
                            回复
                              2026-01-07 02:24:25
                              广告
                              不感兴趣
                              开通SVIP免广告
                              最近做的事情:
                              1. 尝试搞定多线程
                              主线程负责渲染和删除远区块,辅助线程负责生成区块、定点计算和告诉主线程删哪些区块
                              问题是:辅助线程计算比较慢,如果玩家移动比较快可能会让主线程删了渲染范围内的区块
                              另外C++的库大多不是为多线程设计,如果两个线程用同一个资源就会GG。所以要“疯狂”加锁来保证软件不会莫名其妙地爆炸 (到现在都没解决,加了N多锁但有时还会崩溃)


                              IP属地:美国231楼2018-08-01 17:14
                              回复