surfaceflinger(学习surfaceflinger 有什么用)

2024-07-03 05:46:57 126

surfaceflinger(学习surfaceflinger 有什么用)

本文目录

学习surfaceflinger 有什么用

SurfaceFlinger英文直译就是surface的投递者,surface就不用翻译了,翻译了反而不好理解。SurfaceFlinger是android的一个服务,其负责管理应用端的surface,将所有的surface复合。他是介于图形库和应用之间的一层。每个应用在它自己的surface完成各种图形操作后,请求SurfaceFlinger显示到屏幕,surfaceflinger就会将所有的surface叠加起来,并且反映到framebuffer.

如何dump surfaceflinger的数据

hi.你说的surfaceflinger应该是指安卓的surfaceflinger.可以使用如下命令:dumpsys SurfaceFlinger就能抓到surfaceflinger的一些信息,一般包含:1、layer的信息,layer一般对应于一个surface2、opengl的信息。一般是跟gpu比较相关的参数,opengl是标准的接口,需要获取gpu底层的一些支持特性,比如支持最高api版本为opengl es2.0,还有一些扩展信息3、display。安卓支持三种类型的display,可以导出display当前的显示状态,也就是各个surface(layer)在各个display的显示属性4、surfaceflinger管理graphis buffer的信息。主要是layer申请的帧数据内存5、hwcomopser的如果实现dump接口也能知道hwcomposer的一些参数6、gralloc的内存分配信息。如果gralloc有实现dump接口的话以上是一些简单的概括,希望对你有帮助

android opengl es与surfaceview什么关系

1.SurfaceFlinger是一个服务,主要是负责合成各窗口的Surface,然后通过OpenGLES显示到FrameBuffer上。 2.DisplayHardware是对显示设备的抽象,包括FrameBuffer和Overlay。加载FrameBuffer和Overlay插件,并初始化OpenGLES: view plain mNativeWindow = new FramebufferNativeWindow(); framebuffer_device_t const * fbDev = mNativeWindow-》getDevice(); if (hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module) == 0) { overlay_control_open(module, &mOverlayEngine); } surface = eglCreateWindowSurface(display, config, mNativeWindow.get(), NULL); eglMakeCurrent(display, surface, surface, context); 3.FramebufferNativeWindow 是framebuffer 的抽象,它负责加载libgralloc,并打开framebuffer设备。FramebufferNativeWindow并不直接使用 framebuffer,而是自己创建了两个Buffer: queueBuffer负责显示一个Buffer到屏幕上,它调用fb-》post去显示。 dequeueBuffer获取一个空闲的Buffer,用来在后台绘制。 这两个函数由eglSwapBuffers调过来,调到 view plain egl_window_surface_v2_t::swapBuffers: nativeWindow-》queueBuffer(nativeWindow, buffer); nativeWindow-》dequeueBuffer(nativeWindow, &buffer); 4.msm7k/liboverlay是Overlay的实现,与其它平台不同的是,高通平台上的Overlay并不是提供一个framebuffer设备,而通过fb0的ioctl来实现的,ioctl分为两类操作: OverlayControlChannel用于设置参数,比如设置Overlay的位置,宽度和高度: view plain bool OverlayControlChannel::setPosition(int x, int y, uint32_t w, uint32_t h) { ov.dst_rect.x = x; ov.dst_rect.y = y; ov.dst_rect.w = w; ov.dst_rect.h = h; ioctl(mFD, MSMFB_OVERLAY_SET, &ov); } OverlayDataChannel用于显示Overlay,其中最重要的函数就是queueBuffer: view plain bool OverlayDataChannel::queueBuffer(uint32_t offset) { mOvData.data.offset = offset; ioctl(mFD, MSMFB_OVERLAY_PLAY, odPtr)) } 5.msm7k/libgralloc 是显示缓存的抽象,包括framebuffer和普通Surface的Buffer。framebuffer只是/dev/graphic/fb0的包 装,Surface的Buffer则是对/dev/pmem、ashmem和GPU内存(msm_hw3dm)的包装,它的目标主要是方便硬件加速,因为 DMA传输使用物理地址,要求内存在物理地址上连续。 6.msm7k/libcopybit这是2D加速库,主要负责Surface的拉伸、旋转和合成等操作。它有两种实现方式: copybit.cpp: 基于fb0的ioctl(MSMFB_BLIT)的实现。 copybit_c2d.cpp: 基于kgsl的实现,只是对libC2D2.so的包装,libC2D2.so应该是不开源的。 7.pmem misc/pmem.c: 对物理内存的管理,算法和用户空间的接口。 board-msm7x27.c定义了物理内存的缺省大小: view plain #define MSM_PMEM_MDP_SIZE 0x1B76000 #define MSM_PMEM_ADSP_SIZE 0xB71000 #define MSM_PMEM_AUDIO_SIZE 0x5B000 #define MSM_FB_SIZE 0x177000 #define MSM_GPU_PHYS_SIZE SZ_2M #define PMEM_KERNEL_EBI1_SIZE 0x1C00 msm_msm7x2x_allocate_memory_regions分配几大块内存用于给pmem做二次分配。 8.KGSL Kernel Graphics System Layer (KGSL),3D图形加速驱动程序,源代码drivers/gpu/msm目录下,它是对GPU的包装,给OpenGLES 2.0提供抽象的接口。 9.msm_hw3dm 这个我在内核中没有找到相关代码。 10.msm_fb msm_fb.c: framebuffer, overlay和blit的用户接口。 mdp_dma.c: 对具体显示设备的包装,提供两种framebuffer更新的方式: mdp_refresh_screen: 定时更新。 mdp_dma_pan_update: 通过pan display主动更新。 mdp_dma_lcdc.c:针对LCD实现的显示设备,mdp_lcdc_update用更新framebuffer。

