Friday, October 3, 2014

Building a Data-Oriented Entity System (Part 3: The Transform Component)

In the last post, I talked generally about the design of components. Today I will focus on a specific real-world component, the TransformComponent.

The Transform Component

The purpose of the TransformComponent is to allow entities to be positioned in the world.

It handles positioning of entities in the world and child-parent linking. For example, you may want to link a “wheel” entity to a “car” entity, so that the wheel follows the car around when it moves.

In that sense, the TransformComponent is what forms the scene graph of an engine world.

Design Decisions

Should every entity have a transform component?

In some engines, every entity has to have a transform component, even if it is just a purely “logical” entity that doesn’t really have a position in the world.

To me it seems strange to force an entity to have a position when that has no real meaning. I also want entities to be as cheap as possible. So it seems better to have the transform component optional, just as any other component. An entity that doesn’t have a transform component doesn’t have any position in the world.

Actually, talking about the world is a bit of misnomer. The Bitsquid engine does not have a single World where everything has to live. Instead you can create multiple worlds, each populated with its own objects. So you might have one world for your “main game”, one world for the “inventory screen”, one world for the “loading screen”, etc.

This is a lot better than having an “inventory room” at some secret hidden place in the main game world.

Each world has its own TransformComponent manager, and an entity can create transform components in several of these managers, if it so desires. So the same entity can exist and be positioned at different places in different game worlds. Since a MeshComponent manager also exists in each world, the entity can have different graphical representations in each world.

This is a bit esoteric, and I don’t expect many entities to make use of this, but there are situations when it could be interesting. For example, a player’s pickaxe could exist both in the “game world” and in the “inventory world” and still be managed as the same entity.

Entity scene graphs and model scene graphs

In the entity system there are really two kinds of “scene graphs” that we need to deal with.

The first is the one we have already talked about, the graph formed by entities and their linked child entities.

The second is the graph of nodes within an entity. For example, a character entity may have a model with hundreds of bones that can be individually animated.

What should the relationship be between these two graphs?

In previous engine code, I have always treated these two graphs as parts of the same system. The model scene graphs were linked to nodes in the entity scene graphs and computed their transforms in world space. This creates an update order dependency. We can’t compute the world positions in the model scene graph until we have computed the world position in the entity scene graph. This limits what kinds of things we can do in parallel.

For the entity system I’ve decided to decouple these two concepts. The model scene graph won’t compute world space poses, instead it will compute poses relative to the entity pose. This means that we can evaluate the animations and compute the model pose without knowing anything about the entity pose. (Ignoring world space constraints, of course, but they will be handled in a later pass.)

Of course it also requires us to multiply the model node transforms with the entity transform to get the actual world position of the model nodes.

I have not completed the design of the model scene graph component yet, but maybe I’ll get a chance to return to this in a future post.

Immediate or deferred updates

In previous engines I have always used deferred updates of the world transforms. I.e., changing the local transform of a node would not immediately update its world transform (or the world transforms of its children). Instead it would simply set a “dirty” flag in the entity. Later, I would compute the world transforms of all the dirty nodes (and their children) as a single step.

This has the advantage that we never have to compute the world transform of a node more than once.

Consider the worst case scenario, a long chain of nodes:

[ node_1 ] ---> [ node_2 ] ---> [ node_3 ] ---> ... ---> [ node_n ]

With a deferred update, changing the local pose of every node will still just require O(n) computations to compute all the world transforms. With an immediate update, where we compute the world transforms of all children as soon as the parent transform changes, we will need O(n^2) computations.

On the other hand, there is a drawback to using deferred updates. Whenever we ask for an object’s world position we won’t get its actual world position, but its world position from the last frame (unless we ask after the world transform update). This can lead to a lot of confusion and subtle bugs. Solving them often requires ugly hacks, such as forcing graph updates at different times.

So what should we choose?

I think that with the decision to decouple the model scene graphs from the entity scene graphs the performance problems of immediate updates are a lot less serious. Long chains of nodes that are all moving can certainly exist in the model scene graph. (Consider an animation of a character swinging a whip.) But I would guess that long chains of objects that are all moving at once are a lot less common in the entity scene graph.

Note that the performance problems do not appear if it is just the root entity that is moving. In that case, both the immediate and the deferred update will be O(n). It is only when the parent and the children are moving that the immediate update does worse.

