自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

LuoyinanRoy的专栏

大叔才是主流,活到老学到老.

  • 博客(67)
  • 资源 (1)
  • 收藏
  • 关注

原创 Unity3D手游项目的总结和思考(7) - ImageEffect后处理效果

       ImageEffect后处理效果对于游戏画面的提升非常重要,但是要实现一些牛逼的效果并且保证性能,是一件很难的事情.       我把后处理效果按持续时间分两个类,常驻和不常驻.常驻就表示一直存在的,这种后处理一般只允许存在一个,这样才能保证性能.Unity的后处理链,叠加多个后处理,有非常大的开销,据说Unity较新的版本有优化这个.我们而不常驻的,用一下就会关闭的,由于存在时间短...

2018-05-22 15:30:23 6447 7

原创 Unity3D手游项目的总结和思考(6) - Xlua的使用心得

      有一个项目做完快上线了,不是lua写的,能热更新的东西就特别少,如果遇到bug也很难在第一时间热修复,所以我就接入了Xlua这个插件,https://github.com/Tencent/xLua      原本只是想热修复一下的,后来领导要求把逻辑系统的C#代码全部换成了Lua,至于为什么,因为他们习惯了每天都更新和修改的开发模式...所以我们干了一件极其丧心病狂的事情,就是逻辑系统...

2018-05-21 17:57:59 4317 7

原创 Unity3D手游项目的总结和思考(5) - 植被摆动3DMAX工具

       以前的博客有提到如何实现植被摆动的效果:https://blog.csdn.net/qq18052887/article/details/50995928核心问题就是,摆动的幅度是根据什么样的权重.我简单分为三种.1.UV坐标作为权重2.顶点到模型原点的距离作为权重3.顶点颜色作为权重       以CE3引擎来讲,整体摆动用第二种,细节抖动用第三种,两种结合使用,就可以实现完美的摆...

2018-05-21 12:09:53 2058 1

原创 Unity3D手游项目的总结和思考(4) - 梦幻的天空盒

Unity的天空盒,不够动态,要支持天气系统渐变的话,必须要改进,让天空盒梦幻一些.我的shader的高画质处理有个multi_compile开关叫_FANCY_STUFF,从Unity官方的某个shader看到的,这个名字我很喜欢,梦幻.天空盒我主要实现了以下几个功能:1.天空盒可以水平旋转    为什么要水平旋转呢,因为我自定义了一个太阳(月亮),旋转可以让他们和天空盒背景图更加匹配.甚至,你...

2018-05-21 11:32:55 2287 2

原创 Unity3D手游项目的总结和思考(3) - 自动生成的水面

     前面两篇提到场景和角色渲染的技术,这一篇讲一下水面.     水面最开始是美术制作的,一个大的面片来实现,对于湖泊多的场景,这个面片甚至场景那么大,我觉得这种做法不是很好,虽然只有4个顶点,2个三角面,但是由于很大,像素填充率惊人,效率自然也不够好.后来要处理一些水面岸边渐变的效果,我觉得程序实现一个自动化的,不再让美术去操心这个事情.    我想尽可能地让这个水面完美,所以尝试做了以下...

2018-05-21 10:52:14 4669 8

原创 Unity3D手游项目的总结和思考(2) - 角色渲染

     上一篇介绍了一下场景的渲染,这一篇准备分享一下角色的渲染.      项目一开始的时候,考虑到我们是多人同屏的游戏,沿用了以前项目最简单的角色制作标准,一张512贴图,1500面,随着手机硬件的发展和各种牛逼重度手游的出现,角色就需要新的shader来提升效果了.对于大量同屏的怪物,我们采用传统光照模型,对于重要的NPC和玩家,可以使用PBR.除了这些基本的,角色渲染还需要各种效果,比如...

2018-05-19 18:34:22 3888 5

原创 Unity3D手游项目的总结和思考(1) - 渲染技术

      有朋友私信我问我为啥很久不更新博客,是不是转行了...我当然不可能承认自己懒啊,只能回复说太忙了.不过项目开发中,确实很难有时间和心力去总结和思考一些东西,不过现在忙完一些项目以后,我又回来了.      渲染技术这个东西,在项目前期我并没有投入太多精力去思考,在当时的环境下我更看中手游的性能,我做端游,可以无限地挖掘电脑的性能,比如多线程去处理角色的软件蒙皮之类,但是做手游,则要保护...

