cocos2dx 大地图分块加载的研究(初)

本文讨论了在cocos2dx中处理大型地图的两种方法:资源重用和分块加载。重点介绍了分块加载,包括切图的大小选择(如128或256像素)和优化渲染效率。面对4096x4096分辨率的地图,通过分块加载可以降低内存消耗,但滚动时的处理和渲染效率是挑战。最后,作者提到类似谷歌地图的延迟加载策略可能不适合游戏场景。
摘要由CSDN通过智能技术生成

        项目里面需要加载一个很大的地图,目测最少是4096x4096的分辨率。


        先不考虑什么引擎最大支持多大的图啊,大图加载效率啊等等这些问题,光是4k x 4k的分辨率,ARGB8888,加载进去,就是64M的内存,这还只是一个背景。再来点其他七七八八的东西,轻松超过120,这个内存在某些设备上就已经很危险了。


        为了实现这个目标,处理的方式大概有2种:

        一、资源重用。也就是类似于tiled这种方法,把地图上面的一些图块,反复使用,通过有限的纹理,来拼接出地图。但是这种方法的确定是地图会比较死板

        二、分块加载。就是把一个大图切成若干小块,每次只加载需要显示的图块。看上去很美,现在主要说这个。


        先说切图,肯定是切小方块,按照二的幂的原则,一般有这么几个备选:32、64、128、256、512。

        用切的图块来铺满一个屏幕,不一定能恰好填满,可能会多出一部分(少一部分就会留黑,肯定不行),从这个上面上来说,肯定是切的越小越好,因为这样就算有浪费,最多也就浪费一个图块的宽度。但是图切的太碎,会对渲染效率产生影响。从调试信息可以看到有个GLVerts,verts越多,显示效率就越低。

        但是如果切太大,内存又会有影响,比如我切个512的方块,假设屏幕是960X640,那么极限情况下,最多会同时显示4块(请自行想象在田字格的中间放一个方框,方框就是屏幕),这样就达不到节约内存的目的。

        一般128或者256应该就差不多了。

        然后把大图切小,分别命名。这图怎么切,当然是叫美工用PS切啊,命名,手动啊。。。当然这是开玩笑,你要真这么弄,美工不把你砍死。。。作为程序员,就是要会偷懒嘛,写个程序就切了,python的。虽然我也不是很会python,只会基本语法。但是python库多啊

import Image  
import sys  
import os.path  
from  datetime  import  *    
import random  
import time  
  

IMAGE_PATH = "map.png"

xIndex = 0
yIndex = 0
cropSize = 256
xNum = 0
yNum = 0
  
im = Image.open(IMAGE_PATH) #打开图片句柄  
pSize = im.size

xNum = pSize[0]/cropSize
yNum = pSize[1]/cropSize

print "size  " ,xNum,'  ',yNum

for yIndex in range(yNum):
	for xIndex in range(xNum):
		print "pic : " , xIndex , "_" , yIndex
		box = (xIndex*cropSize,yIndex*cropSize,(xIndex+1)*cropSize,(yIndex+1)*cropSize) #设定裁剪区域  
		region = im.crop(box)  
cocos2dx-lua中,使用ScrollView加载大量项目可以通过以下步骤实现: 1. 创建一个ScrollView,并设置其大小和位置。 ```lua local scrollView = ccui.ScrollView:create() scrollView:setContentSize(cc.size(500, 500)) scrollView:setPosition(cc.p(0, 0)) ``` 2. 设置ScrollView的滚动方向和滚动条位置。 ```lua scrollView:setDirection(ccui.ScrollViewDir.vertical) scrollView:setScrollBarPositionFromCorner(cc.p(7, 7)) ``` 3. 创建一个容器,用于存储要加载的内容。 ```lua local container = ccui.Layout:create() container:setContentSize(cc.size(500, 10000)) scrollView:addChild(container) ``` 4. 定义一个函数,用于加载每一项内容到容器中。 ```lua local function loadItem(index) local item = ccui.Text:create() item:setString("Item " .. index) item:setPosition(cc.p(250, 10000 - index * 50)) container:addChild(item) end ``` 5. 在ScrollView的回调函数中,根据滚动位置动态加载内容。 ```lua local function scrollViewEvent(sender, eventType) if eventType == ccui.ScrollviewEventType.scrolling then local pos = scrollView:getInnerContainer():getPosition() local top = scrollView:getContentSize().height local bottom = top - scrollView:getInnerContainerSize().height if pos.y < bottom + 500 then for i = 1, 10 do loadItem(i) end end end end scrollView:addScrollViewEventListener(scrollViewEvent) ``` 这样,当用户滚动到ScrollView的底部时,会自动加载10个新的内容项到容器中。通过判断ScrollView的滚动位置,只有当滚动到接近底部时才会加载新的内容项,避免一次性加载大量的内容导致卡顿。可以根据实际需求调整每次加载的内容数量和内容项的布局样式。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值