游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

问答求助

关注:542

当前位置:游戏蛮牛 技术专区 问答求助

_____________________________________________________________________________________________________________
问答求助版块规则:

  1、问题尽量描述清楚
      2、代码要放在代码块里
      3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档。【最好没有附件,你懂得】
      4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
      5、问题得到解决,请选择最佳答案。
      6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 738|回复: 6

[技术讨论] 地砖场景60*80资源开销太大,询问优化方法

[复制链接]  [移动端链接]
排名
36953
昨日变化
28

1

主题

5

帖子

14

积分

Rank: 1

UID
277318
好友
0
蛮牛币
17
威望
0
注册时间
2018-4-16
在线时间
4 小时
最后登录
2018-4-20
发表于 2018-4-17 17:09:27 | 显示全部楼层 |阅读模式
5蛮牛币
我制作了一个场景,使用cube作为地砖载体,设定了一个地板的材质,然后进行渲染。场景大小为60*80,但是他的开销似乎比较大,我想问一下像我这种情况应该怎么优化呢?我的cube做成了prefab的模式,在程序里动态添加的。
下图是我的开销情况

屏幕快照 2018-04-17 16.58.34.png
下面是我的设置地形部分的代码。
谢谢

[C#] 纯文本查看 复制代码

	public GameObject cellteil;
	public GameObject character_walker;
	public GameObject cellcube;
	public GameObject character_solder;
	public GameObject character_solder_impl;
	public GameObject treep01;//场景中 带碰撞的树的模型

	public int map_w, map_h;
	// Use this for initialization
	void Start () {
		map_w = 60;
		map_h = 80;
		InitMap ();
		//放置人物
		MakeCharacter ();
		
	}
	
	// Update is called once per frame
	void Update () {
		doCharacterOnGround ();
	}

	void InitMap(){
	
		TileCell[,] tc = new TileCell[map_w,map_h];
		//首先生成数据模型,第一步全部填充为木质地板。
		for (int x = 0; x < map_w; x++) {
			for (int y = 0; y < map_h; y++) {
				tc [x, y].tiletype = 0;
				//增加下修改,边缘地区全部换为3类型, 3类型表示带有1x1碰撞的树,作为地图边界
				if (x == 0 || x == map_w - 1 || y == 0 || y == map_h - 1) {
					tc [x, y].tiletype = 0;
				}  
					
				 
				//CreateCell (x, y);
			}
		}
		//在某个位置放置 小花园
		MakeGarden(tc);
		//根据模型数据生成实际显示对象
		for (int x = 0; x < map_w; x++) {
			for (int y = 0; y < map_h; y++) {
				//tc [x, y].tiletype = 0;
				//if (tc [x, y].tiletype == 0) {
				CreateCell (x, y,tc[x,y].tiletype);
				//}
			}
		}
	
	}
	//创建随机花园
	void MakeGarden(TileCell[,] tc){
		//随机坐标位置,花园默认大小 8*8 所以坐标必须在1-13 之间

		//int i = num1.Next(12);
		int gx =Random.Range(1, 40);

		int gy=Random.Range(1, 40);
		tc [gx, gy].tiletype = 1;
		tc [gx+1, gy].tiletype = 1;
		tc [gx+2, gy].tiletype = 1;

		tc [gx+5, gy].tiletype = 1;
		tc [gx+6, gy].tiletype = 1;
		tc [gx+7, gy].tiletype = 1;

		tc [gx, gy+1].tiletype = 1;
		tc [gx, gy+2].tiletype = 1;

		tc [gx+7, gy+1].tiletype = 1;
		tc [gx+7, gy+2].tiletype = 1;

		tc [gx, gy+5].tiletype = 1;
		tc [gx, gy+6].tiletype = 1;

		tc [gx+7, gy+5].tiletype = 1;
		tc [gx+7, gy+6].tiletype = 1;

		tc [gx, gy+7].tiletype = 1;
		tc [gx+1, gy+7].tiletype = 1;
		tc [gx+2, gy+7].tiletype = 1;

		tc [gx+5, gy+7].tiletype = 1;
		tc [gx+6, gy+7].tiletype = 1;
		tc [gx+7, gy+7].tiletype = 1;



	}



	//将数组中的地块实现化
	private void CreateCell (int x, int z,int type) {

		if (type == 0) {
			GameObject go01 = Instantiate (cellteil);
			//go01.transform.parent = transform;
			go01.transform.position = new Vector3 (x * 1.0f, 2.0f, z * 1.0f);
		}
		if (type == 1) {
			GameObject go01 = Instantiate (cellcube);
			//go01.transform.parent = transform;
			go01.transform.position = new Vector3 (x * 1.0f, 3.0f, z * 1.0f);
		}
		if (type == 3) {
			GameObject go01 = Instantiate (treep01);
			//go01.transform.parent = transform;
			go01.transform.position = new Vector3 (x * 1.0f, 3.0f, z * 1.0f);
		}

		//go01.transform.localPosition = new Vector3(x - 3 * 0.5f + 0.5f, 0f, z - 3 * 0.5f + 0.5f);
		//prefab_gress newCell = Instantiate(cellteil) as prefab_gress;
		//cells[x, z] = newCell;
		//newCell.name = "Maze Cell " + x + ", " + z;
		//newCell.transform.parent = transform;
		//newCell.transform.localPosition = new Vector3(x - sizeX * 0.5f + 0.5f, 0f, z - sizeZ * 0.5f + 0.5f);
	}

	//放置人物
	private void MakeCharacter(){
		//主要角色
		character_solder_impl = Instantiate (character_solder);
		character_solder_impl.name = "solder01";
		character_solder_impl.transform.position=new Vector3 (10 * 1.0f, 6.0f, 10 * 1.0f);
		GameObject.Find ("Main Camera").GetComponent<follow> ().doSetFollower ();
		//敌人,也就是僵尸
		character_walker= Instantiate (character_walker);
		character_walker.name = "character_walker01";
		character_walker.transform.position=new Vector3 (20 * 1.0f, 6.0f, 30 * 1.0f);

	}

	private void doCharacterOnGround(){
	
		if (character_solder_impl==null) {
			//移动到位置就停止了
			return ;
		}
		Vector3 moveDirection = Vector3.zero;
		float gravity = 10f; //这个是下落速度
		// doCharacterOnGround = GetComponent<CharacterController> ();
		if (character_solder_impl.GetComponent<CharacterController>().isGrounded) {
			//Debug.Log ("已经落地");
			//character_solder_impl.GetComponent<CharacterController>().SimpleMove( new Vector3(0,0,-30)  * Time.deltaTime);
		} else {
			//没有落地

			moveDirection.y -= gravity ;   
			//Debug.Log ("没有没有没有没有落地"+moveDirection.y);
			character_solder_impl.GetComponent<CharacterController>().SimpleMove(moveDirection * Time.deltaTime);  

		}
	}



回复

使用道具 举报

3偶尔光临
214/300
排名
11287
昨日变化
7

0

主题

69

帖子

214

积分

Rank: 3Rank: 3Rank: 3

UID
163693
好友
0
蛮牛币
388
威望
0
注册时间
2016-8-23
在线时间
64 小时
最后登录
2018-7-12
发表于 2018-4-17 17:09:28 | 显示全部楼层
不是很明白
你的意思是你用一个Cube拼出了一个很大的地面?
如果是这样的话
1.用平面代替Cube因为你只是地面的话,Cube的很多定点是不需要的
2.如果地面很大,尝试遮挡剔除
3.我猜你的cube应该是带碰撞和的,这样你用100个cube就会有100个碰撞和拼接,尝试计算地面大小,用一个大的碰撞和代替原先的小碰撞和
4.尝试用Mesh拼接,把你生成的地面,拼接成一个大的Mesh,再删除原先的小个Cube

你这样出现的性能问题就是因为你的物件太多,导致计算量的倍增

评分

参与人数 1鲜花 +2 收起 理由
王哲斌 + 2

查看全部评分


回复

使用道具 举报

排名
36953
昨日变化
28

1

主题

5

帖子

14

积分

Rank: 1

UID
277318
好友
0
蛮牛币
17
威望
0
注册时间
2018-4-16
在线时间
4 小时
最后登录
2018-4-20
 楼主| 发表于 2018-4-18 09:31:16 | 显示全部楼层
恩,可能就是物件太多造成的,我去试一下改为平面,不过因为我是预制体 prefab  动态生成的,所以这种情况下遮挡提出是不是没有办法做?我看那个要预先做好场景进行烘焙才可以。
另外 mesh拼接没明白,能不能给个例子看一下? 谢谢。

回复

使用道具 举报

排名
36953
昨日变化
28

1

主题

5

帖子

14

积分

Rank: 1

UID
277318
好友
0
蛮牛币
17
威望
0
注册时间
2018-4-16
在线时间
4 小时
最后登录
2018-4-20
 楼主| 发表于 2018-4-18 09:44:53 | 显示全部楼层
另外,聚光灯 Spotlight 的光照到地板上也增加了很多的开销,不知道怎么降低。

回复

使用道具 举报

5熟悉之中
790/1000
排名
4198
昨日变化
1

13

主题

276

帖子

790

积分

Rank: 5Rank: 5

UID
176358
好友
0
蛮牛币
481
威望
0
注册时间
2016-11-4
在线时间
187 小时
最后登录
2018-7-17
发表于 2018-4-18 19:19:26 | 显示全部楼层
王哲斌 发表于 2018-4-18 09:44
另外,聚光灯 Spotlight 的光照到地板上也增加了很多的开销,不知道怎么降低。 ...

烘焙光照贴图,不用实时光照

回复

使用道具 举报

5熟悉之中
699/1000
排名
6556
昨日变化
54

1

主题

146

帖子

699

积分

Rank: 5Rank: 5

UID
56504
好友
0
蛮牛币
578
威望
0
注册时间
2014-11-19
在线时间
382 小时
最后登录
2018-7-17
发表于 2018-4-18 20:36:00 | 显示全部楼层
场景太大可以考虑分块加载,类似九宫格的那种做法

回复

使用道具 举报

5熟悉之中
784/1000
排名
5626
昨日变化
47

12

主题

266

帖子

784

积分

Rank: 5Rank: 5

UID
63446
好友
3
蛮牛币
124
威望
0
注册时间
2014-12-25
在线时间
282 小时
最后登录
2018-7-17
发表于 2018-4-20 22:23:12 | 显示全部楼层
在一本很深的说shader的书里看过
优化,是远端的方格用shader模糊掉,减少mesh量
并且能抗锯齿
相当于1个 cube+1个shader,展示一整个平面
其实大地图的一般优化方法,应该不少人实践过

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表