2018-05-18 21:56:54 8664 7

原创 Unity3D手游开发日记(11) - 基于共享骨骼简单高效的换装方案

游戏的换装,一般分为3种.换材质,骨骼挂接,共享骨骼.用的比较多的是骨骼挂接和共享骨骼.1.骨骼挂接没有动作的骨骼挂接,适合武器.有动作的骨骼挂接,适合坐骑.2.共享骨骼共享骨骼,适合身体部件.主模型(身体)包含整个骨骼,部件模型只包含自己部分的骨骼,应用的时候,部件模型的骨骼共享主模型的骨骼.这样的话,只需要播放主模型的动画,部件会跟着动.Unity的换装呢,你要

2016-09-24 12:04:41 10346 2

原创 Unity3D手游开发日记(10) - 资源打包的一些思考

Unity的资源打包,如果要做完美,其实是很复杂的.那么为什么资源要打包呢,因为我们要做资源更新.没办法啊.在我看来,完美的资源打包至少有以下几个方面要处理好:1) 资源分类设计合理.控制包粒度,单个包不能太大.2) 灵活的文件打包结构.支持文件和文件夹打包3) 共用资源的完美处理.防止重复打包.4) 快速增量打包.加快打包速度.具体来聊一下我的一些思考.

2016-09-19 12:30:37 3402 1

原创 Unity3D手游开发日记(9) - 互动草的效果

所谓互动草,就是角色跑动或者释放技能,能影响草的摆动方向和幅度.前面的文章早已经实现了风吹草动的效果,迟迟没有在Unity上面做互动草,是因为以前我在端游项目做过一套太过于牛逼的方案.在CE3的互动草的基础上扩展,效果好,但技术太复杂,效率开销也特别高. 如果在手机上,就得做一套简单高效的.实现效果:从任意方向碰一下草,草就应该来回晃动,晃动幅度逐渐减小.多次触碰,效果应该叠加.这

2016-07-05 18:30:06 11212 2

原创 Unity3D手游开发日记(8) - 运动残影效果

