谁闲着没事干的,帮我看下这个问题

时间:2023-01-25 18:57:15
http://download.csdn.net/source/2086425
俄罗斯方块,已经完成
移动和旋转时有声音,可是当我定定按住不放时,久了声音会变得卡卡的,而且内存上涨,CPU使用率也上涨
播放声音在GameCanvas的keyPressed里

21 个解决方案

#1


刚下载了,跑起来玩了玩,还不错!学习

#2


引用楼主 jxsfreedom 的回复:
http://download.csdn.net/source/2086425
俄罗斯方块,已经完成
移动和旋转时有声音,可是当我定定按住不放时,久了声音会变得卡卡的,而且内存上涨,CPU使用率也上涨
播放声音在GameCanvas的keyPressed里
内存管理要做好。对象要做好复用。没有用的对象马上放弃引用。

#3


估计是你用List容器装东西之后,没用施放用完的东西,造成每次从List里面取东西的时候都要循环很多次,当然玩得越久运行效率就越低了

#4


引用 3 楼 feijie89 的回复:
估计是你用List容器装东西之后,没用施放用完的东西,造成每次从List里面取东西的时候都要循环很多次,当然玩得越久运行效率就越低了

我所说的内存上涨和CPU上涨并不是图形方块的问题,而是播放那个音频文件导致的,如果不播放那个文件根本没见有内存上涨的现象,因为图形方块消行后我都会检查并消除这个对象

#5


定定按住不放时,keyPressed事件不停触发,因此一直在

if (moveMusic != null){
moveMusic.stop();
System.gc();
}
moveMusic = new Music(System.getProperty("user.dir") + "/sound/move.wav");
moveMusic.start();

一直新建Music对象,因此声音卡卡,而且占用内存
建议你在GameCanvas中设置boolean变量up_pressed,down_pressed等等
然后在keyPressed事件中设置其为true,keyReleased事件中设置其为false;
播放时以up_pressed等变量的值作为判断条件,若为false则不新建Music

#6


引用 5 楼 qianzhimeiying 的回复:
定定按住不放时,keyPressed事件不停触发,因此一直在
Java codeif (moveMusic!=null){
                            moveMusic.stop();
                            System.gc();
                        }
                        moveMusic=new Music(System.getProperty("user.dir")+"/sound/move.wav");
                        moveMusic.start();
一直新建Music对象,因此声音卡卡,而且占用内存
建议你在GameCanvas中设置boolean变量up_pressed,down_pressed等等
然后在keyPressed事件中设置其为true,keyReleased事件中设置其为false;
播放时以up_pressed等变量的值作为判断条件,若为false则不新建Music


恩,说的好,感觉是这个问题。
用一个static变量吧,然后用的时候改就行了,毕竟同一时间播放两个不同声音的情况比较少吧。

#7


引用 5 楼 qianzhimeiying 的回复:
定定按住不放时,keyPressed事件不停触发,因此一直在
Java codeif (moveMusic!=null){
                            moveMusic.stop();
                            System.gc();
                        }
                        moveMusic=new Music(System.getProperty("user.dir")+"/sound/move.wav");
                        moveMusic.start();
一直新建Music对象,因此声音卡卡,而且占用内存
建议你在GameCanvas中设置boolean变量up_pressed,down_pressed等等
然后在keyPressed事件中设置其为true,keyReleased事件中设置其为false;
播放时以up_pressed等变量的值作为判断条件,若为false则不新建Music

你的意思是若为true就新建Music吗?这样不是和我现在的代码一样的吗?按住不放,变量肯定为true,那不就一直新建了吗

#8


引用 2 楼 defonds 的回复:
引用楼主 jxsfreedom 的回复:http://download.csdn.net/source/2086425 俄罗斯方块,已经完成移动和旋转时有声音,可是当我定定按住不放时,久了声音会变得卡卡的,而且内存上涨,CPU使用率也上涨播放声音在GameCanvas的keyPressed里内存管理要做好。对象要做好复用。没有用的对象马上放弃引用。

放弃引用也无法保证内存马上被释放吧

#9


为true只是条件之一,另外的条件是Music.isAlive()
你的music不是继承了Thread么?
这样判断一下,播放音效的线程是否跑完了,保证每一个音效能够完整播放完,再由下一个按钮事件触发播放

#10