I don’t expect there to be very long chains of entities (n <= 5 ???) and I don’t expect all of the objects in those chains to be moving simultaneously. So I have decided to go with immediate updates so that we always have accurate world transforms.

Note: If we run into performance problems as a result of this, we can always create an API function that allows us to set multiple local transforms at once while doing a single world transform update, thus getting back the O(n) performance.

A side note on deferred updates

Note that if you want to do deferred updates, you want to keep the entity array sorted so that parents always appear before children. That way you can just walk the array from beginning to end and compute the transforms and be sure that the world transform of a parent has been computed before you compute the world transform of its children.

Also, you don’t want to loop over the entire array to look for dirty objects:

for (int i=0; i<n; ++i) {
if (dirty[i])
transform(i);
}

Typically, in a scene, only a small percentage of the objects are moving at any one time (maybe as little as 1 %). So looping over all objects, even just to check a flag, can waste a lot of time.

A better solution is to sort all the dirty objects to the end of the array, so we can loop over just them:

for (int i=first_dirty; i<n; ++i)
transform(i);

Since we only need a partial sorting of the array, we don’t have to run an expensive O(n log n) sorting algorithm. (It would kind of defeat the purpose to run an O(n log n) sort to avoid an O(n) update.) Instead, we can achieve this by judicious swapping.

When a node becomes dirty we move it to the start of the dirty list by swapping it with the element before the dirty list and decreasing first_dirty:

This guarantees that parents are always processed before their children.

We also need a way to move items off the dirty list, or it will continue to grow indefinitely. We could clear the list every frame, but that might lead to a lot of swapping as items are moved in and out of the list. A better approach might be to check if an item hasn’t moved in five frames or so, and in that case we move it off the dirty list. This avoids swapping those items which are always moving.

When using the immediate update strategy, sorting the list is not as important, but we can employ similar swapping strategies to make sure that a parent node and its children are kept close together in the array, so that the immediate update is cache friendly.

Implementation

With the design thought through, there is really not that much to the implementation.

Just as in the last post, we store the transform component data for all instances in a single big memory block:

The parent, first_child, next_sibling and prev_sibling arrays all store instance indexes. We can find all the children of a particular entity by following the first_child link and then the next_sibling links of that link.

Note: I’ve written this as a recursive function for easier reading, but you might want to rewrite it as an iterative function for better performance.

Note that when you swap two instances in the array (to do swap-erase or to sort the array as described above), in addition to swapping the entries in the array you also need to take care to keep all the parent, first_child, next_sibling and prev_sibling references intact. This can get a little hairy, especially when you are changing references and trying to walk those lists of references at the same time. My suggestion when you want to swap two instances [A] and [B] is to use the element at the end of the array [size] as a temporary storage slot and instead of trying to do everything at once, use three steps:

// Move element at A (and references to it) to size.
[size] <--- [A]
// Now nothing refers to A, so we can safely move element at B (and references
// to it) to A.
[A] <--- [B]
// And finally move the element at size to B.
[B] <-- [size]

How do you synchronize position of an entity between physics and transform systems? As far as I understood, in order to get position of an entity we need to do a lookup in hashmap and then in array. It may be not that fast if do this every frame for every entity.I mean, if a system (transform or rendering) needs an entity position in order to, for instance, draw it, the system should do the following, right?

for every entity: lookup transformation in transform system; use transformation;

1) When you change the transform component you also need to update the associated physics body. Otherwise the raycasts or volume queries will not work as expected. This is usually implemented through some query system that channels all query requests. If a transform is changed the underlying body is added (e.g. through some callback system) to a dirty list. Then when you trigger a raycast the broadphase is updated so everything is at the right location.

2) For updating entities after a physics tick you usually maintain a list of active entities (e.g. not sleeping). You register a callback with the physics system when a body wakes up and add it to the list. Then in the post tick function you synchronize the transform of the active bodies and remove those that are now sleeping. The number of active bodies is usually small and you want to control that number based on performance of the client machine.

As Dirk says... usually the number of things that change is a lot smaller than the total number of things. I.e. there may be 100 000 objects in a level but only 1000 that are currently moving. So key to getting good performance is to only transmit the things that change.

This means that the renderer (in your example) should not query the position of all objects every frame. Instead the renderer should cache the positions internally. Then every frame it should ask "give me a list of the things that have moved since last frame and their new positions". Depending on how the transform component is implemented, this can be a super fast operation (i.e. it could keep this list already prepared and ready to send all the time, by updating it as objects move).

