Попробуйте __weak
, если вы получите какое-либо предупреждение относительно цикла сохранения, иначе используйте __block
Person *strongPerson = [Person new];
__weak Person *weakPerson = person;
Теперь вы можете ссылаться на объект weakPerson
внутри блока.
Возможно, это немного устарело, но я только что нашел это:
Не уверен, какую версию Android вы используете, но это может быть ошибка в библиотеках Android!
Похоже, вот в чем проблема! :)
... Dontcha просто обожает, когда это не твоя вина! : D
Я бы предложил использовать SurfaceView для анимации. Он имеет двойную буферизацию, поэтому при правильном использовании он должен устранить мерцание. Если вам нужен пример, демо LunarLander, включенное в sdk, действительно хорошо это показывает. Кроме того, если у вас есть более конкретный вопрос с кодом, задавайте его.
Что касается общей производительности Android, вполне возможно, что у вас будет достаточно высокая частота кадров, поэтому вы не ожидаете слишком многого.
Фактически не видя проблемы, звучит так, будто вы не очищаете буфер дисплея перед записью следующего кадра. Для меня это не похоже на проблему с производительностью.
Вы контролируете, выполняет ли устройство двойную буферизацию или нет?
Учитывая, что оно работает на эмуляторе, это может указывать либо на проблему с эмулятором, либо на ошибка в вашем коде, которая не проявляется в эмуляторе (что, я полагаю, технически проблема эмулятора!), а не проблема производительности.
Это происходит и со мной. Я использую эмулятор, использующий 1.6 с API Google, и я только что подтвердил, что это происходит на Nexus One под управлением FRF83. Вот соответствующий код:
Animation a = new TranslateAnimation(0.0f, 0.0f, 100.0f, 0.0f);
a.setDuration(2000);
this.myView.startAnimation(a);
Вот соответствующий код для инстанцирования представления:
View v = new View(this.getApplication());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 80);
v.setLayoutParams(params);
v.setBackgroundColor(0xFFFF0000);
//
LinearLayout layout = (LinearLayout)this.findViewById(R.id.theLayout);
layout.addView(v);
//
v.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
// TODO Auto-generated method stub
doAnimation();
}
});
//
myView = v;
Так что, в основном, двойная буферизация и т.д. обрабатывается ОС, и я не имею никакого контроля над этим.