2D游戏的残影很简单,美术做序列帧图片就行了,那么3D游戏的残影美术做不了,得靠程序员动态创建模型来处理.实现原理也很简单:1.间隔一定时间创建一个残影模型2.对残影模型采用特殊的shader3.残影淡入淡出的处理namespace Luoyinan{ public class MotionGhost { public GameObje

2016-04-08 10:44:53 9906 6

原创 Unity3D手游开发日记(7) - 适合移动平台的天气效果

腾讯的天涯明月刀的天气很棒,以前我也在CE3的基础上做了一个效果差不多的,但是在手机上,还是斜下固定视角的游戏,是否还需要一个天气系统?考虑了一下,觉得可以做一个简单高效的.以下雨天为例子.一阵风吹来,天色逐渐变暗,突然下起了雨来,雨越来越大,夹杂着雷声和闪电,过几分钟,雨逐渐消失...1.风前面文章已经实现了风引起植被的摆动2.天色这个比较麻烦,由于移动平台的场景用的基本

2016-03-29 17:10:30 10264 15

原创 Unity3D手游开发日记(6) - 适合移动平台的水深处理

市面上大部分的手机游戏,水面都比较粗糙,也基本没发现谁做过水深的处理.水深的处理把PC平台比较容易,因为很容易获得每个像素的深度,比如G-Buffer,有了像素的深度,就能计算出每个像素到水面的距离,实现水深alpha渐变.但是在移动平台,又是万恶的浮点纹理...导致此方案不行.但是方案都是人想出来的,我想了两种适合移动平台的方案方案1:用水面顶点颜色保存alpha值来做水

2016-03-28 12:19:18 5139

原创 Unity3D手游开发日记(5) - 适合移动平台的植被随风摆动

一直再思考怎么让场景更有生机,我觉得植被的随风摆动时必不可少的.CE3引擎的植被bending就做得特别棒.我也准备在手机上做一套.先分析一下植被摆动常见的几种做法.其实不管哪种做法,核心就是让植被顶点做动画,有的顶点动的少(比如树根),有的顶点动的多(比如树顶),根据怎么样的权重来动?方案1:  用UV来做权重.这种方案对UV展开有要求,要从0到1,只适合面片草,这样

2016-03-28 11:36:33 10952 4

原创 Unity3D手游开发日记(4) - 适合移动平台的热浪扭曲

热浪扭曲效果的实现,分两部分,一是抓图,二是扭曲扰动.其中难点在于抓图的处理,网上的解决方案有两种,在移动平台都有很多问题,只好自己实现了一种新的方案,效果还不错.网上方案1. 用GrabPass抓图GrabPass在有的手机上是不支持的...效率也是问题,所以...代码可以看看:Shader "Luoyinan/Distortion/HeatDistortion" {

2016-01-04 19:00:46 12192 17

原创 Unity3D手游开发日记(3) - 场景加载进度条的完美方案

我以为做个进度条很简单,分分钟解决,结果折腾了一天才搞定,Unity有很多坑,要做完美需要逐一解决.问题1:最简单的方法不能实现100%的进度用最简单的方法来实现,不能实现100%的进度,原因是Unity加载完新场景立马就激活新场景了,无法显示最后的进度.解决办法就是使用allowSceneActivation来控制进入场景的时机.问题2:使用allowSceneActivation后

2016-01-04 16:33:16 6408 3

原创 Unity3D手游开发日记(2) - 技能系统架构设计

我想把技能做的比较牛逼,所以项目一开始我就在思考,是否需要一个灵活自由的技能系统架构设计,传统的技能设计,做法都是填excel表,技能需要什么,都填表里,很死板,比如有的技能只需要1个特效,有的要10个,那么表格也得预留10个特效的字段.我是这么来抽象一个技能的,技能由一堆触发器组成,比如特效触发器,动作触发器,声音触发器,摄像机震动触发器等等,这些触发器到了某个条件就执行触发,触发条

2015-12-19 16:03:46 35884 18

原创 Unity3D手游开发日记(1) - 移动平台实时阴影方案

自从去了某大公司,工作环境比较封闭,就没写过博客了,离开以后,开发移动游戏,相对自由,又可以重操旧业,分享一下自己的心得.阴影这个东西,说来就话长了,很多年前人们就开始研究出各种阴影技术,但都存在各种瑕疵和问题,直到近几年出现了PSSM,也就是CE3的CSM,阴影技术才算有个比较完美的解决方案.Unity自带的实时阴影,也是这种技术,在电脑上很成熟的.我也是目睹了阴影技术的发展,以前也自己写过

2015-12-19 14:26:59 16968 12

原创 在Ogre中实现先进的寻路算法:导航网格寻路

相比传统的路点寻路,包括走格子寻路,导航网格寻路算是很先进的寻路算法,总是寻找最短路径,和最少的节点。我也在引擎中做了一个,1)先划分障碍区域2)合并障碍区域3)计算出导航网格,可以是三角形或者多边形,我采用三角形4)采用A×寻三角形5)寻出的路经修正以上效果在地编中测试,绿色为合并后的障碍区域,粉色为计算出的导航网格,都是三角形。白

2013-07-08 10:51:29 6337 1

原创 用Ogre做一个效率高又漂亮的水面

以前游戏水面的做法都是用很多张图的序列帧实现的纹理动画,这种固定渲染管线的方式,在最低画质的时候采用特别好,但是对于更高级别的画质,就应该采用更好效果的水面。水面渲染,Ogre有个插件叫Hydrax,效果很不错,但是效率也低的很,没任何实用价值。只好自己做一个。一个漂亮3D游戏水面的,一般有水波模拟,bump mapping,倒影,折射,菲捏尔效果,水下效果等,我准备做一些取舍,实

2013-07-07 12:24:44 13465 6

原创 一个基于Ogre,适合2.5D游戏比较完美的阴影解决方案