Let's follow the rendering<->transform example: that's clear that a Transform and/or Physics system can give a list of "transformed" entities but the Renderer system has to do a lookup in its own entity->component map, right? Because the transformed entity does not even have a renderer component and the ids can be different.

Following up on your last comment Nikias, how would you approach this querying system? I've thought about storing the transform ID with the component ID and querying that transform ID when I want to update a component's transform data. It seems like the easiest and most obvious approach, but I wanted your input.

Also you in an earlier post about this topic, you said that it was more cache friendly to allocate one big buffer and divide everything up, especially when you access all of that data together (I suppose). But something else I was reading said that it was better to store everything in their own array's so that when data is loaded into the cache line from one array, the next few index will be loaded in as well (depending on the size of the stored data that is). Which is better in this context? I assume the first because but hearing this approach makes me think otherwise.

It's really frustrating in UE and Unity when you are forced to have useless transform information on your entities which don't need physical location in the game world. It just seems like a way to make bugs for no reason. (Also agree that it's odd to keep everything in the same world space. You can avoid some of the problems with this in UE and Unity by using visibility and collisions channels/layers but it feels a bit strange.)

One thing I've been thinking about recently is the necessity of including scale as a base parameter for game world transform. Most engines have it. But for many types of games, it doesn't get used at all. And for some types of entities, it doesn't make sense to have it. For example, a particle system entity. Location and rotation, that usually makes sense. (Scale? What is the behavior supposed to be for particle systems? What about scale on point and direction lights? Should scale affect the mass of rigid body physics components? What does it even mean?)

Even with meshes and stuff, it's not too common to be dynamically adjusting scale. And in some rendering pipelines, it has negative performance consequences if you touch the scale parameter.

So, what happens in Bitsquid when scale is changed on particle systems and lights? And for meshes, does it affect instancing/batching behavior?

1) Actually I've simplified things a bit for this example. (Because I wanted to focus on a single concept.) For the local transform we actually don't use a matrix, but separate position, rotation and scale values. But we support non-uniform scaling (along the principal axes).

2) That part isn't completely designed yet. But one way of doing it would be to see that as a "constraint" that is applied after the model/animation update has finished. We would then process all those constraints andmove the attached objects to the desired positions.

How would you rather organize them? In my opinion an array is the best default option, unless you have strong reasons to pick something else. And cache can certainly be an issue even if the access is not strictly linear. (Such as when walking the list of parent/child objects.)

At the moment I have them in one array too, but it was somehow an automatic decision as everything in my engine is that way. I am playing with an idea to completely remove "transform component" because everyone has its own copy anyway. Rendering store its own copy, animtion system store its own copy, PhysX too. Basically everybody who needs it, caches it. There is only one system that uses transform component - the editor. Anyway, it's just an idea at the moment.

Hi Niklas,First, thank you very much for this blog. It is a very precious information source for me. I learn a lot reading it, so again thanks to share all these articles with us.I've implemented a transform component system based on your articles. I've been confronted to a crash happening randomly only in Release. It turns out that my Matrix4 structure needed a memory alignment which was not handle by the single big allocation done by the transform manager.So my solution was to allocate a bit more memory, using an offset when settings the first array pointer, and using the first arrays to store matrix._data.local_matrix = _data.buffer + offset_data.world_matrix = _data.local_matrix + _data.capacity_data....That's the first time I'm faced to alignement issue. I'm glad to have found the problem and the solution, but I was wondering how you are handling that. I guess your solution is more elegant.

In case the user set the world transform directly, how do you behave if that transform has a parent? how do you deal with the "world matrix accumulation" if then the user move the transform's parent? the target world transform is overridden? there is a flag to avoid world-overriding? you disconnect the two transform?

Firstly, I'm a big fan of this blog. Thank you for continuing to write.

A common problem I find is how to efficiently process components when they have dependencies on other components. Lets say our LocalSteeringComponent needs its own instance data, the corresponding TransformComponent data and the RigidBodyComponent data during its update.

A naive approach would be to linearly walk the LocalSteeringComponents and look up the corresponding components it needs. This suffers from the fact the look ups for the corresponding components may thrash cache if there is no ordering coherency or if there is a big multiplicity disparity.

