博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Carmark算法,我的实现
阅读量:6554 次
发布时间:2019-06-24

本文共 1455 字,大约阅读时间需要 4 分钟。

过去两年一直在公司做2D游戏移植,有一次遇上一个外包到公司的项目,项目原来的绘制算法没有用Carmack,导致当我们把它移植到某些性能很Pie的平台上时速度出现了问题。更遭的是由于是外包过来的项目,他们的游戏架构和我们的不同,本来我们的游戏SDK里有Carmack这个算法的,如果是自己的项目要用的话简直太简单了,现在只好自己写个Carmack算法来优化速度了。今天我重温了当时写的Carmack。

首先,场景是一个大大的TileSet,意思就是Tile的集合,场景是由一个个Tile拼成的。一个Tile往往是大约几十个像素乘以几十个像素的小块,如下图:

图1

其它的都好懂,需要关注的是CurrentTileX/CurrentTileY,这对坐标表示的是Camera(摄像机)的坐标所在的那个Tile的位置索引。在此图中CurrentTileX=3,CurrentTileY=2。然后另一个图:

图2

这个图表示的是Carmack Buffer,CarmackBuffer的宽高都要比Camera的宽高至少多一个Tile的宽高,注意是至少多一个,比如一个Tile宽高都是64,Camera宽640,高320,那么CarmackBuffer则宽为640+64=704,高为320+64=384。注意了,如果Camera宽是641,高是321,那么CarmackBuffer和宽就是640+63+64=768,高321+63+64=448 。注意buffer的宽高总是Tile的整数倍!

上图中的_cmkUnitW表示buffer的宽度有几个Tile宽度,图中_cmkUnitW=10,_cmkUnitH意义类似,图中_cmkUnitH=7。

_cmkUnitX/_cmkUnitY标示出了图中绿色的Tile,相信如果你了解Carmack算法的原理,已经猜到这是做什么用了,请看下图:

图3

然后,我们需要一对整形变量_cmkTileX/_cmkTileY来保存图中绿色Tile在整个Tileset中的位置索引,这对变量等于CurrentTileX/CurrentTileY(上文提到的),在Camera没有移动的前提下。CurrentTileX/CurrentTileY总是会随Camera位置的变化而改变,为了保持他们两对变量保持相等,程序中就对_cmkTileX/_cmkTileY进行相应的++或--,并且在这个过程中更新_cmkUnitX/_cmkUnitY所对应的行,列区域(_cmkUnitX对应的一整列,_cmkUnitY对应的一整行)

最后一步,就是把Carmack Buffer贴到屏幕上,贴粘方法如图3 。

: C++版,用VS2010编译,或者mingw

mapcreator用来创建一个默认的地图,tilesetcreator创建默认的tileset。关于Carmack算法的重点都在CMap::CMKRender(Map.cpp里)这个函数里面,这个函数每帧都调用。

PS:我没有讲Carmack的原理,嘴比较笨,不会说。网上可以搜到讲的比较清楚的。所以其实我是在讲我共享的这个代码里的Carmack的实现。

再PS,从点点手动搬过来的,图可能不清晰,看

posted on
2012-08-03 15:42 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/spencer24/archive/2012/08/03/2621759.html

你可能感兴趣的文章
Weak is not weak,Strong is not strong
查看>>
setsockopt 详解
查看>>
首次使用AWS服务器EC2
查看>>
POJ-1860-Currency Exchange
查看>>
[深度学习]受限玻尔兹曼机生成手写数字训练样本原理
查看>>
莫比乌斯反演
查看>>
Django Hello World
查看>>
分析rails日志,计算响应率
查看>>
PHP 提交checkbox表单时 判断复选框是否被选中
查看>>
day12-sqlalchemy 常用语法
查看>>
Interval GCD CH4302
查看>>
Vim + SpaceVim强大的Linux系统下的编辑器
查看>>
dxRibbonRadialMenu控件使用
查看>>
知识总结:测试用例
查看>>
Xutils请求服务器json数据与下载文件
查看>>
2018 Wannafly summer camp Day2--Utawarerumono
查看>>
Spring系列之二——Spring初体验
查看>>
YII框架中的自动加载自定义数据模型操作
查看>>
什么是多态
查看>>
Adobe Flash Player 11.2 on Fedora 17/16, CentOS/RHEL 6.3/5.8
查看>>