如何在Android上实现FrameBuffer和Overlay的blend

1.SurfaceFlinger是一个服务,主要是负责合成各窗口的Surface,然后通过OpenGLES显示到FrameBuffer上。2.DisplayHardware是对显示设备的抽象,包括FrameBuffer和Overlay。加载FrameBuffer和Overlay插件,并初始化OpenGLES:view plainmNativeWindow = new FramebufferNativeWindow(); framebuffer_device_t const * fbDev = mNativeWindow-》getDevice(); if (hw_get_module(OVERLAY_HARDWARE_MODULE_ID, &module) == 0) { overlay_control_open(module, &mOverlayEngine); } surface = eglCreateWindowSurface(display, config, mNativeWindow.get(), NULL); eglMakeCurrent(display, surface, surface, context); 3.FramebufferNativeWindow 是framebuffer 的抽象,它负责加载libgralloc,并打开framebuffer设备。FramebufferNativeWindow并不直接使用 framebuffer,而是自己创建了两个Buffer:queueBuffer负责显示一个Buffer到屏幕上,它调用fb-》post去显示。dequeueBuffer获取一个空闲的Buffer,用来在后台绘制。这两个函数由eglSwapBuffers调过来,调到view plainegl_window_surface_v2_t::swapBuffers: nativeWindow-》queueBuffer(nativeWindow, buffer); nativeWindow-》dequeueBuffer(nativeWindow, &buffer); 4.msm7k/liboverlay是Overlay的实现,与其它平台不同的是,高通平台上的Overlay并不是提供一个framebuffer设备,而通过fb0的ioctl来实现的,ioctl分为两类操作:OverlayControlChannel用于设置参数,比如设置Overlay的位置,宽度和高度:view plainbool OverlayControlChannel::setPosition(int x, int y, uint32_t w, uint32_t h) { ov.dst_rect.x = x; ov.dst_rect.y = y; ov.dst_rect.w = w; ov.dst_rect.h = h; ioctl(mFD, MSMFB_OVERLAY_SET, &ov); } OverlayDataChannel用于显示Overlay,其中最重要的函数就是queueBuffer:view plainbool OverlayDataChannel::queueBuffer(uint32_t offset) { mOvData.data.offset = offset; ioctl(mFD, MSMFB_OVERLAY_PLAY, odPtr)) } 5.msm7k/libgralloc 是显示缓存的抽象,包括framebuffer和普通Surface的Buffer。framebuffer只是/dev/graphic/fb0的包 装,Surface的Buffer则是对/dev/pmem、ashmem和GPU内存(msm_hw3dm)的包装,它的目标主要是方便硬件加速,因为 DMA传输使用物理地址,要求内存在物理地址上连续。6.msm7k/libcopybit这是2D加速库,主要负责Surface的拉伸、旋转和合成等操作。它有两种实现方式:copybit.cpp: 基于fb0的ioctl(MSMFB_BLIT)的实现。copybit_c2d.cpp: 基于kgsl的实现,只是对libC2D2.so的包装,libC2D2.so应该是不开源的。7.pmemmisc/pmem.c: 对物理内存的管理,算法和用户空间的接口。board-msm7x27.c定义了物理内存的缺省大小:view plain#define MSM_PMEM_MDP_SIZE 0x1B76000 #define MSM_PMEM_ADSP_SIZE 0xB71000 #define MSM_PMEM_AUDIO_SIZE 0x5B000 #define MSM_FB_SIZE 0x177000 #define MSM_GPU_PHYS_SIZE SZ_2M #define PMEM_KERNEL_EBI1_SIZE 0x1C00 msm_msm7x2x_allocate_memory_regions分配几大块内存用于给pmem做二次分配。8.KGSLKernel Graphics System Layer (KGSL),3D图形加速驱动程序,源代码drivers/gpu/msm目录下,它是对GPU的包装,给OpenGLES 2.0提供抽象的接口。9.msm_hw3dm这个我在内核中没有找到相关代码。10.msm_fbmsm_fb.c: framebuffer, overlay和blit的用户接口。mdp_dma.c: 对具体显示设备的包装,提供两种framebuffer更新的方式:mdp_refresh_screen: 定时更新。mdp_dma_pan_update: 通过pan display主动更新。mdp_dma_lcdc.c:针对LCD实现的显示设备,mdp_lcdc_update用更新framebuffer。