An improvement would be request a copy of all the required component data from the corresponding component mangers. This still suffers from needing to make "jumps" but given the full required set to the component manager, it may be able to optimize the data aggregation.

Hi Niklas,how about reorder the components as depth-first and access them with a for-loop instead of jumping around using hierarchy-info? then jumps occurs only to collect parent's data and reordering needs to be recomputed only when the hierarchy changes, have you try a similar solution? what do you think about? keeping data in depth-first format can be so time consuming than jump here and there result in a better approach/performance (especially when child-parent data are close together in memory)?

Great post, Niklas! Nice to see discussions that actually thinks one step further than just keeping pointers or whatnot. I do have some concerns that I can't wrap my head around though.

1. Many people seem to imply that systems iterate entities containing the required components. These components could possibly be actual objects of the entity, or they could reside in a manager; which one is used is of no importance, the systems still iterate them. The first variant is obviously not cache friendly, while the second one is, provided the component does not depend on any other component.

Now, let's consider an audio emitter, which depends on the transform (it has a physical location). An audio system works with entities containing both an emitter as well as a transform. For each emitter, the system would need to find the transform corresponding to the owning entity. Doesn't this kill cache coherency? While the emitters are stored in a linear fashion, the corresponding transforms might be located anywhere.

The same people that discuss designs not taking cache or memory layout into consideration also seem to not consider notifications a problem, arguing that after a translation system is finished, the soon-to-execute audio system would work with updated positions (assuming one goes the route of finding dependent components). However, as soon as multi threading enters the picture, this becomes a problem, because we can no longer be guaranteed that the translation system is finished.

Considering these points, I think it would be appropritate for components to store everything they need, and have dependent data synchronize with "the one true data". How could one go about implementing this sync without coupling components too much?

2. I don't quite understand how child components are supported using this transform component. I do understand that it links to other transform components, updating them when updated itself, but this does not in any way take other components into consideration, does it? Is the idea to create two entities -- each with their own transform -- and link those transforms together, letting the two entities have their respective mesh for instance?

Take a police vehicle as an example (just to try to bind as many parts together as possible). It has a body represented by a mesh, and a translation. On the roof we have a siren, which has a mesh, an audio emitter, and a rotating light, all of which depend on a transform relative to the car. How would this hierarchy be built?

This has turned into quite a lengthy question, but I believe it deals with several key points that glues it all together.

1. You have a choice whether you should mirror the data in the component or read it from the transform. The first option gives better cache locality for component updates but requires an extra effort to synchronize the data. You have to choose in each case what you prefer.

2. In this case I would probably do car -> siren -> light, so that the light can be rotated independently. The mesh and audio would be components on the siren entity and the light would be a component on the light entity.

How would you go about threading this approach? A normal scene graph can easily have multiple strategies for dividing the work into the other cores. Such as the sing thread can run down a branch for a short while, then dispatch entire branches of the trees to the job system. Climb back up, and repeat.

With the array... I can't imagine that being easy to do effectively without wasting cycles. A parent's children can easily be scattered out in the array. Threading it's update would mean having to throw back jobs into the queue if the parent has not been updated.

Unless you did something a little more clever? Such as remove attached entities from the update list? And recursively update them?

Why do you think having the parent's children being "scattered in the array" would lead to less efficient multithreading than having them "scattered in memory" which is what you would have with a "traditional" scene graph?

On the contrary, having an array is a lot better because you could do things such as sorting the array to have all the leaves in the end and then you can have multithreaded workers updating these leaves while accessing memory linearly.

Anyways, since we use the "immediate" update strategy we don't have a single step where we update the entire scene graph, instead we have lots of small updates and multithreading those is probably not worth it.

At the start of each entity's turn to be updated, you Update it's Physics then world transforms. And sense you have to multiply the matricies twice on the entity, you run through your logic which determines, then animations.

Sorry but one final question on this topic. First, let me go ahead and say that this blog has been an incredible resource.

I have spent more time on my projects scene graph, than I probably had on integrating the physics, rendering system for both OpenGL and Directx, and culling combined. The scene graph is relatively important to the engine's scene and model processing, as when files are loaded, it loads up branches of the graph. This is so we can translate to view-space for arbitrarily large scenes. It also acts as an area filter, as the engine allows up to eight characters in a CRPG party to be in various locations across a massive world. The prospect of a small cost paid for eliminating future bugs sounded quite nice.