引用 6 楼 xiesisi3 的回复:
引用 5 楼 qianzhimeiying 的回复:定定按住不放时,keyPressed事件不停触发,因此一直在 Java codeif (moveMusic!=null){ moveMusic.stop(); System.gc(); } moveMusic=new Music(System.getProperty("user.dir")+"/sound/move.wav"); moveMusic.start(); 一直新建Music对象,因此声音卡卡,而且占用内存建议你在GameCanvas中设置boolean变量up_pressed,down_pressed等等然后在keyPressed事件中设置其为true,keyReleased事件中设置其为false; 播放时以up_pressed等变量的值作为判断条件,若为false则不新建Music

恩,说的好,感觉是这个问题。
用一个static变量吧,然后用的时候改就行了,毕竟同一时间播放两个不同声音的情况比较少吧。


我的代码是music不等于空就会终止,只是不能马上释放内存,也不可能控制得了吧,线程终止,声音就不会被播放了,可是不知道为什么会出现声音卡卡的

#11


引用 9 楼 qianzhimeiying 的回复:
为true只是条件之一,另外的条件是Music.isAlive()
你的music不是继承了Thread么?
这样判断一下,播放音效的线程是否跑完了,保证每一个音效能够完整播放完,再由下一个按钮事件触发播放

你的意思是等一个音频播放完了才能新建另一个播放吗?如果是这样的话你想象一下,按住移动不放,方块飞快的移动,而声音则是播放完一个再播放另一个,也就是节奏跟不上,以前玩那种手机的游戏机的俄罗斯方块也应该注意到吧,按住不放的时候,声音是接连不断的,很急促

#12


......原来你希望声音卡卡的......
但是new Music要有限度,至少也要在Music = new Music之前写个movemusic = null;
我以前写的时候,一共就4种音效,因此都写成了静态对象,作为GamePanel的4个变量,
就是用上面定的标志位决定是否播放
你如果不想卡卡的,就事先建好,数量固定,不要每次都new,这样也不要用alive做判定了

#13


晚上回家研究下。

#14


我有个好的解决办法,你用其他的音频软件把那个音频做成那种只放前面一小部分的然后放很多次的音频文件,另存为另外一个音频,当按住不动的时候就放这个音频,当一下一下按就放原来那个音频,至于频率可以用线程控制,等待多少毫秒。

#15


引用 14 楼 xiesisi3 的回复:
我有个好的解决办法,你用其他的音频软件把那个音频做成那种只放前面一小部分的然后放很多次的音频文件,另存为另外一个音频,当按住不动的时候就放这个音频,当一下一下按就放原来那个音频,至于频率可以用线程控制,等待多少毫秒。

谢谢,不过觉得麻烦

#16


引用 12 楼 qianzhimeiying 的回复:
......原来你希望声音卡卡的......
但是new Music要有限度,至少也要在Music = new Music之前写个movemusic = null;
我以前写的时候,一共就4种音效,因此都写成了静态对象,作为GamePanel的4个变量,
就是用上面定的标志位决定是否播放
你如果不想卡卡的,就事先建好,数量固定,不要每次都new,这样也不要用alive做判定了

不知道让moveMusice=null;有什么用

#17


引用 13 楼 bayougeng 的回复:
晚上回家研究下。

谢谢!这位仁兄的头象很像我中专的一个老师呀

#18


引用 17 楼 jxsfreedom 的回复:
引用 13 楼 bayougeng 的回复:
晚上回家研究下。
 谢谢!这位仁兄的头象很像我中专的一个老师呀


这个我无语,观看。。。

#19


引用 18 楼 czmchen 的回复:
引用 17 楼 jxsfreedom 的回复:
引用 13 楼 bayougeng 的回复:
晚上回家研究下。
 谢谢!这位仁兄的头象很像我中专的一个老师呀

 这个我无语,观看。。。

而且。。。我觉得大家都不会闲着没事儿干

#20


引用 19 楼 zliuzz 的回复:
引用 18 楼 czmchen 的回复:
引用 17 楼 jxsfreedom 的回复:
引用 13 楼 bayougeng 的回复:
晚上回家研究下。
 谢谢!这位仁兄的头象很像我中专的一个老师呀

 这个我无语,观看。。。
 而且。。。我觉得大家都不会闲着没事儿干


这哥们的头像很有型

#21


引用 20 楼 mli926 的回复:
引用 19 楼 zliuzz 的回复:
引用 18 楼 czmchen 的回复:
引用 17 楼 jxsfreedom 的回复:
引用 13 楼 bayougeng 的回复:
晚上回家研究下。
 谢谢!这位仁兄的头象很像我中专的一个老师呀

 这个我无语,观看。。。
 而且。。。我觉得大家都不会闲着没事儿干

 这哥们的头像很有型