这是我以前升级Ogre引擎,实现的一个方案,愿意拿出来分享下经验。每个精通Ogre的程序员,都会对Ogre自带的阴影方案感到失望,不管是模板阴影,还是投影阴影,都是固定渲染管线的阴影,效果都不好。畅游《天龙八部》都升级到3了,还采用以前的阴影方案,说明要找个理想的方案替换以前的真是很难。天龙的方案是,人物用模板阴影,场景用静态烘培的阴影贴图贴地形上。效果一般般,这是以前很多游戏

2013-07-06 22:12:37 5028 2

原创 地形平滑算法

拉出来的地下不平滑怎么办,笨办法就是美工一个顶点一个顶点的调整,而且效果还不好。实际上程序只要实现一个完美平滑算法,随便一刷,地形就平滑了。平滑算法最重要的就是不能改变原来的地形的大概结构,基本思路,就是和基本思路是和相邻的点取一个混合值。混合公式和alpha混合公式一样。海滩边岩石的平滑效果非常好。

2013-06-20 18:33:59 4765 1

原创 把天龙的地形升级为Splatting地形

只能说,现在主流游戏地形每层之间的混合方式,都是采用Slatting技术,每层地表之间的alpha混合,都是美术在编辑器刷出来的。而老的游戏,比如天龙,还沿用魔兽3那种拼接的地形,比图土地和草地的融合都是做图做好的,而不是实时刷出来的,导致做不了漂亮好看随心所欲的野外场景地表。畅游以这套地形出来的所有游戏,野外地表都有这个问题,反正不好看,而且这么多年也没人去修改一下。实现思路也很简单

2013-06-20 17:57:00 3770 3

原创 帐号密码又找回来了,是时候来一发了。

还在游戏行业瞎J8混。。。

2013-06-20 09:34:31 2426

原创 Ogre1.7地形浅析

早在1年前,就想好好研究一下Ogre1.7的新地形,但是各种原因导致现在我才下载了Ogre1.73的源码进行研究。而且只能在业余时间研究,Ogre的以前地形一直被人诟病,根本无法用于游戏,于是Ogre爱好者只好自己实现一些地形插件来解决这个问题,比如ETM之类。在国内,比较成

2011-09-25 16:51:51 7054 2

原创 Ogre渲染优化心得(五) -- 用硬件蒙皮代替软件蒙皮,用GPU代替CPU

骨骼动画的计算,是比较费时的,因为数据量大.这部分数据,用CPU计算,就是软件蒙皮,用GPU去计算,就硬件蒙皮1.软件蒙皮Ogre本身已经实现了软件蒙皮,默认情况下就是软件蒙皮,计算的代码在void Entity::updateAnimation(void)2.硬件蒙皮需要用shader,把计算放到GPU里面去处理,而shader的代码,也不用自己去写,Ogre本身例子就带有一个支持2个权重的顶点程序,因为一个顶点最多绑定4个骨头,最多4个权重,所以顶点也稍微麻烦,要4种情况都实现,那么,配置顶点程序就应该

2011-04-22 19:11:00 6085

原创 用Ogre固定渲染管线实现火炬之光X-RAY效果

游戏的遮挡半透,一般2种方法,一种是天龙的那种,让遮挡的建筑物半透明,一种是火炬之光的这种,X射线那种好?其实达到效果都行,火炬之光不能用第一种,因为他的模型都是很大很大的,建筑一透,全透了,很多地方可能还会穿帮,我的游戏一直用的第一种,也没去研究Xray,但是有朋友问起这个问题,就花了2天时间详细研究了一下.不研究不知道,一研究才发现,其实有很多细节要注意的呢,那我们开始分析了1.火炬之光中人物不能自己挡自己.解决方案:不写深度就完了,深度永远控制在遮挡物那里,2.火炬之光中有的建筑可以透,有的却不能透,

2011-04-15 21:44:00 12616 1

原创 Ogre粒子编辑器,功能山寨PU的...

以前的粒子编辑器,是交给小弟写的,美工一致反应垃圾....压力好大,只好自己操刀重写了一个,花了2周时间,做了个demo,实现了以前功能1.实时更新,只要参数一遍,粒子马上显示效果,以前的参数有一半不能实时更新,原因是小弟他是对粒子实例的操作,而不是操作模板,因为实例一旦创建,很多参数都不能再改变了,所以正确做法是,对模板进行更改,只要参数变化,马上重新创建粒子实例2.undo/redo 撤销和重做很重要,本来想做得更NB,把每步操作都显示出来,让用户随意撤销和重做,后来时间太紧,只好在状态栏消失出来und