I tried implementing a "immediate" update on transforms... and well. I think I broke something. So while the math was right... I wounded up pegging my scene graph for an update transforms N times for each entity that interacts with it. So... what I see is an out of whack erratic movement with some sliding of out of sync animations.

In an abstract answer, what was your method of approach for an immediate update?

Thanks a lot for this series of articles, a really interesting reading. It's pretty clear to me the benefit of storing packed transform data to improve data access performance.

Ignoring the dirty list, this works quite well and straightforward if the hierarchy is static. I have some doubt on how you handle re-parenting transforms. How do you handle this? What if a node with a possibly deep hierarchy of child changes its parent? How do you move data in such scenario in order to keep the transforms ordered but still packed?

The algorithm outlined in this post still works. As you process the array, if you encounter an item that is sorted earlier than its parent, swap it with the highest of its parent's parents that is sorted after it in the list. If a deep hierarchy is reparented this might potentially lead to a lot of swaps, but that is unavoidable.

Actually I was thinking about this recently again and I was wondering if entity transforms and model bones are distinct classes if you handle both separately? E.g. you cannot make a bone a child of an entity transform?

I am really torn here. If I look at this from a performance perspective treating both graphs separately makes a lot of sense. But using just a single hierarchy makes many things so much easier and more natural to use (e.g. attachments). Now in retrospect if you compare your old approach to this new one - are you still convinced this was the right decision?

If you MS OFFICE key has expired and if you want to buy new product key then you can visit on our website after visit website just fill your previous key details then after you get the new product key. just click on this keyword - office.com/setup

How you install or reinstall Office 365 or Office 2016 depends on whether your Office product is part of an Office for home or Office for business plan. If you're not sure what you have, see what office.com setup products are included in each plan and then follow the steps for your product. The steps below also apply if you're installing a single, stand-alone Office application such as Access 2016 or Visio 2016. Need Help with office.com/ setup Enter Product Key?office.com set upoffice com setupmicrosoft office product

McAfee provides security for all sorts of users. They supply services and products for home and office at home, enterprise businesses with over 250 workers, and small organizations with under 250 employees, and also venture opportunities.

We are providing help and support for Microsoft office Setup and activation. Call us or email us the error or problem, our one of the expert contact you with the suitable perfect solution. Get the MS Office application suite and as per your need and see how it is easy to work with Microsoft Office.

Before you plan to install the Office 2016 or Office 365 on your device be it a Computer, Laptop, Mobile Phone or a Tablet, you are required to take few important steps on of them is to remove any existing Office installations from your PC. Just like the previous Office products, Office 2016 & 365 will conflict with the previously installed versions. So, it becomes necessary to remove the previous office files properly.

HP is the multinational IT company, it offer the great range of product including laptops, desktops, peripheral devices and printers.more details call our HP Printer Customer Support Number 1-888-827-9060.

Dell Printer Support gives the multiple functions where we can scan and print.Dell printer have been manufactured with perfection and the latest technology.Find an instant help to fix Dell printer printing, driver installation and other errors at our Dell Printer Technical Support Number 1-888-827-9060

Norton is technological advancement has also increased the need of having security software or antivirus that can protect your digital world from harmful online threats.Setup your norton Antivirus with help from www.norton.com/setup, norton.com/setup.

Webroot Suppport provides Mobile Security for Android cell phones and tablets, with a free essential variant and a paid premium version.To get an instant support over call, dial our Webroot Customer Support Toll-free Number 1-888-827-9060.

Before you plan to install the Office 2016 or Office 365 on your device be it a Computer, Laptop, Mobile Phone or a Tablet, you are required to take few important steps on of them is to remove any existing Office installations from your PC. Just like the previous Office products, Office 2016 & 365 will conflict with the previously installed versions. So, it becomes necessary to remove the previous office files properly.

Online Help – Step by Step guide for Norton Setup, Download & complete installation online. We are providing independent support service if in case you face problem to activate or Setup Norton product. Just fill the form and will get in touch with you as quick as possible.

Mcafee.com/activate have the complete set of features which can protect your digital online life the computing devices, and it not only help you to protect it but also it can maintain the stability of your computer, increase the speed with inbuilt PC Optimisation tool.

Redeem your office.com/setup product key within 5 minutes just visit our website http://www.office-comsetup.net/office-com-setup.html then after you will need to some your details then click on the submit button then after you get new office.com/setup product key. We will no need much time of yours its all are just 5 to 6-minute process.