你的也不错

#1


刚下载了,跑起来玩了玩,还不错!学习

#2


引用楼主 jxsfreedom 的回复:
http://download.csdn.net/source/2086425
俄罗斯方块,已经完成
移动和旋转时有声音,可是当我定定按住不放时,久了声音会变得卡卡的,而且内存上涨,CPU使用率也上涨
播放声音在GameCanvas的keyPressed里
内存管理要做好。对象要做好复用。没有用的对象马上放弃引用。

#3


估计是你用List容器装东西之后,没用施放用完的东西,造成每次从List里面取东西的时候都要循环很多次,当然玩得越久运行效率就越低了

#4


引用 3 楼 feijie89 的回复:
估计是你用List容器装东西之后,没用施放用完的东西,造成每次从List里面取东西的时候都要循环很多次,当然玩得越久运行效率就越低了

我所说的内存上涨和CPU上涨并不是图形方块的问题,而是播放那个音频文件导致的,如果不播放那个文件根本没见有内存上涨的现象,因为图形方块消行后我都会检查并消除这个对象

#5


定定按住不放时,keyPressed事件不停触发,因此一直在

if (moveMusic != null){
moveMusic.stop();
System.gc();
}
moveMusic = new Music(System.getProperty("user.dir") + "/sound/move.wav");
moveMusic.start();

一直新建Music对象,因此声音卡卡,而且占用内存
建议你在GameCanvas中设置boolean变量up_pressed,down_pressed等等
然后在keyPressed事件中设置其为true,keyReleased事件中设置其为false;
播放时以up_pressed等变量的值作为判断条件,若为false则不新建Music

#6


引用 5 楼 qianzhimeiying 的回复:
定定按住不放时,keyPressed事件不停触发,因此一直在
Java codeif (moveMusic!=null){
                            moveMusic.stop();
                            System.gc();
                        }
                        moveMusic=new Music(System.getProperty("user.dir")+"/sound/move.wav");
                        moveMusic.start();
一直新建Music对象,因此声音卡卡,而且占用内存
建议你在GameCanvas中设置boolean变量up_pressed,down_pressed等等
然后在keyPressed事件中设置其为true,keyReleased事件中设置其为false;
播放时以up_pressed等变量的值作为判断条件,若为false则不新建Music


恩,说的好,感觉是这个问题。
用一个static变量吧,然后用的时候改就行了,毕竟同一时间播放两个不同声音的情况比较少吧。

#7


引用 5 楼 qianzhimeiying 的回复:
定定按住不放时,keyPressed事件不停触发,因此一直在
Java codeif (moveMusic!=null){
                            moveMusic.stop();
                            System.gc();
                        }
                        moveMusic=new Music(System.getProperty("user.dir")+"/sound/move.wav");
                        moveMusic.start();
一直新建Music对象,因此声音卡卡,而且占用内存
建议你在GameCanvas中设置boolean变量up_pressed,down_pressed等等
然后在keyPressed事件中设置其为true,keyReleased事件中设置其为false;
播放时以up_pressed等变量的值作为判断条件,若为false则不新建Music

你的意思是若为true就新建Music吗?这样不是和我现在的代码一样的吗?按住不放,变量肯定为true,那不就一直新建了吗

#8


引用 2 楼 defonds 的回复:
引用楼主 jxsfreedom 的回复:http://download.csdn.net/source/2086425 俄罗斯方块,已经完成移动和旋转时有声音,可是当我定定按住不放时,久了声音会变得卡卡的,而且内存上涨,CPU使用率也上涨播放声音在GameCanvas的keyPressed里内存管理要做好。对象要做好复用。没有用的对象马上放弃引用。

放弃引用也无法保证内存马上被释放吧

#9


为true只是条件之一,另外的条件是Music.isAlive()
你的music不是继承了Thread么?
这样判断一下,播放音效的线程是否跑完了,保证每一个音效能够完整播放完,再由下一个按钮事件触发播放

#10


引用 6 楼 xiesisi3 的回复:
引用 5 楼 qianzhimeiying 的回复:定定按住不放时,keyPressed事件不停触发,因此一直在 Java codeif (moveMusic!=null){ moveMusic.stop(); System.gc(); } moveMusic=new Music(System.getProperty("user.dir")+"/sound/move.wav"); moveMusic.start(); 一直新建Music对象,因此声音卡卡,而且占用内存建议你在GameCanvas中设置boolean变量up_pressed,down_pressed等等然后在keyPressed事件中设置其为true,keyReleased事件中设置其为false; 播放时以up_pressed等变量的值作为判断条件,若为false则不新建Music

