Improving Rendering Efficiency
[
338 
]
)
;
}
}
3. 
In the main entry, we first create the occluder node:
o
s
g
:
:
O
c
c
l
u
d
e
r
N
o
d
e
;
4. 
The occlusion representa瑩on class is 
which is actually made up of a convex clipping polygon (defined by the 
g
e
t
O
c
c
l
u
d
e
r
(
)
method) with several holes (defined by the  
a
d
d
H
o
l
e
(
)
method). The polygon and hole ver瑩ces are added by the 
a
d
d
(
)
method of the 
class. The occlusion representa瑩on must be set to 
the occluder node with the 
s
e
t
O
c
c
l
u
d
e
r
(
)
method:
5. 
We create a big geometry plane as the occlusion representa瑩on. To render its 
shape in the scene along with the massive occludees, we have to add the geometry 
that is created by 
as the occluder 
node's child:
)
;
Pdf file specification - Split, seperate PDF into multiple files in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Explain How to Split PDF Document in Visual C#.NET Application
break pdf documents; break a pdf file into parts
Pdf file specification - VB.NET PDF File Split Library: Split, seperate PDF into multiple files in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
VB.NET PDF Document Splitter Control to Disassemble PDF Document
pdf split pages in half; break apart a pdf in reader
Chapter 12
[
339 
]
6. 
When construc瑩ng the scene graph, the group node of the 100,000 objects and the 
occluder must be siblings under the same root node. We will also turn off ligh瑩ng 
here in order to focus on observing if there are any efficiency improvements using 
occluders. A晴er that, the 
is used to obtain scene 
sta瑩s瑩cs, and we can start the viewer:
r
e
t
u
r
n
v
i
e
w
e
r
.
r
u
n
(
)
;
7. 
Press the S key here to see the detailed frame rate. Drag the main camera with 
your le晴 mouse bu瑴on pressed to rotate the whole world in your eyes. The plane 
occluder can always cull away small quads that are totally hidden behind it, when 
looking from the current view point:
TIFF Image Viewer| What is TIFF
The TIFF specification contains two parts: Baseline TIFF (the core of an easy way to convert TIFF file formats into such as Bitmap, Png, Gif, Jpeg, PDF, MS-Word
break pdf into separate pages; pdf insert page break
C# Word: How to Generate Barcodes in C# Word with .NET Library
these supported 1d and 2d barcode types that can be easily inserted into MS Word file (.docx Create Micro PDF-417 in C# Word, Create Intelligent Mail in C# Word.
cannot select text in pdf; split pdf files
Improving Rendering Efficiency
[
340 
]
8. 
You may soon find that the maximum frame rate happens when the plane is 
completely in front of the eye point (as shown in the previous image), and the 
minimum one happens when the plane covers none of the massive number of 
quads (as shown in the following image):
W
h
a
t
j
u
s
t
h
a
p
p
e
n
e
d
?
Somebody may think of implemen瑩ng an algorithm that computes the occlusions between 
each of the two objects in the scene. Any object that may be hidden by one or more objects 
will thus be picked up and removed from the current drawing list. In this ideal situa瑩on, we 
don't need the concepts of occluders or occludes any more.
Unfortunately, this imagina瑩on is nearly impossible at present. An algorithmic approach 
to avoid inefficiency may cost too much in terms of speed. The previous example shows 
the 瑩me-cost of the culling work. The developer is working on a graphics system with the 
ver瑩cal synchroniza瑩on (V-sync) at 60 Hz. The maximum frame rate should therefore be 
equal or less than 60 fps (frames per second). But here the maximum frame rate (when the 
occluder plane hides all other quads totally) is only about 40 fps, because of the dissipa瑩on 
of comparing the plane with 100,000 objects. Thus, an actual ideal efficient occlusion culling 
algorithm must perform simple enough tests, a limited number of 瑩mes.
DocImage SDK for .NET: Web Document Image Viewer Online Demo
Microsoft PowerPoint: PPTX, PPS, PPSX; PDF: Portable Document Format; TIFF: Tagged Image File Format; XPS: XML Paper Specification. Supported Browers: IE9+;
can't cut and paste from pdf; c# split pdf
VB.NET TWAIN: Overview of TWAIN Image Scanning in VB.NET
It includes the specification, data source manager and sample code. scan many pages into TIFF document file using your for scanning many pages into PDF document
split pdf; break pdf file into multiple files
Chapter 12
[
341 
]
Have a go hero – adding holes to the occluder
The 
class, which is the occlusion representa瑩on 
of 
o
s
g
:
:
O
c
c
l
u
d
e
r
N
o
d
e
, accepts the 
variable as 
the clipping component (via the 
s
e
t
O
c
c
l
u
d
e
r
(
)
method). Besides, it also accepts a 
number of holes to increase the complexity of the representa瑩on. Use the 
a
d
d
H
o
l
e
(
)
method with an 
parameter to configure the 
object, and don't forget to update the corresponding 
geometry representa瑩on, which is o晴en placed as the child of the occlude node.
Improving your application
There are a lot of tricks to improve the rendering performance of applica瑩ons with a large 
amount of data. But the essence of them is easy to understand: the smaller the number 
of resources (geometries, display lists, texture objects, and so on) allocated, the faster and 
smoother the user applica瑩on is.
There are lots of ideas on how to find the bo瑴leneck of an inefficient applica瑩on. For 
example, you can replace certain objects by simple boxes, or replace textures in your 
applica瑩on by 1x1 images to see if the performance can increase, thanks to the reduc瑩on of 
geometries and texture objects. The sta瑩s瑩cs class (
, or press 
the S key in the 
o
s
g
v
i
e
w
e
r
) can also provide helpful informa瑩on.
To achieve a less-enough scene resource, we can refer to the following table and try to 
op瑩mize our applica瑩ons if they are not running in good shape:
Problem
Influence
Possible solu瑩on
Too many geometries
Low frame rate and 
huge resource cost
Use LOD and culling techniques to reduce 
the ver瑩ces of the drawables.
Use primi瑩ve sets and the index mechanism 
rather than duplicate ver瑩ces.
Merge geometries into one, if possible. This 
is because one geometry object allocates 
one display list, and too many display lists 
occupy too much of the video memory.
Share geometries, ver瑩ces, and nodes as 
o晴en as possible.
C# Imaging - C# Code 128 Generation Guide
add minimum left and right margins that go with specification. to a bitmap and save it to image file //Bitmap bmp Create Code 128 on PDF, Multi-Page TIFF, Word
break pdf into multiple documents; break a pdf into smaller files
XImage.Barcode Generator for .NET, Technical Information Details
PDF to Tiff; C#: Convert PDF to HTML; C#: Convert PDF to Jpeg; C# File: Compress PDF; C# File: Merge PDF; C# File: Split PDF; C# Page: Insert
acrobat split pdf bookmark; split pdf into individual pages
Improving Rendering Efficiency
[
342 
]
Problem
Influence
Possible solu瑩on
Too many 
dynamic objects 
(configured  with the 
s
e
t
D
a
t
a
V
a
r
i
a
n
c
e
(
)
method)
Low frame rate 
because the 
D
R
A
W
phase must wait 
un瑩l all dynamic 
objects finish 
upda瑩ng
Don't use the 
D
Y
N
A
M
I
C
flag on nodes and 
drawables that do not need to be modified 
on the fly.
Don't set the root node to be dynamic unless 
you are sure that you require this, because 
data variance can be inherited in the scene 
graph.
Too many texture objects
Low frame rate and 
huge resource cost
Share rendering states and textures as 
much as you can. Lower the resolu瑩on and 
compress them using the DXTC format if 
possible.
Use  to 
handle non-power-of-two sized textures, and 
o
s
g
:
:
T
e
x
t
u
r
e
2
D
for regular 2D textures.
Use LOD to simplify and manage nodes with 
large-sized textures.
The scene graph structure 
is "loose", that is, nodes 
are not grouped together 
effec瑩vely.
Very high cull and 
draw 瑩me, and 
many redundant 
state changes
If there are too many parent nodes, each 
with only one child, which means the scene 
has as many group nodes as leaf nodes, and 
even as many drawables as leaf nodes, the 
performance will be totally ruined.
You should rethink your scene graph and 
group nodes that have close features and 
behaviors more effec瑩vely.
Loading and unloading 
resources too frequently
Lower and lower 
running speed and 
wasteful memory 
fragmenta瑩on
Use the buffer pool to allocate and release 
resources. OSG has already done this to 
textures and buffer objects, by default.
An addi瑩onal helper is the 
o
s
g
U
t
i
l
:
:
O
p
t
i
m
i
z
e
r
class. This can traverse the scene graph 
before star瑩ng the simula瑩on loop and do different kinds of op瑩miza瑩ons in order to 
improve efficiency, including removing redundant nodes, sharing duplicated states, checking 
and merging geometries, op瑩mizing texture se瑴ngs, and so on. You may start the op瑩mizing 
opera瑩on with the following code segment:
Some parts of the op瑩mizer are op瑩onal. You can see the header file 
i
n
c
l
u
d
e
/
o
s
g
U
t
i
l
/
O
p
t
i
m
i
z
e
r
for details.
XImage.Twain for .NET, Technical Information Details
PDF to Tiff; C#: Convert PDF to HTML; C#: Convert PDF to Jpeg; C# File: Compress PDF; C# File: Merge PDF; C# File: Split PDF; C# Page: Insert
pdf split; break pdf password online
XImage.OCR for .NET, Technical Information Details
PDF to Tiff; C#: Convert PDF to HTML; C#: Convert PDF to Jpeg; C# File: Compress PDF; C# File: Merge PDF; C# File: Split PDF; C# Page: Insert
c# print pdf to specific printer; break pdf password
Chapter 12
[
343 
]
Time for action – sharing textures with a customized callback
We would like to explain the importance of scene op瑩miza瑩on by providing an extreme 
situa瑩on where massive textures are allocated without sharing the same ones. We have a basic 
solu瑩on to collect and reuse loaded images in a file reading callback, and then share all textures 
that use the same image object and have the same parameters. The idea of sharing textures 
can be used to construct massive scene graphs, such as digital ci瑩es; otherwise, the video card 
memory will soon be eaten up and thus cause the whole applica瑩on to slow down and crash.
1. 
Include the necessary headers:
2. 
The func瑩on for quickly producing massive data can be used in this example, once 
more. This 瑩me we will apply a texture a瑴ribute to each quad. That means that we 
are going to have a huge number of geometries, and the same amount of texture 
objects, which will be a heavy burden for rendering the scene smoothly:
{
{
)
;
XImage.Barcode Reader for .NET, Technical Information Details
PDF to Tiff; C#: Convert PDF to HTML; C#: Convert PDF to Jpeg; C# File: Compress PDF; C# File: Merge PDF; C# File: Split PDF; C# Page: Insert
pdf rotate single page; split pdf into multiple files
VB Imaging - Micro PDF 417 VB Barcode Generation
Micro PDF-417 barcode symbol, which is compatible with established ISO/IEC barcode specification and standard VB Code to Create Micro PDF 417 on PPTX File.
acrobat separate pdf pages; how to split pdf file by pages
Improving Rendering Efficiency
[
344 
]
}
}
3. 
The 
func瑩on is, of course, awkward and ineffec瑩ve 
here. However, it demonstrates a common situa瑩on: assuming that an applica瑩on 
needs to o晴en load image files and create texture objects on the fly, it is necessary 
to check if an image has been loaded already and then share the corresponding 
textures automa瑩cally. The memory occupancy will be obviously reduced if there 
are plenty of textures that are reusable. To achieve this, we should first record 
all loaded image filenames, and then create a map that saves the corresponding 
o
s
g
:
:
I
m
a
g
e
objects.
4. 
Whenever a new 
r
e
a
d
I
m
a
g
e
F
i
l
e
(
)
request arrives, the 
o
s
g
D
B
:
:
R
e
g
i
s
t
r
y
instance will try using a preset 
to perform 
the actual loading work. If the callback doesn't exist, it will call the 
to choose an appropriate plug-in that will 
load the image and return the resultant object. Therefore, we can take over the 
reading image process by inheri瑩ng the 
class and 
implemen瑩ng a new func瑩onality that compares the filename and re-uses the 
exis瑩ng image objects, with the customized 
g
e
t
I
m
a
g
e
B
y
N
a
m
e
(
)
func瑩on:
{
p
u
b
l
i
c
:
)
;
 protected:
{
 }   
I
m
a
g
e
M
a
p
;
}
;
Chapter 12
[
345 
]
5. 
The 
r
e
a
d
I
m
a
g
e
(
)
method should be overridden to replace the current reading 
implementa瑩on. It will return the previously-imported instance if the filename 
matches an element in the 
_
i
m
a
g
e
M
a
p
, and will add any newly-loaded image 
object and its name to 
_
i
m
a
g
e
M
a
p
, in order to ensure that the same file won't be 
imported again:
g
e
(
{
i
f
(
!
i
m
a
g
e
)
{
r
e
t
u
r
n
r
r
;
 }   return image;
}
6. 
Now we get into the main entry. The file-reading callback is set by the 
method of the 
o
s
g
D
B
:
:
R
e
g
i
s
t
r
y
class, which 
is designed as a singleton. Meanwhile, we have to enable another important  
run-瑩me op瑩mizer, named 
, that can be defined 
by 
or 
The la瑴er will assign a default instance to the registry:
7. 
Create the massive scene graph. It consists of two groups of quads, each of which 
uses a unified image file to decorate the quad geometry. In total, 1,000 quads will 
be created, along with 1,000 newly-allocated textures. Certainly, there are too many 
redundant texture objects (because they are generated from only two image files) in 
this case:
Improving Rendering Efficiency
[
346 
]
8. 
The 
is used for maximizing the reuse of textures 
and state sets. It is actually a node visitor, traversing all child nodes' state sets and 
comparing them when the 
s
h
a
r
e
(
)
method is invoked. State sets and textures with 
the same a瑴ributes and data will be combined into one:
9. 
Finalize the viewer:
r
e
t
u
r
n
v
i
e
w
e
r
.
r
u
n
(
)
;
10. 
Now the applica瑩on starts with a large number of textured quads. With 
the 
sharing image objects, and the 
sharing textures, the rendering process can work 
without a hitch. Try commen瑩ng out the lines of 
and 
and restart the applica瑩on, and then see 
what has happened. The Windows Task Manager is helpful in displaying the amount 
of currently-used memory here:
Chapter 12
[
347 
]
W
h
a
t
j
u
s
t
h
a
p
p
e
n
e
d
?
You may be curious about the implementa瑩on of 
. It 
collects rendering states and textures that firstly appear in the scene graph, and then 
replaces duplicated states of successive nodes with the recorded ones. It compares two 
states' member a瑴ributes in order to decide whether the new state should be recorded 
(because it's not the same as any of the recorded ones) or replaced (because it is a 
duplica瑩on of the previous one).
For texture objects, the 
o
s
g
D
B
:
:
S
h
a
r
e
d
S
t
a
t
e
M
a
n
a
g
e
r
will determine if they are exactly 
the same by checking the 
d
a
t
a
(
)
pointer of the 
o
s
g
:
:
I
m
a
g
e
object, rather than by 
comparing every pixel of the image. Thus, the customized 
R
e
a
d
A
n
d
S
h
a
r
e
I
m
a
g
e
C
a
l
l
b
a
c
k
class is used here to share image objects with the same filename first, and the 
o
s
g
D
B
:
:
S
h
a
r
e
d
S
t
a
t
e
M
a
n
a
g
e
r
shares textures with the same image object and 
other a瑴ributes.
The 
also makes use of 
to share 
states of external scene graphs when dynamically loading and unloading paged nodes. This is 
done automa瑩cally if 
is executed.
Have a go hero – sharing public models
Can we also share models with the same name in an applica瑩on? The answer is absolutely 
yes. The 
could be used again by overriding the virtual method 
r
e
a
d
N
o
d
e
(
)
. Other prepara瑩ons include a member 
s
t
d
:
:
m
a
p
for recording filename and 
node pointer pairs, and a user-defined 
g
e
t
N
o
d
e
B
y
N
a
m
e
(
)
method as we have just done in 
the last example.
Paging huge scene data
Are you s瑩ll struggling with the op瑩miza瑩on of huge scene data? Don't always pay a瑴en瑩on 
to the rendering API itself. There is no "super" rendering engine in the world that can work 
with unlimited datasets. Consider using the scene paging mechanism at this 瑩me, which can 
load and unload objects according to the current viewport and frustum. It is also important 
to design a be瑴er structure for indexing regions of spa瑩al data, like quad-treeoctree
R-tree, and the binary space par瑩瑩oning (BSP).
Documents you may be interested
Documents you may be interested