Office.com/setup - Let's Get Started with your Microsoft Office Setup by visiting www.office.com/setup and Enter 25-digit Activation Code to Setup Office Today. Feel free to contact us for any help. Office.com/setup

Norton.com/setup Online Help – Step by Step guide for Norton Setup, Download & complete installation online. We are providing independent support service if in case you face problem to activate or Setup Norton product.norton.com/setup

office.com/setup Online Help – Step by Step guide for Office Setup, Download & complete installation online. We are providing independent support service if in case you face problem to activate or Setup Office product.office.com/setup

mcafee.com/activate Online Help – Step by Step guide for mcafee activate, Download & complete installation online. We are providing independent support service if in case you face problem to activate or Setup mcafee product.mcafee.com/activate

norton.com/setup login – Unable to download Norton on your PC? If Yes, then here we are going to discuss the step-by-step procedure to download and install Norton from norton.com/setup login.norton.com/setup login

Norton.com/setup Online Help – Step by Step guide for Norton Setup, Download & complete installation online. We are providing independent support service if in case you face problem to activate or Setup Norton product.norton.com/setup

Norton Utility 16 or NU16 is a utility software suite by Symantec designed to help analyze, optimize and configure a computer system. The main purpose of this software suite is to speed up your device by removing the junk and temporary files and protecting it from the threats.Norton-NU16

The prime practicality of all the McAfee.com/Activate product ar providing your device and network the utmost level of protection from every kind of threats lurking within the digital world.Mcafee setup

www.avg.com/retail website. AVG retail product key can be purchased online or from the nearby retail store or the retail website.AVG retail cleaner cleans up the system and enhances the performance and startup speed of your system. www.avg.com/retail

www.avg.com/retail website. AVG retail product key can be purchased online or from the nearby retail store or the retail website.AVG retail cleaner cleans up the system and enhances the performance and startup speed of your system. www.avg.com/retail

Antivirus is the need of computers that makes them virus free and we are going to give you full support to get the best antivirus installed in your computers and laptops. Download norton antivirus package with us

are you interested in using microsoft office 365 products here we are providing full support to make your computer working with microsoft office. you dont need to work on anything as we will help you to setup your microsoft product

Norton.com/NU16- To get started with Norton Utility 16, find here simple steps and ensure its successful download, installation and activation. If you facing any trouble or unable to boost or optimize the performance of your device, call NU16 toll-free number.

Having trouble with your previously installed McAfee activate antivirus or downloading, installing or activating a new McAfee product using a valid McAfee license keycode? For any help, call McAfee toll-free number 1-888-827-9060.

The norton nu16 are a gathering of various projects to broaden the usefulness of Microsoft working frameworks and Mac working frameworks . The maker Symantec is one of the market pioneers in this classification of projects.Norton-NU16

McAfee Retail Card Activation- Have the entire arrangement of highlights which can secure your computerized on the web and disconnected existence of the registering gadgets, and it enable you to ensure it as well as it to can keep up the steadiness of your PC, increment the speed with inbuilt PC Optimization apparatus.

Webroot Support - Call 1-844-456-8733 (US/CA) for Webroot Installation, Activation, Configuration, Billing, Renewal or any other queries. Contact our Webroot technical support to get Best Webroot Customer Service\ webroot support

Mcafee Total Protection provides an all-rounder protection to all your devices against many threats like virus, malware, spyware, trojan, Ransomware and much more. Furthermore, you do not need additional products for your PC, Laptop, Tablet, and Smartphones. Also, McAfee provides free support via calls, chat or mail services to their customer and guide them through any McAfee product issue. This is an ideal product for users to maintain a secure digital life on every device all the time.mcafee.com/mtp/retailcard

Office.com/verify – To download and install the Microsoft Office set up on your system it is necessary to have a verified Microsoft account. Microsoft Word offers you the feature of previewing the document and navigation pane. Microsoft PowerPoint helps you to prepare the professional presentation for office work or school work. The Microsoft Office is a complete tool which makes the tasks easier and also optimize the system for better performance.

Webroot Support - Call 1-844-456-8733 (US/CA) for Webroot Installation, Activation, Configuration, Billing, Renewal or any other queries. Contact our Webroot technical support to get Best Webroot Customer Service\ webroot support

