这个问题可能太模糊,无法通过 StackOverflow 的 标准,但我必须尝试发布它,因为我的选项用完了...:/
长话短说:我有一个应用程序会遇到随机的缓慢时期。它不会经常发生(可能每月一次),但是当它仅完全重启它运行的 iDevice 时会有所帮助。症状是:2-3 秒的响应时间和缓慢、断断续续的动画;整个应用程序基本上变得无法使用。
我已经通过所有可能的诊断工具运行该应用程序,没有发现任何错误;没有内存泄漏或异常高的 CPU 使用率。但是,这并不奇怪,因为该应用程序非常简单,是纸牌游戏的跟踪器应用程序。
所有这些让我相信当用户点击按钮时我用来播放声音的AVAudioPlayer可能是问题的原因(它是唯一的,整个应用程序中相对较高的复杂性元素)。但是,我不确定这是我需要帮助的地方。我在这里包含了一个示例代码,也许有 iOS 音频播放经验的人可以看看它,看看是否有我忽略的错误。
开始吧:
首先,我初始化了一个“无声播放器”,它每秒播放一段无声轨道,以保持 AVAudioPlayer 处于事件状态。这是必要的,因为 AVAudioPlayer 在长时间不活动后被调用时会经历相对较长的响应时间。
NSString *silenceFilePath = [[NSBundle mainBundle] pathForResource: @"silence" ofType: @"wav"];
NSURL *silenceFileURL = [[NSURL alloc] initFileURLWithPath: silenceFilePath];
silencePlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: silenceFileURL error: nil];
[silencePlayer setDelegate: self];
[silencePlayer prepareToPlay];
silenceTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f
target:self
selector:@selector(repeatSilence)
userInfo:nil
repeats:YES];
NSTimer 调用以下方法:
- (void) repeatSilence
{
if (isAudioON == YES)
{
if (silencePlayer.playing)
{
[silencePlayer stop];
silencePlayer.currentTime = 0;
[silencePlayer play];
}
else
{
[silencePlayer play];
}
}
}
剩下的就很简单了。我启动另一个 AVAudioPlayer 来播放特定的按钮声音(其中有两个):
NSString *buttonSoundFilePath = [[NSBundle mainBundle] pathForResource: @"button_pushed" ofType: @"wav"];
NSURL *buttonFileURL = [[NSURL alloc] initFileURLWithPath: buttonSoundFilePath];
buttonPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: buttonFileURL error: nil];
[buttonPlayer setDelegate: self];
[buttonPlayer prepareToPlay];
当按下按钮时,我会播放声音(就像我对静音播放器所做的一样):
if (isAudioON == YES)
{
if (buttonPlayer.playing)
{
[buttonPlayer stop];
buttonPlayer.currentTime = 0;
[buttonPlayer play];
}
else
{
[buttonPlayer play];
}
}
而且真的是它的全部。然而,我担心的是,尽管这种方法很简单,但这种连续的音频播放会以某种方式造成 iOS 发疯的罕见情况。但这一切都只是一种理论,这就是为什么我需要有更多经验的人来查看我的代码并分享他的意见。
谢谢!
更新: 我发现了另外几行可能也与该问题相关的代码。有了它们,我将 AVAudioPlayer 设置为在后台播放音乐的同时工作(例如来自另一个应用程序):
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
[[AVAudioSession sharedInstance] setActive:YES error:nil];
[[AVAudioSession sharedInstance] setDelegate:self];
最佳答案
从我从你的问题中收集到的信息来看,似乎你想要播放的唯一声音是相对简单和短的音效。如果事实确实如此,我不会使用 AVAudioPlayer,因为它是一个资源密集型库,用于像以固定音量播放音效这样简单的事情。我会直接使用音频服务。这是我从其他地方提取的音效类示例(不记得在哪里了)。
音效.h
#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioToolbox.h>
@interface SoundEffect : NSObject
{
SystemSoundID soundID;
}
- (id)initWithSoundNamed:(NSString *)filename;
- (void)play;
@end
音效.m
#import "SoundEffect.h"
@implementation SoundEffect
- (id)initWithSoundNamed:(NSString *)filename
{
if ((self = [super init]))
{
NSURL *fileURL = [[NSBundle mainBundle] URLForResource:filename withExtension:nil];
if (fileURL != nil)
{
SystemSoundID theSoundID;
OSStatus error = AudioServicesCreateSystemSoundID((__bridge CFURLRef)fileURL, &theSoundID);
if (error == kAudioServicesNoError)
soundID = theSoundID;
}
}
return self;
}
- (void)dealloc
{
AudioServicesDisposeSystemSoundID(soundID);
}
- (void)play
{
AudioServicesPlaySystemSound(soundID);
}
@end
一旦你有了这个类,你可以使用下面的代码轻松地播放任何音效:
SoundEffect *mySoundEffect = [[SoundEffect alloc] initWithSoundNamed:@"mySound.wav"];
[shareSoundEffect play];
为了优化,我会将您所有的音效加载到某处并静态存储它们,以便预先加载实际的声音文件,然后在需要时调用“播放”即可。与使用 AVAudioPlayer 相比,这样做是一种资源占用少得多的音效播放方式。谁知道呢,也许它会解决您的问题。
预加载声音文件:
我的意思比听起来简单。我的意思是您将在程序首次加载时初始化每个 Sound Effect 对象后创建对每个 Sound Effect 对象的静态引用。有几种方法可以做到这一点。我通常使用 +load 方法。它看起来像这样:
在SoundEffect类的实现中添加一个静态变量
static SoundEffect *mySoundEffect;
接下来,在 Sound Effect 类的 +load 方法中初始化该变量。
+(void)load
{
mySoundEffect = [[SoundEffect alloc] initWithSoundNamed:@"mySound.wav"];
}
现在只需为音效类创建一个静态方法,如下所示:
+(void)playMySound
{
[mySoundEffect play];
}
之后,您可以随时通过调用来播放该声音:
[SoundEffect playMySound];
关于音量控制的注意事项:
我在我的几个 IOS 应用程序中使用此代码,我可以确认以下内容:
关于iphone - AVAudioPlayer 和随机慢度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16256873/
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
我想在ruby中生成一个64位整数。我知道在Java中你有很多渴望,但我不确定你会如何在Ruby中做到这一点。另外,64位数字中有多少个字符?这是我正在谈论的示例......123456789999。@num=Random.rand(9000)+Random.rand(9000)+Random.rand(9000)但我认为这是非常低效的,必须有一种更简单、更简洁的方法来做到这一点。谢谢! 最佳答案 rand可以将范围作为参数:pa=rand(2**32..2**64-1)#=>11093913376345012184putsa.
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:HowdoIgeneratealistofnuniquerandomnumbersinRuby?我想做的事:Random.rand(0..10).timesdoputsRandom.rand(0..10)end但如果随机数已经显示过,则无法再次显示。如何最轻松地做到这一点?
我试图在每次运行时以随机顺序将一个名称数组拆分为多个数组。我知道如何拆分它们:name_array=["bob","john","rob","nate","nelly","michael"]array=name_array.each_slice(2).to_a=>[["bob","john"],["rob","nate"],["nelly","michael"]]但是,如果我希望它每次都以随机顺序吐出它们怎么办? 最佳答案 在做同样的事情之前,打乱数组。(Array#shuffle)name_array.shuffle.each_s
有没有办法在ruby中生成介于1-100但不包括20、30和40之间的随机数?我可以做类似的事情defrandom_numberrandom_number=rand(100)whilerandom_number==20||30||40random_number=rand(100)endreturnrandom_numberend...但这似乎不是很有效(再加上那个特定的例子可能根本行不通)。有没有更简单的方法?任何帮助深表感谢! 最佳答案 创建一个1到100的数组。从该数组中删除不需要的元素。然后从数组中选择一个随机数。([*1
我想生成一个包含数字、字母和特殊字符的给定(长度可能不同)长度的完全随机的“唯一”(我将确保使用我的模型)标识符例如:161551960578281|2.AQAIPhEcKsDLOVJZ.3600.1310065200.0-514191032|有人可以建议在RubyonRails中最有效的方法吗?编辑:重要:如果可能,请评论您提出的解决方案的效率,因为每次用户进入网站时都会使用它!谢谢 最佳答案 将其用于访问token与UUID不同。您不仅需要伪随机性,而且还需要加密安全PRNG.如果您真的不关心您使用的是什么字符(它们不会增加任何
所以基本上是为了好玩,我试图生成一列数字(7位数字只有0和1)我的代码很短:a=rand(0000000-1111111)b=220a1=rand(0000000-1111111)a2=rand(0000000-1111111)a3=rand(0000000-1111111)a4=rand(0000000-1111111)a5=rand(0000000-1111111)whileb!=0putsaputsa2putsa3putsa4putsa5end我的问题是,不是生成随机的0和1列,而是所有,而是使用了数字。 最佳答案 这是惯用的
我正在尝试为我的gem编写规范,它生成otp并将其保存在数据库中。现在我正在为它编写规范。所以基本上我有三种方法generate_otp!、regenerate_otp!、verify_otp(otp)。generate_otp!的作用是调用包含三个变量的方法generate_otpotp_code-基本上是使用secure_random生成的随机值otp_verified-一个bool值,用于设置otp是否已验证的状态otp_expiry_time-设置otp的到期时间,可以由Rails应用在配置中设置。这三个也是我的数据库的列。在generate_otp之后,我正在调用active
尝试使用SecureRandom类Rails生成随机数字。我们能否使用SecureRandom.hex创建一个仅包含数字而不含字母的随机数。例如:代替SecureRandom.hex(4)=>"95bf7267"应该给SecureRandom.hex(4)=>"95237267" 最佳答案 查看SecureRandom的API:http://rails.rubyonrails.org/classes/ActiveSupport/SecureRandom.html我相信您正在寻找一种不同的方法:#random_number。Secur
这是设计使然吗?代码如下:classFileRenamerdefRenameFiles(folder_path)files=Dir.glob(folder_path+"/*")endendputs"Renamingfiles..."renamer=FileRenamer.new()files=renamer.RenameFiles("/home/papuccino1/Desktop/Test")putsfilesputs"Renamingcomplete."获取文件的顺序似乎是随机的,而不是它们在Nautilus中显示的那样。这是设计使然吗?我只是好奇。 最