2011-04-15 20:45:00 5505 7

原创 Ogre渲染优化心得(四) -- 正确地合并静态实体

<br />天龙的静态实体合并方法是典型的反面教材.把所有物体都合并在成一个静态实体了<br />正确的做法应该是按材质合并.不然效率可能会适得其反<br /> <br />具体原因,和前面讲的地形是一样的,<br /> <br />Ogre的一个静态实体,是分region的,一个region类似于一个地形的tile<br /> <br />而裁剪都是以region为单位,和前面提到的地形一模一样,<br /> <br />如果分材质裁剪多个静态实体,就没问题了<br /> <br />附上我简单更改过的天

2011-04-13 22:51:00 3411 1

原创 Ogre渲染优化心得(三) -- 优化天龙八部的地形

地形的实现,一种是用拼格子,每个格子一个四边形,不共用顶点,不能lod,但是一个格子就可以多层纹理,适合2.5D视角游戏,比如魔兽3和天龙另一种就是主流3D游戏做法,共用顶点,lod,缺点是一个地形page的纹理层数和前面那种地形的一个格子一样多...比如8层,其实已经足够,纹理过渡也很自然.拼格子的纹理过渡始终很丑.1)天龙的地形实现原理如下.整个地形分很多tile组合而成,class TerrainTile : public Ogre::MovableObject一个tile是一个MovableObje

2011-03-25 20:51:00 4662 1

原创 Ogre的渲染优化心得(二) -- Renderable和渲染批次, MovableObject和摄像机裁剪, SimpleRenderable和地形

<br />优化之前,先理解优化的原理.<br /> <br />1).Renderable和渲染批次:<br />      渲染批次是神马?自己去看教程,简单讲,他极大地影响渲染的效率,所以渲染批次尽量少.比如10个批次,渲染10000个三角形,比10000个批次,渲染10个三角形速度快得多,<br />     怎么才算一个批次?渲染一个Renderable就算一个批次,Renderable是Ogre中最小的渲染单元,所有需要渲染的对象都继承与此.<br />一句话:一个renderable等于一个b

2011-03-25 20:28:00 4429 3

原创 Ogre的渲染优化心得(一) -- 前言

<br />   做商业网络游戏的话,效率是一个不可避免的话题,为了留更多的空间给客户端的逻辑,那么渲染模块就应该尽量高效.<br />小弟只浅谈一下Ogre的渲染优化,以大家熟悉的天龙八部为例.<br /> <br />以网上流传版本的天龙代码来看,Ogre和CEGUI部分的渲染都有严重的性能问题,<br /> <br />Ogre:<br />       地形的实现,一个tile,只按材质做了批次优化,并没有按材质做摄像机的裁剪,导致游戏视角下批次增加很多<br />       静态实体的合并,完全

2011-03-25 19:23:00 3433

原创 Ogre实现圆形小地图,其实和CEGUI无关.

做网络游戏的都会遇到圆形小地图问题,网上也有很多相关讨论的文章,但是都多多少少有些问题.其实,这个问题并不难,只是很多人总是把他和CEGUI结合在一起,往CEGUI混合方向去考虑,自己搞难了自己我们反过来从需要考虑,1。我们每次更新需要的只是1张合成好的正方形图片,正方形图片中间的圆形是小地图内容,周围是alpha透明的,2。这个图片可以用小地图和一个alpha的遮罩合成.遮罩中间圆形像素1 1 1 1 ,周围 0 0 0 03。我们需要做的的只是怎么合成这个图片而已....怎么合成...取得图片像素自己合

2010-09-30 12:31:00 5347 7

原创 用Ogre生成天龙八部的lightmap和minimap的简单方法

