命令提交方法和装置、命令读取方法和装置、电子设备与流程

文档序号:25703878发布日期:2021-06-30 01:10阅读:275来源:国知局
命令提交方法和装置、命令读取方法和装置、电子设备与流程

1.本申请涉及图像处理技术,具体地,涉及一种命令提交方法和装置、命令读取方法和装置、电子设备。


背景技术:

2.在opengl(open graphics library)中,cpu(central processing unit,中央处理器)为每个客户端程序都预留了一个专属的命令缓冲区,命令缓冲区中存储着多个需要gpu(graphics processing unit,图形处理器)执行的图像处理命令(例如渲染等),这些图像处理命令会被cpu从命令缓冲区中复制到命令队列中,gpu按顺序执行命令队列中的图像处理命令。
3.目前通常是使用ring buffer模式来提交图像处理命令,在使用这种模式提交图像处理命令之前,需要提前申请一部分内存作为环形命令队列,在cpu和gpu之间建立提交命令的通道,且环形命令队列中存在读写两种指针,cpu从写指针的位置向环形命令队列中写入命令,gpu从读指针的位置从环形命令队列中读取命令,完成一次写入或读取命令后更新读写指针的位置。
4.由于环形命令队列需要提前申请一部分内存,申请的内存过大或者过小都会存在一些问题。若申请的内存较小,在一段时间后环形命令队列中可能积累大量的需要gpu处理的图像处理命令,此时cpu就必须进入等待状态,直到环形命令队列中出现能够容纳cpu提交的命令的内存;如果申请的内存过大,在大多数情况下环形命令队列可能处于非满的状态,浪费内存资源。


技术实现要素:

