PDA

Просмотр полной версии : Что лучше: дробные или целые значения координат?


КорДум
17.03.2010, 02:03
Здравствуйте. Меня всегда интересовало, что быстрее сделать флешу: располагать объект каждый раз по дробным координатам или сначала отсекать дробную часть и располагать объект по целым? Объект представляет собой, скажем, падающую звезду.

gloomyBrain
17.03.2010, 02:42
А без разницы, если объект в векторной графике. При рендеринге векторной графики на один логический пиксель (пиксель экрана) приходится 400 "внутренних" пикселей (твипов).

iNils
17.03.2010, 03:54
По поводу быстрее не знаю, но удобнее использовать целые координаты.

При рендеринге векторной графики на один логический пиксель (пиксель экрана) приходится 400 "внутренних" пикселей (твипов).Откуда такая информация?

etc
17.03.2010, 09:06
Твип вообще-то равен 1/20 пикселя.

gloomyBrain
17.03.2010, 11:11
Откуда такая информация?
swf_file_format_spec_v10.pdf (http://www.adobe.com/devnet/swf/pdf/swf_file_format_spec_v10.pdf)

For example, a rectangle 800 twips wide by 400 twips high is rendered as 40 by 20 logical pixels
800 x 400 = 320000 твипов
40 x 20 = 800 пикселей
320000 / 800 = 400 (твипов на пиксель)

PS
Как бы вы разделили квадрат на 20 квадратных частей?

КорДум
17.03.2010, 11:46
Без разницы для векторного. А для растра?

gloomyBrain
17.03.2010, 12:28
А для растра - хм... ну тоже без разницы =)
Просто если вы делаете

var myBitmap:Bitmap;
// ...
myBitmap.pixelSnapping = PixelSnapping.ALWAYS;

то размещение в нецелых координатах просто теряет смысл. В данном случае рендеринг будет заключаться в прямом "перекидывании" пикселей на экран, без какого-либо сглаживания.
Это чревато ускорением работы FP. То же самое можно сказать и про cashAsBitmap - однажды отрендеренное в растр не будет каждый кадр обрабатываться векторным рендером, а просто будет "перекидываться" на экран. Правда, памяти займет по 4 байта на пиксель.

Ой, что-то я отвлекся... =)

В общем и целом, особой разницы нет - дробные координаты или целочисленные. Как и сказал iNils - проще использовать целые, ибо к чему Вам субпиксельная точность?

Zebestov
17.03.2010, 12:46
800 x 400 = 320000 твипов
40 x 20 = 800 пикселей
320000 / 800 = 400 (твипов на пиксель)


это что за занимательная арифметика такая 0о
т.е. на основании подсчета метров в квадратном километре (http://ru.wikipedia.org/wiki/%D0%9A%D0%B2%D0%B0%D0%B4%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%B9_%D0%BA%D0%B8%D0%BB%D0%BE%D0%BC%D0%B5%D1%82%D1%80) ты станешь утверждать, что в километре миллион метров?

все правильно etc подбил =) а ты просто подсчитал количество квадратных твипов на квадратный пиксель... все, моск паламалсо.

iflamberg
17.03.2010, 13:00
Если не использовать pixelSnapping, то обязательно используйте целые координаты, иначе будете ловить вот такие баги (http://iflamberg.net/ru/blog/2009-12-06/pixel_precision).

КорДум
17.03.2010, 13:01
Спасибо большое. Я раньше отбрасывал дробную часть - а это лишняя операция, кушающая какую-то часть процессора, если нет разницы, так?

Добавлено через 1 минуту
2 iflamberg
Это да, но с точки зрения красивости на экране

gloomyBrain
17.03.2010, 13:28
@Zebestov
т.е. на основании подсчета метров в квадратном километре ты станешь утверждать, что в километре миллион метров
Вы удивитесь, но - да! В одном квадратном километре миллион квадратных метров

Пиксель по определению квадратный. То есть у него всегда 2 измерения. Аналогия с метрами немного не подходит, представьте, что мы говорим об акрах (или гектарах (или сотках)) - то есть о самостоятельной единице площади.

Да, стану утверждать, что длина одного пикселя в 20 раз больше длины одного твипа. Да, стану утверждать, что ширина одного пикселя в 20 больше ширины одного твипа.

Да, стану утверждать, что площадь одного пикселя в 400 раз (а не в 20) больше площади одного твипа.
И, да, буду утверждать, что "1/20 пикселя" - это отношение сторон твипа и пикселя, но никак не фактический размер, про который я писал.

iNils
17.03.2010, 14:16
Пример доведения мысли до абсурда.

Zebestov
17.03.2010, 14:17
)) ну это лирика. безусловно пиксель — это, упрощенно говоря, "квадратик". но использовать его в качестве меры площади не приходилось ни мне, ни другим разработчикам никогда. за исключением обсуждения алгоритмов сглаживания растровой графики, например, или чего-то подобного.
когда ты отвечаешь человеку, что он может позиционировать спрайт с точностью до 1/400 пикселя, ты заблуждаешься сам и вводишь в заблуждение коллегу.
придется ждать когда кто-то на форуме спросит: "а кто знает сколько твипов в картинке WWW на HHH пикселей!?" — вот тут твой звездный час =)

gloomyBrain
17.03.2010, 14:58
когда ты отвечаешь человеку, что он может позиционировать спрайт с точностью до 1/400 пикселя, ты заблуждаешься сам и вводишь в заблуждение коллегу.

package {

import flash.display.Sprite;
import flash.events.Event;

/**
* ...
* @author gloomyBrain
*/

public class Main extends Sprite {

public static const stepSize:Number = 1 / 400; // == 0.0025 pixels == 1/20 twips

public var stepCount:int;
public var myShape:MyShape;

public function Main():void {
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point

this.stepCount = 0;
this.myShape = new MyShape();
this.addChild(this.myShape);

this.addEventListener(Event.ENTER_FRAME, onEnterFrame);

}

public function onEnterFrame(evt:Event):void {

this.twipCount++;
this.myShape.x += stepSize * this.stepCount;

}

}

}

:D
Да абсурд, не спорю я =) Но можно

А изначально я ответил на реплику, оспаривающую (как мне показалось) факт того, что на 1 логический пиксель приходится /* внутри помещается */ 400 твипов. Если эта реплика ничего не оспаривает, то и мысль до абсурда я доводить не хотел.

Извините, если кого задел.

feelgood66
17.03.2010, 23:47
если двигать растр применяя какието вычисления аля физические законы.. то плавности движения целыми числами не добьетесь. Я делаю так: пока что-то творится - используются дробные величины, по факту завершения процесса - выставляю по целочисленным, округнелнным координатам. (иногда бывает некоторое "дергание", но его правда замечает только сам flash разработчик, потому что знает куда смотреть ) )