norton.com/setup Online Help – Step by Step guide for Norton Setup, Download & complete installation online. We are providing independent support service if in case you face problem to activate or Setup Norton product.

In case any message saying ‘Stop’ pops up while installing Microsoft Office365 due to a compatibility issue, contact our live chat support.Our online Experts through live chat will guide you through the entire process of Office setup, covering all steps and issues. Keep your 25 characters long product key with you.

office.com/setup help in setting up and Installing Microsoft Office on your computer.We provide Technical Support and other services for you.We are here to help you. We help you with Microsoft Office and Office installation.office setup,www office com setup, office.com setup, office.com setup,office.com/setup, office com setup, office/setup CALL TOLL-FREE 1855-888-4421.

Webroot Support - Call 1-844-456-8733 (US/CA) for Webroot Installation, Activation, Configuration, Billing, Renewal or any other queries. Contact our Webroot technical support to get Best Webroot Customer Service\ webroot support

Webroot Support - Call 1-844-456-8733 (US/CA) for Webroot Installation, Activation, Configuration, Billing, Renewal or any other queries. Contact our Webroot technical support to get Best Webroot Customer Service\ webroot support

We are a third party technical support service. Avast Customer Support is here to help you out with the whole procedure to Download Avast Antivirus online, We not only fix your Avast Support related issues but will guide with how to get started with your new Avast product once it gets installed successfully.We at Avast Tech Support provides service to protect your PC from potential online threats and external attacks like viruses, Trojans, malwares, spywares and phishing scams. And Avast Refund. Call on our Avast Phone Number.

Norton Tech Support is a third party service provider and not in any way associated with Norton or any of its partner companies. At Norton Support we offer support for Norton products and sell subscription based additional warranty on computer and other peripheral devices.

How you install or reinstall Office 365 or Office 2016 depends on whether your Office product is part of an Office for home or Office for business plan.office-com setupOffice Setup, To get started with your Microsoft Office Installation you must need valid product key code & visitoffice com/setupMcAfee have the complete set of features which can protect your digital online and offline life of the computing devicesmcafee.com/activate

We are providing help and support for Microsoft office Setup and activation. Call us or email us the error or problem, our one of the expert contact you with the suitable perfect solution. Get the MS Office application suite and as per your need and see how it is easy to work with Microsoft Office.Office.com/setupwww.office.com setupInstall Office

Norton is one of the most reliable antivirus providers in the market. Norton is delivering top rated protection from mobile devices and computers. Norton has 3 antivirus packagesnorton.com/setup

Before you plan to install the Office 2016 or Office 365 on your device beit a Computer, Laptop, Mobile Phone or a Tablet, you are required to takefew important steps on of them is to remove any existing Officeinstallations from your PC. Just like the previous Office products, Office2016 & 365 will conflict with the previously installed versions. So, itbecomes necessary to remove the previous office files properly.

Install full MICROSOFT office setup 365 with our support. Now setting up your account will be a cakewalk with us.

Setup and Install Office 2017/2018 365 on your Mac/PC with genuine OFFICE PRODUCT key.Word, Excel, PowerPoint, Outlook, OneNote and OneDrive, on your PC,Publisher and Access.Everything you need for home, education and work.We are providing independent support service if in case you face problem to activate or SETUP OFFICE product.

Great post! I am actually getting ready to across this information, is very helpful my friend. Also great blog here with all of the valuable information you have. Keep up the good work you are doing here.It was a great informative post.Go so many useful and informative links.Loved your writings also. Concept of the topic was well discussed. Love to come here again.Thanks!Regards - www.office.com/setup

Install full MICROSOFT office setup 365 with our support. Now setting up your account will be a cakewalk with us.

Setup and Install Office 2017/2018 365 on your Mac/PC with genuine OFFICE PRODUCT key.Word, Excel, PowerPoint, Outlook, OneNote and OneDrive, on your PC,Publisher and Access.Everything you need for home, education and work.We are providing independent support service if in case you face problem to activate or SETUP OFFICE product.

I would like to thank you for the efforts you have made in writing this article god bless You. You have a bright future ahead. We are providing help and support for Microsoft office Setup and activation.office.com/setup

office.com/setup help in setting up and Installing Microsoft Office on your computer.We provide Technical Support and other services for you.We are here to help you. We help you with Microsoft Office and Office installation.office setup/Office Setup Install