自从在一家创业小公司当了客户端主程以后,就忙的没有时间写博客了,整个公司没有一个人有完整的项目经验,所有一切都在摸索中前进,但初生牛犊不怕虎,项目还算进展顺利。但我始终认为,安静下来总结整理一下工作心得是必要的,可惜这个愿望恐怕得等到这个项目忙完以后。周末有点时间,还是可以抽空随便写点东西。lightmap的重要性不用多说,没必要所有阴影都动态去渲染,那些一辈子也不会动的静态物体,贴一张lightmap就行了,可惜Ogre只提供动态阴影给我们,帮人也不帮到底。如何生成天龙八部一样lightmap,如果你去百

2010-08-14 19:13:00 6737 6

原创 实在受不了Ogre的Maya导出插件,所以重写了一下。

<br />自带的mayaExport,说实话,导出的材质脚本几乎每个都要改,问题主要有2个<br /> <br />1)默认值全部会写进去,我了个去,pass和textureUnit里面一堆默认值。。。。要全部干掉<br /> <br />2)所有带透明的图片的材质,不分青红皂白,全部是<br />  scene_blend alpha_blend<br />  depth_write off<br />对于一般的半透明纹理,是对的,我们需要关闭深度写,让半透明的物体不遮挡其他物体。<br /> <br

2010-08-09 22:27:00 5838 1

原创 网上流传的所谓天龙源码

<br />网上流传的所谓天龙源码,其实并不是天龙的。<br /> <br />代码是天龙的前身武侠世界的,很完整,但是没有资源data文件<br /> <br />资源data应该是网友破解的天龙八部的,然后2个拼凑在一起的<br /> <br />所以,如果出现脚本和代码对不上,不要诧异,也不要怀疑你的代码不完整。<br /> <br />就研究来说,还是不错的。

2010-07-21 19:45:00 8666 7

原创 网上流传的天龙源码框架分析之一 --- 客户端简单介绍

<br />网上流传一份天龙前身武侠世界的源码,小弟也从朋友那里搞了一份,研究了一下。<br /> <br />90%的源码都看过,每个类的作用基本都了解。<br /> <br />经常有网友问我天龙源码框架的问题,问的人太多了,所以我干脆总结一下算了。<br /> <br />天龙的客户端代码。分2个主要部分,一个是编辑器,一个是客户端。<br /> <br />编辑器和客户端会共用一个渲染模块,那就是WXCore;<br /> <br /> <br /> <br />我先说客户端部分吧,如下图<br /

2010-06-01 23:57:00 13142 15

原创 天龙八部二进制文件 读写序列化类

可以方便地实现天龙二进制的读和写 首先是序列化类 #ifndef __CORE_SERIALIZER_UTIL_H__#define __CORE_SERIALIZER_UTIL_H__#include #include using namespace Ogre;namespace Core{ // Endian routines exter

2010-04-11 13:53:00 3903

原创 Ogre设计模式分析-观察者模式

观察者模式是游戏开发中十分常用的模式,Ogre也大量运用了此模式来监听,比如FrameListener.ResourceListener这种方式比常见的回调函数更好用,因为观察者模式是基于接口的,任何类只要继承这个接口,注册后就可以监听我们需要观察的对象。不想监听,取消注册就行了, 具体实现原理,我们以为FrameListener为例子,然后再举一反三在自己的游戏中使用它,比如场景编辑

2010-03-31 21:18:00 3087 3

原创 Ogre的设计模式分析之-单件模式

小弟从来不盲目崇拜设计模式,项目中也切忌滥用设计模式的,但是有些作用十分不错的设计模式还是应该运用的,Ogre在这方面就十分不错,设计模式筛选的十分得当,代码也十分优雅,对我影响很大,以至于我现在的代码风格完全改变为Ogre式的风格。 由于要设计整个客户端的框架,所以灵活运用Ogre的一些设计模式对项目的帮助也是很大的。先从单件入手吧,为什么需要singleton,因为每个相对独立

2010-03-30 23:05:00 2678 5

J2ME手机游戏泡泡堂源码

素材大部分网上copy的...少数我自己PS的...源代码95%是自己写的.写的一般,大侠不要踩啊, 花了半个月时间弄素材,写代码,游戏完成80%的情况下,结果悲剧的发现单机的没网络的好耍... 可以编译通过的源代码完全奉上 写了13个类 基本功能全部实现 还算比较完整的游戏

2009-09-21

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除