如何跨进程调用surfaceflinger的方法

  Android SurfaceFlinger 详解 1. SurfaceFlinger 按英文翻译过来就 Surface 投递者。 就是把上层所画的各个 surface 进行处 理然后传给底层硬件来显示的一个功能。 2. 下图比较详细的阐述了 SurfaceFlinger 所起的作用。 Android 图形系统中一个重要的概念和线索是 surface。View 及其子类(如 TextView, Button) 要画在 surface 上。 每个 surface 创建一个 Canvas 对象 (但 属性时常改变),用来管理 view 在 surface 上的绘图操作,如画点画线。每个 canvas 对象对应一个 bitmap,存储画在 surface 上的内容。 每个 Surface 通常对应两个 buffer,一个 front buffer, 一个 back buffer。 其中,back buffer 就是 canvas 绘图时对应的 bitmap。因此,绘画总是在 back buffer 上,需要更新时,则将 back buffer 和 front buffer 互换。 The window is tied to a Surface and the ViewRoot asks the Surface for a Canvas that is then used by the Views to draw onto. After View draw its data to canvas, ViewRoot will call surface.unlockCanvasAndPost(canvas) to schedule surfaceFlinger::composeSurfaces() which do the actually display to display panel. SurfaceFlinger handles to transfers drawn data in canvas to surface front buffer or backbuffer Except for SurfaceViews, different views within the same ViewRoot share the same surface. Layer 的概念: 每个 surface 又对应一个 layer, SurfaceFlinger 负责将各个 layer 的 front buffer 合成(composite)绘制到屏幕上。 A Layer is something that can be composited by SurfaceFlinger (should have been called LayerFlinger). There are several types of Layers if you look in the code, in particular the regular ones (Layer.cpp) , they are backed by a Surface, and the LayerBuffer (very badly chosen name) which don’t have a backing store, but receive one from their client. . Note that the GGLSurface type, should have been called GGLBuffer Multiple layers are just composited to the final buffer in their Z order. 有几个对象与 Surface 概念紧密相关: 1. Java Surface (frameworks/base/core/java/android/view/Surface.java) 。 该对象被应用间接调用(通过 SurfaceView, ViewRoot 等), 应用需要创建 surface,(并同时创建 canvas), 将图形绘制到这个对象上并最终投递到屏幕 上。 2. C++ Surface (frameworks/base/libs/ui/Surface.cpp。 这个对象被 Java Surface 通过 Jni 调用,实现 Java Surface 的功能 3. ISurface (以及其派生类 BnSurface)。这个对象是应用和 server 之间的接 口。 C++ Surface 创建这个 ISurface (BnSurface) 并发送命令, 如更新 surface 内容到屏幕上。Server 端接受这个命令并执行相应操作。 研究一个 surface 如何创建的关键路径如下: 1. frameworks/base/core/java/android/view/Surface.java Surface::Surface () -- 2. frameworks/base/core/jni/android_view_Surface.cpp -- Surface_init ()。 在这个函数中 SurfaceComposerClient 对象被创建。 3.frameworks/base/libs/ui/SurfaceComposerClient.cpp SurfaceComposerClient::SurfaceComposerClient (). 这个函数非常重要,在这里建立了 client 和 server 之间的桥梁。通过函数 _get_surface_manager() 获 得 了 一 个 指 向 server 的 IBinder 对 象 ( 具 有 ISurfaceComposer 接口),之后通过这个 IBinder 就可以跨进程访问 Server 的 功能。接着调用 ISurfaceComposer::createConnection()创建并返回了一个 ISurfaceFlingerClient 的 IBinder。 4. frameworks/base/libs/ui/SurfaceComposerClient.cpp -SurfaceComposerClient::createSurface(). 这 个 函 数 中 , 利 用 前 面 获 得 的 ISurfaceFlingerClient 的 IBinder,调用其 createSurface 接口。 5.frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp -BClient::createSurface ()。BClient 由 ISurfaceFlingerClient 派生而来。 6. frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp -SurfaceFlinger:: createSurface()。这个函数为 Surface 创建一个对应的 Layer。 上述关键路径中,1,2,3,4 运行于 client 进程中,而 5,6 运行与 server 进 程中。server 作为一个 service 提供给 client 访问。 与图形相关的代码主要位于下列目录: 1、frameworks/base/graphics/java/android/graphics 2、frameworks/base/core/java/android/view 3、frameworks/base/core/java/android/widget 4、frameworks/base/opengl/ 5、frameworks/base/libs/ui 6、frameworks/base/libs/surfaceflinger 7、frameworks/base/core/jni/android/graphics 8、frameworks/base/core/jni/android/opengl 9、frameworks/base/core/jni/android/android_view_*.cpp 10、external/skia 一、下列目录中的部分代码: 1、frameworks/base/graphics/java/android/graphics 2、frameworks/base/core/java/android/view 3、frameworks/base/core/java/android/widget android.graphics, android.view 和 android.widget 功能和其他类似的图形库 如 Qt/Gtk+差不多, 分别提供基本的图形原语 (如画点画线, 设置图形上下文等) , 事件机制, 以及开发图形用户界面的控件等。 canvas 用于开发 2D 图形, Surface 代表一个可供图形系统绘制的 surface。可在其上绘制 2D 活 3D 图形。

O大,请问 surfaceflinger 是什么,在系统里最耗电

关 于耗电的问题,是多种原因引起的,其中最主要的原因是有些应用不能正常退出,一直在后台运行。请进入设置-电 量,查看哪 些应用消耗 了过多的电量。可以在桌面长按home键,清除不需要在后台运行的程序,这样可以显著减少电量的消耗。

surfaceflinger(学习surfaceflinger 有什么用)

本文编辑:admin
: surfaceflinger,

更多文章:


霹雳布袋戏惊涛骇浪(快手霹雳布袋戏背景音乐是啥)

霹雳布袋戏惊涛骇浪(快手霹雳布袋戏背景音乐是啥)

本文目录快手霹雳布袋戏背景音乐是啥霹雳布袋戏之人物记:无衣师尹惊涛骇浪的乐曲通顺吗快手霹雳布袋戏背景音乐是啥霹雳战魔策第六集末尾新人物出场(一个拐杖的老头,一个射箭的姑娘,一个井里面出来的光球)出场的BGM是:共仰瞻风的BGM:天沐春风(非

2024年4月5日 14:15

qq网页即时聊天(电脑连接手机如何查QQ聊天记录)

qq网页即时聊天(电脑连接手机如何查QQ聊天记录)

本文目录电脑连接手机如何查QQ聊天记录QQ, 微信,电话,消息同时亮,你会点开哪个电脑连接手机如何查QQ聊天记录设置方法如下:1、电脑登录QQ,点击左下角的“系统设置菜单”。2、进入系统设置菜单,点击“安全设置”。3、点击页面左侧的“消息记

2023年11月1日 21:00

javascript常用内置对象(javascript内置对象有哪些)

javascript常用内置对象(javascript内置对象有哪些)

本文目录javascript内置对象有哪些什么是“JS”的内置对象js面向对象的几种方式什么是“js”的内置对象javascript对象之内置对象Math使用方法javascript宿主对象和内置对象的区别是什么Javascript的内置对

2024年7月23日 20:07

stones是什么意思(sticks and stones究竟是啥意思)

stones是什么意思(sticks and stones究竟是啥意思)

本文目录sticks and stones究竟是啥意思英文stone是什么意思,stone翻译解释,stone中文意思,stone用法及读音石子的英文单词是什么是不是也有石头的意思的 stone stones是什么意思sticks and

2023年7月18日 15:20

旅游网站素材(制作旅游网站内容需要收集什么素材)

旅游网站素材(制作旅游网站内容需要收集什么素材)

本文目录制作旅游网站内容需要收集什么素材旅游景点介绍素材库app 旅游景点介绍ppt要做一个小县城的旅游宣传片,有哪些参考素材网站推荐抖音团购旅游门票在哪找素材旅游带券怎么获取景区素材旅游带券达人怎么找素材旅游带券达人素材在哪里找制作旅游网

2024年7月24日 02:44

int型数组的长度(C语言的char,short,int和long类型分别有多长)

int型数组的长度(C语言的char,short,int和long类型分别有多长)

其实int型数组的长度的问题并不复杂,但是又很多的朋友都不太了解C语言的char,short,int和long类型分别有多长,因此呢,今天小编就来为大家分享int型数组的长度的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧

2024年6月30日 10:15

算法工程师和程序员区别(算法工程师是码农吗)

算法工程师和程序员区别(算法工程师是码农吗)

本文目录算法工程师是码农吗算法工程师和程序员哪个工资更高程序员与工程师软件工程师和程序员的区别算法工程师和软件工程师的区别在哪里,他们工作算法工程师和程序员区别人工智能算法工程师与Python工程师有什么区别算法工程师和程序员哪个高算法工程

2024年7月22日 18:46

net user更改管理员密码(user可以通过cmd更改administrator的密码吗)

net user更改管理员密码(user可以通过cmd更改administrator的密码吗)

本文目录user可以通过cmd更改administrator的密码吗在不知道密码的情况下,如何修改电脑管理员密码怎么修改管理员密码win10怎么修改administrator管理员账户密码怎么修改电脑管理员密码Windows如何修改Admi

2024年6月25日 04:17

乒乓球是哪个国家发明出来的(乒乓球最早起源于哪个国家)

乒乓球是哪个国家发明出来的(乒乓球最早起源于哪个国家)

“乒乓球是哪个国家发明出来的”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看乒乓球是哪个国家发明出来的(乒乓球最早起源于哪个国家)!本文目录乒乓球最早起源于哪个国家乒乓球是哪国人发明的乒乓球最早起源于哪个国家乒乓球最早起源于

2024年9月2日 13:55

matlab中patch函数的用法(matlab中如何获取patch函数画出多面体得网格坐标(x,y,z))

matlab中patch函数的用法(matlab中如何获取patch函数画出多面体得网格坐标(x,y,z))

大家好,今天小编来为大家解答以下的问题,关于matlab中patch函数的用法,matlab中如何获取patch函数画出多面体得网格坐标(x,y,z)这个很多人还不知道,现在让我们一起来看看吧!本文目录matlab中如何获取patch函数画

2024年7月2日 19:55

acquisition词根词缀(背英语单词问题)

acquisition词根词缀(背英语单词问题)

本文目录背英语单词问题怎么记忆这些单词背英语单词问题英语单词记忆法探究 等。 音译词是根据译音转变而成的词,大多数是词汇发展演变和翻译过程中造的词,它有英文音译成中文,中文译成英文,读音偶合三种情况。 例:英文译成中文:humor(幽默),

2023年10月9日 17:20

kafka延时队列(Kafka延时队列)

kafka延时队列(Kafka延时队列)

各位老铁们,大家好,今天由我来为大家分享kafka延时队列,以及Kafka延时队列的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录Kafka延时队列

2024年7月1日 19:25

java接口详解(java 接口)

java接口详解(java 接口)

本文目录java 接口java中的接口指的是什么呀java 接口什么是接口 Java中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同

2024年7月21日 05:43

最强大脑滑块游戏(最强大脑第五季中的游戏是什么)

最强大脑滑块游戏(最强大脑第五季中的游戏是什么)

大家好,最强大脑滑块游戏相信很多的网友都不是很明白,包括最强大脑第五季中的游戏是什么也是一样,不过没有关系,接下来就来为大家分享关于最强大脑滑块游戏和最强大脑第五季中的游戏是什么的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开

2024年8月20日 23:00

in the manner of(in the matter of 是什么意思)

in the manner of(in the matter of 是什么意思)

本文目录in the matter of 是什么意思In A manner of Speaking 歌词的翻译“in the manner of“:是什么意思in the manner of是什么意思仔细讲讲manner的词性和用法求大神

2024年7月15日 06:49

c语言函数指针赋值(C语言指针赋初值问题)

c语言函数指针赋值(C语言指针赋初值问题)

各位老铁们好,相信很多人对c语言函数指针赋值都不是特别的了解,因此呢,今天就来为大家分享下关于c语言函数指针赋值以及C语言指针赋初值问题的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录C语言指针赋初值问题c语言中

2024年8月19日 23:45

javaee小型项目(eclipsejavaee项目如何查看首页)

javaee小型项目(eclipsejavaee项目如何查看首页)

本文目录eclipsejavaee项目如何查看首页学会JavaEE可以做什么如何用eclipse创建一个javaee的web工程javaee都是做哪方面的项目eclipsejavaee项目如何查看首页在Eclipse中打开Java EE项目

2024年7月12日 03:10

ifrow函数的使用方法(excel中if函数怎么用里面有三个值,)

ifrow函数的使用方法(excel中if函数怎么用里面有三个值,)

本文目录excel中if函数怎么用里面有三个值,if函数和row函数的嵌套表示什么意思excel取绝对值函数excel函数,如何去除某列空值行,形成新的一列,求函数excel中if函数怎么用里面有三个值,if函数的使用方法:1、在excel

2024年7月23日 06:53

用asp设计网页实例(asp网页设计)

用asp设计网页实例(asp网页设计)

大家好,关于用asp设计网页实例很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于asp网页设计的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录asp网页

2024年8月2日 17:55

16进制转换10进制在线(16进制怎么换算10进制)

16进制转换10进制在线(16进制怎么换算10进制)

本文目录16进制怎么换算10进制16进制怎么转换成10进制16进制怎么换算10进制十进数制每位有10个可能的值:0-9。十六进制则在这些数字基础上加了A、B、C、D、E。 在同时书写不同数制系统的时候,需要标明是哪一进制的数。比如十进制51

2024年7月10日 01:21

近期文章

本站热文

iphone vpn设置(ios设置vpn快捷开关)
2024-07-22 15:01:12 浏览:2334
windows12正式版下载(操作系统Windows Server 2012 R2,在哪能下载到,公司用的)
2024-07-20 17:26:53 浏览:1730
java安装教程(win10如何安装JAVA)
2024-07-19 19:55:49 浏览:1154
client mfc application未响应(每次进cf就提示client MFC Application未响应该怎么办啊!急急急)
2024-07-20 11:15:58 浏览:1151
标签列表

热门搜索