游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5946|回复: 19

请问一个DirectXMusic的问题

[复制链接]

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
发表于 2005-2-14 16:26:00 | 显示全部楼层 |阅读模式
我把
Loader
Performance
Segment
封装到一个类MyMusic中,
MyMusic *music;
之后要载入音效是就:
music =new MyMusic();
起初没什么问题,但执行此语句多了,速度愈来愈慢,甚至死机,我应该怎样做?
[em7] [em24]

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
发表于 2005-2-14 17:09:00 | 显示全部楼层

Re:请问一个DirectXMusic的问题

每载入一个音效文件就会占用相应大小的内存空间,这样载入的音效文件过多就会吃掉大量的内存,所以机器会越来越慢!解决方法是:把暂时不用的音效释放掉,需要用的时候再次载入,也就是动态管理音效资源。

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-2-14 17:14:00 | 显示全部楼层

Re:请问一个DirectXMusic的问题

“把暂时不用的音效释放掉,需要用的时候再次载入,也就是动态管理音效资源。”
原理我明,但具体怎样做呢?

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
发表于 2005-2-14 17:38:00 | 显示全部楼层

Re:请问一个DirectXMusic的问题

在MyMusic类的析构函数中释放Performance、Loader等对象,
例如:pLoader->Release(), pLoader=NULL;
然后再在主程序中删除music对象,delete music;

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-2-14 18:47:00 | 显示全部楼层

Re:请问一个DirectXMusic的问题

不是指这个,我想知道怎样知道哪些需要释放,管理方法。

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
发表于 2005-2-14 19:03:00 | 显示全部楼层

Re:请问一个DirectXMusic的问题

哦!说的是这个啊?不好意思,我理解错了!
举个例子来说:在游戏中,特定的场景一般有特定音效,比如说森林场景中会有鸟叫声,树叶的沙沙声等;海边的场景会有海浪声,海鸥的叫声等。这样,在装入森林场景时将鸟叫声,树叶的沙沙声等音效装入内存,而将海浪声,海鸥的叫声等音效释放掉,因为在森林中是不会出现这样的声音的。另外像战斗时魔法的音效,用鼠标点击菜单界面中的按钮时的音效等常用的音效就需要常驻内存,因为使用率比较高,频繁的释放、装入会影响程序性能,还会造成内存碎片。
在哪些场景使用哪些音效,哪些音效常用,哪些不常用,这些都需要人工来判定和选择,是比较繁琐的一项工作。

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-2-14 19:15:00 | 显示全部楼层

Re:请问一个DirectXMusic的问题

DX的demo好像很容易的呀,你会做吗?

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
发表于 2005-2-14 19:26:00 | 显示全部楼层

Re:请问一个DirectXMusic的问题

我想demo中给出的应该是简单的情况,也就是说声音文件比较小、比较少的情况。
你的程序中每一个MyMusic类对象对应一个声音文件,如果用到的音效比较少,比如说10个,可以一次全部读入内存:
MyMusic *music01;
MyMusic *music02;
......
MyMusic *music10;

music01 =new MyMusic();
music02 =new MyMusic();
......
music10 =new MyMusic();

可是一个真正的商业级游戏可能需要几百个声音文件(包括背景音乐和音效),大小可能有几百兆,因此就不能再一次全部读入内存,需要进行人工管理了!

132

主题

1341

帖子

1341

积分

金牌会员

Rank: 6Rank: 6

积分
1341
 楼主| 发表于 2005-2-14 19:57:00 | 显示全部楼层

Re:请问一个DirectXMusic的问题

怎么管理,引擎很多时候要求动态。

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
发表于 2005-2-14 20:32:00 | 显示全部楼层

Re:请问一个DirectXMusic的问题

管理的方法很多,可以专门建立一个管理类,也可以使用脚本。
先说一下脚本吧,举个例子,脚本文件内容如下:
[AllTime]
LoadMusic("Music001.mp3");
LoadMusic("Music002.mp3");
LoadMusic("Music008.mp3");
......
[Scence001]
LoadMusic("Music011.mp3");
LoadMusic("Music012.mp3");
LoadMusic("Music015.mp3");
......
[Scence002]
LoadMusic("Music001.mp3");
LoadMusic("Music022.mp3");
LoadMusic("Music030.mp3");
......
[......]//依次类推

[AllTime]下的为常住内存的音效,其他的为各场景对应的音效文件。在装入场景时先将所有非常驻的音效全部释放掉,然后根据[Scence???],将对应的音效文件依次装入内存。这样修改起来很方便,所要做的就是编写一个简单的脚本解释程序而已。

管理类的方法原理和脚本差不多,只是将脚本中的内容以程序的形式写出来,封装在一个类里。例如可以定义一个装入场景音效的函数,LoadScenceMusic(WORD Code)。如过装入第一个场景就是LoadScenceMusic(1),其他以此类推。LoadScenceMusic()函数内容如下:

//释放所有非常驻音效

switch(Code)
{
    case 1:
      //装入相应音效文件
      break;
    case 2:
      ......
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-24 09:47

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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