office.com/setup Online Help – Step by Step guide for Office Setup, Download & complete installation online. We are providing independent support service if in case you face problem to activate or Setup Office product.office com setup

install office set up. it's very useful for business,school,home.Office com Setup To get started with your Microsoft Office Installation you must need valid product key code and we can also help you with your entire process to setup office product online.Install Office Setup

Microsoft Office is an office suite that includes a variety of applications, servers and services. These includes well-known programs such as Word, Excel, PowerPoint, Access, Outlook, OneNote, as well as applications such as Publisher, Project, Skype for Business, Visio, and SharePoint Designems office setup

Norton setup product key installation is a computer program that provides malware prevention and removal during a subscription period and uses signatures and heuristics to identify viruses. Norton setup product key installation Other features included in the product are a personal firewall, email spam filtering, and phishing protection.

Microsoft Product Activation is a DRM technology used by Microsoft Corporation in several of its computer software programs, most notably its Windows operating system and its Office productivity suite.mcafee activation code it's large use in business purpose.

mcafee product activation is a antivirus programme. this programme secure your computer with virus so you can install it.mcafee.com/activate Visit mcafee.com/activate to installmcafee with activation code.

Bitdefender offers a suite of Antivirus products that includes Antivirus Plus, Internet Security, and Total Security.central.bitdefender.com Using the Bitdefender tools, users are protected from most online threats including spyware, malware, viruses and other malicious software.

office.com/setup is the brand name Microsoft uses for a group of subscriptions that provide productivity software and related services.office.com/setup if you are getting any error in intallemnt of office.com/setup please visit our website.

install setup.office.com its useful your busniess,home,school.its popular suite consisting applications, servers and services.setup.office.com The basic version of Office included only Word, Excel and PowerPoint.please visit our website.

Antivirus software such as mcafee activation code SecureAnywhere Antivirus frustrates malware in a couple of ways. It scans data and blocks viruses that it detects. And it removes malware that is already lodged in a computer.mcafee activate You can tell it to scan your PC according to a schedule that you select.

Microsoft Office includes a wide range of desktop applications such as Word, Excel, Access, PowerPoint, Groove, OneNote, Publisher and Outlook which helps you to complete the various task easily such as writing a letter, sending an email and creating PowerPoint presentation.

If user wants to use the Microsoft Office online then open the web browser you are using on your system and visit office.com/setup. Login to your Microsoft account with your registered email id and password. The data which you have stored on OneDrive or DropBox, you can access and modify it.

Norton has vast range of software such as Norton security premium, Norton Security Basic, Norton Security Standard, Norton Internet Security, Norton 360, and Norton Antivirus etc, which provides the protection from threats and identity theft and monitors the antimalware. The security or protection provided by the Norton is better than any other security tool, because of it's unique structure and easy to use interface it is very popular among the users.

I’m no longer certain where you are getting your information, however great topic.I must spend a while studying more or figuring outmore. Thank you for magnificent info I was searching for this info for my mission..Visit Us@ www.office.com/setupoffice.com/setup

Use of MS Office is also simple and the user can learn the use of it easily. Online help option is also available in all application of the MS Office which provides an instant guideline.office.com/setupwww.office.com/setup

Use of MS Office is also simple and the user can learn the use of it easily. Online help option is also available in all application of the MS Office which provides an instant guideline.office.com/setupwww.office.com/setup

Microsoft is a multinational company which has been providing ease to everyone. No matter what field and industry it is, the company has helped each and everyone in their work. Be it an excel, worksheet, powerpoint or any other essential tools, Microsoft has provided such nice tools that one can download and can install in their computer.

Knowing the basics about networking hardware is the first step in planning for the appropriate small office network setup. ... Think of a small office network setup as having a foundation of switches and routers. Knowing the difference ... Unmanaged switches require minimal technical aptitude to install and operateTo know more about, please visit our website.Install Office Setup

Microsoft Office is an office suite that includes a variety of applications, servers and services.These includes well-known programs such as Word, Excel, PowerPoint, Access, Outlook, OneNote, as well as applications such as Publisher, Project, Skype for Business, Visio, and SharePoint Designe.

Antivirus software such as mcafee activation code SecureAnywhere Antivirus frustrates malware in a couple of ways.Microsoft Product Activation is a DRM technology used by Microsoft Corporation in several of its computer software programs, most notably its Windows operating system and its Office productivity suite