恩,说的好,感觉是这个问题。
用一个static变量吧,然后用的时候改就行了,毕竟同一时间播放两个不同声音的情况比较少吧。


我的代码是music不等于空就会终止,只是不能马上释放内存,也不可能控制得了吧,线程终止,声音就不会被播放了,可是不知道为什么会出现声音卡卡的

#11


引用 9 楼 qianzhimeiying 的回复:
为true只是条件之一,另外的条件是Music.isAlive()
你的music不是继承了Thread么?
这样判断一下,播放音效的线程是否跑完了,保证每一个音效能够完整播放完,再由下一个按钮事件触发播放

你的意思是等一个音频播放完了才能新建另一个播放吗?如果是这样的话你想象一下,按住移动不放,方块飞快的移动,而声音则是播放完一个再播放另一个,也就是节奏跟不上,以前玩那种手机的游戏机的俄罗斯方块也应该注意到吧,按住不放的时候,声音是接连不断的,很急促

#12


......原来你希望声音卡卡的......
但是new Music要有限度,至少也要在Music = new Music之前写个movemusic = null;
我以前写的时候,一共就4种音效,因此都写成了静态对象,作为GamePanel的4个变量,
就是用上面定的标志位决定是否播放
你如果不想卡卡的,就事先建好,数量固定,不要每次都new,这样也不要用alive做判定了

#13


晚上回家研究下。

#14


我有个好的解决办法,你用其他的音频软件把那个音频做成那种只放前面一小部分的然后放很多次的音频文件,另存为另外一个音频,当按住不动的时候就放这个音频,当一下一下按就放原来那个音频,至于频率可以用线程控制,等待多少毫秒。

#15


引用 14 楼 xiesisi3 的回复:
我有个好的解决办法,你用其他的音频软件把那个音频做成那种只放前面一小部分的然后放很多次的音频文件,另存为另外一个音频,当按住不动的时候就放这个音频,当一下一下按就放原来那个音频,至于频率可以用线程控制,等待多少毫秒。

谢谢,不过觉得麻烦

#16


引用 12 楼 qianzhimeiying 的回复:
......原来你希望声音卡卡的......
但是new Music要有限度,至少也要在Music = new Music之前写个movemusic = null;
我以前写的时候,一共就4种音效,因此都写成了静态对象,作为GamePanel的4个变量,
就是用上面定的标志位决定是否播放
你如果不想卡卡的,就事先建好,数量固定,不要每次都new,这样也不要用alive做判定了

不知道让moveMusice=null;有什么用

#17


引用 13 楼 bayougeng 的回复:
晚上回家研究下。

谢谢!这位仁兄的头象很像我中专的一个老师呀

#18


引用 17 楼 jxsfreedom 的回复:
引用 13 楼 bayougeng 的回复:
晚上回家研究下。
 谢谢!这位仁兄的头象很像我中专的一个老师呀


这个我无语,观看。。。

#19


引用 18 楼 czmchen 的回复:
引用 17 楼 jxsfreedom 的回复:
引用 13 楼 bayougeng 的回复:
晚上回家研究下。
 谢谢!这位仁兄的头象很像我中专的一个老师呀

 这个我无语,观看。。。

而且。。。我觉得大家都不会闲着没事儿干

#20


引用 19 楼 zliuzz 的回复:
引用 18 楼 czmchen 的回复:
引用 17 楼 jxsfreedom 的回复:
引用 13 楼 bayougeng 的回复:
晚上回家研究下。
 谢谢!这位仁兄的头象很像我中专的一个老师呀

 这个我无语,观看。。。
 而且。。。我觉得大家都不会闲着没事儿干


这哥们的头像很有型

#21


引用 20 楼 mli926 的回复:
引用 19 楼 zliuzz 的回复:
引用 18 楼 czmchen 的回复:
引用 17 楼 jxsfreedom 的回复:
引用 13 楼 bayougeng 的回复:
晚上回家研究下。
 谢谢!这位仁兄的头象很像我中专的一个老师呀

 这个我无语,观看。。。
 而且。。。我觉得大家都不会闲着没事儿干

 这哥们的头像很有型

你的也不错