Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > zuxul

Оценить эту запись

Использование возможностей <поздних> плееров.

Запись от zuxul размещена 02.11.2012 в 13:46

Когда мы начинали разрабатывать игру, мы встали перед выбором - 9 или 10 плеер будем поддерживать.
Десятый плеер только вот-вот вышел, но зная нашу неопытность, выбор пал на 10.
Когда мы заканчивали (или можно сказать прилизывали игру к первому выходу) выходил уже 11 плеер.
Но это так - присказка. А эта запись о том, как использовать "крутые" возможности плеера, там, где их еще нет.

Итак, игру у нас скомпилирована для плеере 10.0. В плеере 10.1 появляется фишка - глобальный перехват не перехваченных исключений. Вставляем ее так:
Код AS3:
try {
	// попробуем перехватывать все ошибки методом 'uncaughtErrorEvents', доступно только в плеере >= 10.1
	var UncaughtErrorEvent:Class = getDefinitionByName("flash.events.UncaughtErrorEvent") as Class;
	loaderInfo['uncaughtErrorEvents'].addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);
} catch (e:Error) {
	// плейер версии < 10.1
}
 
private function uncaughtErrorHandler(event:/*UncaughtErrorEvent*/* ):void {
	// ... логирование ошибки и возможно, перегрузка игры
}
В 11 плеере появляется нативный JSON. Он в 3-4 раза быстрее реализации JSON от Adobe, который на as3 и в примерно в 2 раза быстрее, чем реализация JSON от BlooDHounD
Основная масса игроков, всегда обновляет плеер, но игроков, которые не обновили плеер тоже не хочется терять. Делаем обёртку, которая в рантайме определяет, какой JSON использовать:
Код AS3:
package game.utils {
	import by.blooddy.crypto.serialization.JSON;
	import com.adobe.serialization.json.JSON;
	import flash.utils.getDefinitionByName;
	/**
	 * Этот класс должен выбрать в realtime самый лучший JSON
	 */
	public class JSON {
 
		private static var encodeFunction:Function;
		private static var decodeFunction:Function;
 
		// статик инициализация
		{
			init();
		}
 
		private static function init():void {
			try {
				// если плеер 11 версии (а он почти у всех 11), возьмем этот класс через getDefinition
				// т.к. игра скомпилирована для 10 версии
				var JSON_class:Class = getDefinitionByName("JSON") as Class;
				encodeFunction = JSON_class["stringify"];
				decodeFunction = JSON_class["parse"];
			} catch (error:*) {
				// быстый json от blooddy, быстрее adobe-вского раз в 3-4
				decodeFunction = by.blooddy.crypto.serialization.JSON.decode;
				// json от blooddy так <"оптимизирован">, что не кодирует null-ы в конце массивов и ломает нам игру
				// из-за этого используем json от adobe
				encodeFunction = com.adobe.serialization.json.JSON.encode;
			}
 
		}
 
		public static function encode(obj:*):String {
			return encodeFunction(obj);
		}
 
		public static function decode(jsonString:String):Object {
			return decodeFunction(jsonString);
		}
 
	}
 
}
Всего комментариев 8

Комментарии

Старый 02.11.2012 16:48 Котяра вне форума
Котяра
 
Аватар для Котяра
зачем такие сложности с трайкатчем?
Код AS3:
if (loaderInfo.hasOwnProperty("uncaughtErrorEvents"))
не подходит?
Старый 02.11.2012 16:52 iNils вне форума
iNils
 
Аватар для iNils
Или Capabilities.version?
Старый 02.11.2012 18:05 red_penguin вне форума
red_penguin
 
Аватар для red_penguin
Расскажите про игру, долго ведь делали, видимо большой проект.
Старый 02.11.2012 22:54 Hauts вне форума
Hauts
 
Аватар для Hauts
Действительно, а почему сразу версию фп не посмотреть-то? Я этого не понимаю совсем.
Старый 03.11.2012 00:28 in4core вне форума
in4core
 
Аватар для in4core
А так часто бывает на самом деле, что вместо очевидного Capabilities.version, изобретаем велосипед и считаем его полезной инфой. На самом деле я не хочу сказать, что автор выпей йаду, на самом деле у нас у всех бывают такие ляпсусы, что заработавшись или просто думая не о том, не видим очевидных вещей, - это есть человеческий фактор.
Кстати, я думаю вы не один игру разрабатывали, кто вам такое посоветовал или все думают в таком направлении?!

Хотя
Цитата:
private static function init()
Верю...
Старый 03.11.2012 02:49 Котяра вне форума
Котяра
 
Аватар для Котяра
Цитата:
Верю...
здесь, кстати всё хорошо.
просто при первом же обращении к классу будет вызван этот метод.
Но я бы поставил проверку на ужеИнициализирован
Старый 03.11.2012 22:41 zuxul вне форума
zuxul
cinit ведь вызывается только один раз? Или думаете он может вызваться еще когда-нибудь?
Старый 04.11.2012 19:56 Котяра вне форума
Котяра
 
Аватар для Котяра
сейчас работает так, но может быть потом будет по-другому.
это недокументировано и поэтому опасно
 
Последние записи от zuxul

 


Часовой пояс GMT +4, время: 00:23.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.