5.本申请实施例中提供了一种命令提交方法和装置、命令读取方法和装置、电子设备,用于解决现有技术中内存资源浪费的情况。
6.根据本申请实施例的第一个方面,提供了一种命令提交方法,应用于电子设备的cpu,所述电子设备包括命令队列和命令缓冲区,所述方法包括:
7.将第一链接指令插入所述命令队列中;
8.判断是否存在待gpu执行的图像处理命令;
9.若存在待gpu执行的图像处理命令,将待gpu执行的图像处理命令提交到所述命令缓冲区,并在所述命令缓冲区的末尾插入第二链接指令;
10.将所述第一链接指令的链接地址配置为所述命令缓冲区对应的地址;
11.将所述第二链接指令的链接地址配置为等待指令或下一个第一链接指令,以使所述gpu执行所述第二连接指令后跳转至等待指令或下一个第一链接指令。
12.根据本申请实施例的第二个方面,提供了一种命令读取方法,应用于电子设备的gpu,所述方法包括:
13.在存在待执行的图像处理命令时,读取命令队列中的第一链接指令后跳转至所述
命令缓冲区;
14.依次读取并执行命令缓冲区中的图像处理命令;
15.在执行完所述命令缓冲区中的图像处理命令之后,读取所述第二链接指令后跳转至等待指令或下一个第一链接指令。
16.根据本申请实施例的第三个方面,提供了一种命令提交装置,应用于电子设备的cpu,所述电子设备包括命令队列和命令缓冲区,所述装置包括:
17.指令插入模块,用于将第一链接指令插入所述命令队列中;
18.判断模块,用于判断是否存在待gpu执行的图像处理命令;
19.命令提交模块,用于在存在待gpu执行的图像处理命令时,将待gpu执行的图像处理命令提交到所述命令缓冲区;
20.所述指令插入模块还用于在所述命令缓冲区的末尾插入第二链接指令;
21.指令配置模块,用于将所述第一链接指令的链接地址配置为所述命令缓冲区对应的地址,将所述第二链接指令的链接地址配置为等待指令或下一个第一链接指令,以使所述gpu执行所述第二连接指令后跳转至等待指令或下一个第一链接指令。
22.根据本申请实施例的第四个方面,提供了一种命令读取装置,应用于电子设备的gpu,所述装置包括:
23.命令读取模块,用于在存在待执行的图像处理命令时,读取命令队列中的第一链接指令后跳转至命令缓冲区;依次读取并执行所述命令缓冲区中的图像处理命令;在执行完所述命令缓冲区中的图像处理命令之后,读取所述第二链接指令后跳转至等待指令或下一个第一链接指令。
24.根据本申请实施例的第五个方面,提供了一种电子设备,包括:处理器、存储器和总线,所述处理器包括cpu和gpu,所述存储器存储有所述处理器可执行的机器可读指令,当所述电子设备运行时,所述处理器与所述存储器之间通过所述总线通信,所述机器可读指令被所述处理器执行时执行上述实施例提供的命令提交方法或命令读取方法。
25.根据本申请实施例的第六个方面,提供了一种存储介质,所述存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行上述实施例提供的命令提交方法或命令读取方法。
26.本申请实施例提供了一种命令提交方法和装置、命令读取方法和装置、电子设备,在本实施例中,首先将第一链接指令插入命令队列中,在存在待gpu执行的图像处理命令时,将待gpu执行的图像处理命令提交到命令缓冲区,并在命令缓冲区的末尾插入第二链接指令;将第一链接指令的链接地址配置为命令缓冲区对应的地址;将第二链接指令的链接地址配置为等待指令或下一个第一链接指令,以使gpu在执行第二连接指令后能够跳转至等待指令或下一个第一链接指令。在本申请实施例中,待gpu执行的图像处理命令全部被提交到命令缓冲区中,命令队列中只有链接指令,通过链接指令能够使gpu跳转到命令缓冲区,以读取并执行命令缓冲区中的图像处理命令,无需提前申请一部分内存用于存储待执行的图像处理命令,节省内存资源。
附图说明
27.此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申
请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
28.图1为现有技术提供的提交图像处理命令的示意图;
29.图2为本申请实施例提供的ring buffer模式的原理图;
30.图3为本申请实施例提供的命令提交方法的流程图之一;
31.图4为本申请实施例提供的活跃状态的命令队列的示意图之一;
32.图5为本申请实施例提供的活跃状态的命令队列的示意图之二;
33.图6为本申请实施例提供的活跃状态的命令队列的示意图之三;
34.图7为本申请实施例提供的命令提交方法的流程图之二;
35.图8为本申请实施例提供的非活跃状态的命令队列的示意图之一;
36.图9为本申请实施例提供的非活跃状态的命令队列的示意图之二;
37.图10为本申请实施例提供的命令提交装置的功能模块图;
38.图11为本申请实施例提供的电子设备的示意图。
39.图标:10

电子设备;11

处理器;12

存储器;13

总线;110

命令提交装置;1101

指令插入模块;1102

判断模块;1103

命令提交模块;1104

命令配置模块;1105

循环模块。
具体实施方式
40.在实现本申请的过程中,发明人发现,在opengl(open graphics library)中,每个客户端程序都有一个专属于自己的渲染上下文(context),渲染上下文包括一个客户端程序私有的命令缓冲区,命令缓冲区中存储着多个需要gpu(graphics processing unit)执行的图像处理命令,而这些命令缓冲区中的图像处理命令需要复制到命令队列中,gpu按照顺序从命令队列中读取并执行这些图像处理命令。一个优秀的命令队列必须能够接收各个命令缓冲区提交的待gpu执行的命令,也能够按照先进先出的原则按顺序地交给gpu去执行这些命令。如图1所示,图1为现有技术提供的提交图像处理命令的示意图。
41.为了保证能够有序的提交图像处理命令且让gpu按序执行,目前通常使用的是ring buffer(环形缓冲区)的模式来提交命令,如图2所示,图2为本申请实施例提供的ring buffer模式的原理图。在此种命令提交模式中,需要提前在cpu的内存(或gpu的显存)申请一部分内存用作环形命令队列,用于在cpu和gpu之间建立提交命令通道,命令队列中存在读指针和写指针,cpu在写入图像处理命令(即将客户端提交的图像处理命令提交到环形命令队列中)时,从写指针所在的位置写入图像处理命令,gpu在读取图像处理命令时,从读指针所在的位置读取图像处理命令,在每一次写入命令或读取命令完成之后,都会更新读指针和写指针的位置。
42.虽然这种机制可以实现有序的向命令队列提交待执行的图像处理命令且让gpu按序执行,但是无法确定环形命令队列需要提前申请的内存大小。如果申请的内存较小,经过一段时间后环形命令队列中会累积较多的需要gpu处理的图像处理命令过多,没有更多的内存能够继续容纳cpu提交的图像处理命令,此时cpu就必须进入等待状态,直到环形命令队列中出现足够的内存空间之后,cpu才能够再次向环形命令队列中添加命令;如果申请的内存过大,那么可能需要很多的图像处理命令才能完全填满环形命令队列,在大多数情况下,环形命令队列可能处于非满状态,浪费内存资源。
43.针对上述问题,本申请实施例提供了一种命令提交方法和装置、命令读取方法和
装置、电子设备,在本实施例中,首先将第一链接指令插入命令队列中,在存在待gpu执行的图像处理命令时,将待gpu执行的图像处理命令提交到命令缓冲区,并在命令缓冲区的末尾插入第二链接指令;将第一链接指令的链接地址配置为命令缓冲区对应的地址;将第二链接指令的链接地址配置为等待指令或下一个第一链接指令,以使gpu在执行第二连接指令后能够跳转至等待指令或下一个第一链接指令。在本申请实施例中,待gpu执行的图像处理命令全部被提交到命令缓冲区中,命令队列中只有链接指令,通过链接指令能够使gpu跳转到命令缓冲区,以读取并执行命令缓冲区中的图像处理命令,无需提前申请一部分内存用于存储待执行的图像处理命令,不会存在浪费内存的情况,也不会存在需要cpu等待的情况。
44.为了使本申请实施例中的技术方案及优点更加清楚明白,以下结合附图对本申请的示例性实施例进行进一步详细的说明,显然,所描述的实施例仅是本申请的一部分实施例,而不是所有实施例的穷举。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。
45.请参照图3,图3为本申请实施例提供的命令提交方法的流程图之一。在本实施例中,命令提交方法应用于电子设备的cpu,电子设备还包括gpu、命令队列和命令缓冲区,所述方法包括:
46.步骤s11,将第一链接指令插入命令队列中。
47.步骤s12,判断是否存在待gpu执行的图像处理命令。
48.步骤s13,若存在待gpu执行的图像处理命令,将待gpu执行的图像处理命令提交到命令缓冲区,并在命令缓冲区的末尾插入第二链接指令。
49.步骤s14,将第一链接指令的链接地址配置为命令缓冲区对应的地址。
50.步骤s15,将第二链接指令的链接地址配置为等待指令或下一个第一链接指令,以使gpu执行第二连接指令后跳转至等待指令或下一个第一链接指令。
51.重复上述步骤,直至所有待gpu执行的图像处理命令被提交至命令缓冲区中。
52.在上述步骤中,待gpu执行的图像处理命令全部被提交到命令缓冲区中,命令队列中只有链接指令,通过链接指令能够使gpu跳转到命令缓冲区,以读取并执行命令缓冲区中的图像处理命令,无需提前申请一部分内存用于存储待执行的图像处理命令,不会存在浪费内存的情况,也不会存在需要cpu等待的情况,节省内存资源。
53.在本实施例中,在客户端程序提交了待gpu执行的图像处理命令后,cpu需要将这些图像处理命令提交到命令缓冲区中,以供gpu读取并执行。
54.可选地,cpu在提交图像处理命令的过程中,首先需要将第一链接指令插入到命令队列中,此时命令队列的队列头指针和队列尾指针均指向该第一链接指令。其中,队列头指针用于指示gpu正在执行的指令所在的位置,队列尾指针用于指示cpu提交的指令的位置。
55.因此gpu根据队列头指针所在的位置开始读取第一链接指令,随后判断是否存在待gpu执行的图像处理命令,即客户端程序是否提交了需要gpu处理的命令,若存在待gpu执行的图像处理命令(可以将此状态定义为活跃状态),则将图像处理命令按照顺序提交到命令缓冲区中,并在命令缓冲区的末尾插入第二链接指令。
56.然后将第一链接指令的链接地址修改为命令缓冲区对应的地址,即gpu在读取到第一链接指令后会跳转至命令缓冲区;再将第二链接指令的链接地址配置为等待指令或者
下一个第一链接指令,当gpu处理完命令缓冲区中的所有图像处理命令之后,会按照顺序读取第二链接指令,随后跳转至等待指令或是下一个第一链接指令。此时,cpu插入指令的位置已经到了下一个第一链接指令所在的位置,因此队列尾指针应当位于下一个第一链接指令所在的位置。如图4所示,图4为本申请实施例提供的活跃状态的命令队列的示意图之一。
57.可选地,在本实施例中,gpu在执行完一条图像处理命令后,队列头指针会被更新到下一条图像处理命令所在的位置,因此gpu可以根据队列头指针所在的位置依次处理图像处理命令。
58.如图5所示,图5为本申请实施例提供的活跃状态的命令队列的示意图之二。在执行完一个命令缓冲区的图像处理命令之后,跳转到下一个第一链接指令,然后继续判断是否还存在待gpu执行的图像处理命令,若存在,则将图像处理命令提交到第二个命令缓冲区中,并在第二个命令缓冲区的末尾再增加一个第二链接指令,增加的第二链接指令的链接地址被配置为等待指令或者下一个第一链接指令;然后需要将第一链接指令的链接地址配置为第二个命令缓冲区所在的地址。
59.也就是说,当gpu在执行完第一个命令缓冲区末尾的第二链接指令后会跳转到下一个第一链接指令,并跳转至第一链接指令链接的第二个命令缓冲区继续读取并执行第二个命令缓冲区中的图像处理命令,在此之后,gpu继续读取第二个命令缓冲区末尾的第二链接指令,并跳转至第二链接指令链接的等待指令或下一个第一链接指令。
60.重复上述步骤,直至所有的待执行的图像处理命令均被提交到命令缓冲区中。
61.可选地,在本实施例中,等待指令中包括有需要gpu等待的时间,例如,等待指令指示gpu的等待时间为30毫秒,则gpu在等待30毫秒后才会执行等待指令的下一条指令。
62.如图6所示,图6为本申请实施例提供的活跃状态的命令队列的示意图之三。当第二链接指令的链接地址为等待指令时,等待指令的下一条指令为一个链接指令(图6中的第三链接指令),该第三链接指令的链接地址为该等待指令。也即是说,当不存在待gpu执行的图像处理命令时,即gpu执行完最后一个命令缓冲区的所有命令后,执行该命令缓冲区末尾的第二链接指令后跳转至等待指令,在执行完等待指令后按顺序执行第三链接指令,在执行第三链接指令后跳转至该等待指令继续执行,进入循环流程,等待出现需要执行的图像处理命令。
63.在检测到存在需要gpu处理的图像处理命令,判断结果为后续还存在待gpu执行的图像处理命令,则需要将等待指令更改为第一链接指令,以使gpu能够跳出等待的循环流程,继续执行后续的指令。
64.可选地,请参照图7,图7为本申请实施例提供的命令提交方法的流程图之二。在本实施例中,在步骤s12之后,该方法还包括:
65.步骤s16,若不存在待gpu执行的图像处理命令,将第一链接指令的链接地址配置为第一链接指令,以使gpu循环执行第一链接指令。
66.在上述步骤中,如图8所示,图8为本申请实施例提供的非活跃状态的命令队列的示意图之一。在本实施例中,若客户端程序没有向cpu提交图像处理命令,即不存在待gpu执行的图像处理命令(可以将此状态定义为非活跃状态),则需要将第一链接指令的链接地址配置为自身对应的地址。gpu在执行时便会循环执行第一链接指令,直到存在需要gpu处理的图像处理命令。
67.在存在需要gpu处理的图像处理命令时,可参照步骤s13至步骤s15所描述的方法,此时将第一链接指令的链接地址配置为命令缓冲区,gpu便会跳转至命令缓冲区读取命令。
68.可选地,在另一种实施方式中,在步骤s12之后,该方法还包括:若不存在待gpu执行的图像处理命令,在第一链接指令前插入等待指令,并将第一链接指令的链接地址配置为等待指令。
69.在上述步骤中,如图9所示,图9为本申请实施例提供的非活跃状态的命令队列的示意图之二。在本实施例中,在不存在待gpu执行的图像处理命令时,可以在第一链接指令前插入等待指令,将等待指令的下一指令即为第一链接指令,同时将第一链接指令的链接地址配置为等待指令。
70.gpu在执行时,首先执行等待指令,在等待一段时间后,执行下一指令(即第一链接指令),在执行第一链接指令时会跳转到等待指令进行执行,从而使得gpu进入循环等待的流程,直到出现需要gpu执行的图像处理命令,gpu才会跳出循环等待的流程。
71.可选地,在本实施例中,命令队列还包括队列尾指针,在cpu每插入一个第一链接指令时,将队列尾指针指向的位置更新为插入的第一链接指令所在的位置。也即是说,每当cpu提交一个指令后,队列尾指针指向的位置都会更新至最新提交的指令所在的位置。
72.可选地,在本实施例中,队列头指针初始化时指向命令队列中的第一个指令(等待指令或是第一链接指令),若命令队列处于非活跃状态,则队列头指针不需要更新指针的位置,若命令队列处于活跃状态,当gpu每执行完一条指令都需要更新指针位置。
73.队列尾指针初始化时指向命令队列中的第一个指令(等待指令或是第一链接指令),若命令队列处于非活跃状态,则队列尾指针不需要更新指针的位置,若命令队列处于活跃状态,每新插入一个第一链接指令,队列尾指针被更新到新的第一链接指令所在的位置。
74.综上所述,本申请实施例提供了一种命令提交方法,在本实施例中,首先将第一链接指令插入命令队列中,在存在需要gpu执行的图像处理命令时,将需要gpu执行的图像处理命令提交到命令缓冲区,并在命令缓冲区的末尾插入第二链接指令;将第一链接指令的链接地址配置为命令缓冲区对应的地址;将第二链接指令的链接地址配置为等待指令或下一个第一链接指令,以使gpu在执行第二连接指令后能够跳转至等待指令或下一个第一链接指令;重复上述步骤,直至所有需要gpu执行的图像处理命令全部被提交至所述命令缓冲区中。
75.通过上述实施例提供的命令队列,需要gpu执行的图像处理命令全部被提交到命令缓冲区中,命令队列中只有链接指令,通过链接指令能够使gpu跳转到命令缓冲区,gpu能够方便地从命令缓冲区中读取命令进行执行。此外,使用此方式,无需提前申请一部分内存用于存储待执行的图像处理命令,不存在队列被图像处理命令占满(即无内存)的情况,cpu也就不会等待提交命令,更不会存在浪费内存的情况。
76.本申请实施例还提供了一种命令读取方法,应用于电子设备的gpu,电子设备还包括cpu、命令队列和命令缓冲区,所述方法包括:
77.在存在待执行的图像处理命令时,读取命令队列中的第一链接指令后跳转至命令缓冲区;依次读取并执行命令缓冲区中的图像处理命令;在执行完命令缓冲区中的图像处理命令之后,读取第二链接指令后跳转至等待指令或下一个第一链接指令。
78.在本实施例中,若存在需要gpu执行的图像处理命令,则gpu首先读取命令队列中的第一链接指令,然后跳转至命令缓冲区依次读取命令缓冲区中的图像处理命令,随后读取命令缓冲区末尾的第二链接指令,并跳转至下一个第一链接指令或者等待指令。
79.若不存在需要需要gpu执行的图像处理命令,则gpu读取第一链接指令后跳转至该第一链接指令或跳转至等待指令。
80.gpu的命令读取方法已在前述实施例中进行了详细描述,在此不再赘述。
81.请参照图10,图10为本申请实施例提供的命令提交装置110的功能模块图,应用于电子设备的cpu,所述电子设备还包括gpu、命令队列和命令缓冲区,所述装置包括:
82.指令插入模块1101,用于将第一链接指令插入所述命令队列中。
83.判断模块1102,用于判断是否存在需要gpu执行的图像处理命令。
84.命令提交模块1103,用于在存在需要gpu执行的图像处理命令时,将待gpu执行的图像处理命令提交到所述命令缓冲区。
85.所述指令插入模块1101还用于在所述命令缓冲区的末尾插入第二链接指令。
86.指令配置模块1104,用于将所述第一链接指令的链接地址配置为所述命令缓冲区对应的地址,将所述第二链接指令的链接地址配置为等待指令或下一个第一链接指令,以使所述gpu执行所述第二连接指令后跳转至等待指令或下一个第一链接指令。
87.在一种可选的实施方式中,所述装置还包括指针更新模块,用于在每插入一个第一链接指令时,将所述队列尾指针指向的位置更新为插入的第一链接指令所在的位置。
88.在一种可选的实施方式中,所述指令配置模块1104还用于:
89.在不存在待gpu执行的图像处理命令时,将所述第一链接指令的链接地址配置为所述第一链接指令,以使所述gpu循环执行所述第一链接指令。
90.在另一种可选的实施方式中,所述指令配置模块1104还用于:
91.在不存在待gpu执行的图像处理命令时,在所述第一链接指令前插入等待指令,并将所述第一链接指令的链接地址配置为所述等待指令。
92.可选地,本申请实施例还提供了一种命令读取装置,命令读取装置应用于电子设备的gpu,所述电子设备还包括cpu,所述cpu包括命令队列和命令缓冲区,所述装置包括:
93.命令读取模块,用于在存在待执行的图像处理命令时,读取所述命令队列中的第一链接指令后跳转至所述命令缓冲区;依次读取并执行所述命令缓冲区中的图像处理命令;在执行完所述命令缓冲区中的图像处理命令之后,读取所述第二链接指令后跳转至等待指令或下一个第一链接指令。
94.在一种可选的实施方式中,命令读取模块还用于在不存在待执行的图像处理命令时,读取所述第一链接指令后跳转至所述第一链接指令或跳转至等待指令。
95.请参照图11,图11为本申请实施例提供的电子设备10的示意图,在本实施例中,电子设备10包括处理器11、存储器12和总线13,所述处理器11包括cpu和gpu,存储器12存储有所述处理器11可执行的机器可读指令,当电子设备10运行时,处理器11与存储器12之间通过所述总线13通信,所述机器可读指令被所述处理器11执行时执行本申请实施例提供的命令提交方法或命令读取方法。
96.本申请实施例还提供了一种存储介质,所述存储介质上存储有计算机程序,所述计算机程序被处理器运行时执行本申请实施例提供的命令提交方法或命令读取方法。
97.本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd

rom、光学存储器等)上实施的计算机程序产品的形式。
98.本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
99.这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
100.这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
101.尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
102.显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1