common: ++optimization

replace dynamic_cast to static_cast,

This can be a controversial choice between optmization and clean code.

Obviously we know the converting types,
try avoiding a bit heavier casting some cases.

Change-Id: Id763e6d1db449a229a492ab5b1a901a195936152
This commit is contained in:
Hermet Park 2020-06-09 20:17:39 +09:00
parent 58de99aea3
commit 498a024df8
10 changed files with 66 additions and 23 deletions

View file

@ -50,16 +50,23 @@ protected: \
A() = delete; \
~A() = delete
#define _TIZENVG_IDENTIFIER(A) \
protected: \
unsigned A##_Id
namespace tvg
{
class RenderMethod;
class Scene;
class Canvas;
enum class TIZENVG_EXPORT Result { Success = 0, InvalidArguments, InsufficientCondition, FailedAllocation, MemoryCorruption, Unknown };
enum class TIZENVG_EXPORT PathCommand { Close = 0, MoveTo, LineTo, CubicTo };
enum class TIZENVG_EXPORT StrokeCap { Square = 0, Round, Butt };
enum class TIZENVG_EXPORT StrokeJoin { Bevel = 0, Round, Miter };
class RenderMethod;
class Scene;
struct Point
{
@ -85,6 +92,10 @@ public:
virtual Result translate(float x, float y) = 0;
virtual Result bounds(float* x, float* y, float* w, float* h) const = 0;
_TIZENVG_IDENTIFIER(Paint);
_TIZENVG_DECLARE_ACCESSOR(Scene);
_TIZENVG_DECLARE_ACCESSOR(Canvas);
};

View file

@ -109,7 +109,8 @@ uint32_t GlRenderer::ref()
GlRenderer* GlRenderer::inst()
{
return dynamic_cast<GlRenderer*>(RenderInitializer::inst(renderInit));
//We know renderer type, avoid dynamic_cast for performance.
return static_cast<GlRenderer*>(RenderInitializer::inst(renderInit));
}

View file

@ -151,7 +151,8 @@ uint32_t SwRenderer::ref()
SwRenderer* SwRenderer::inst()
{
return dynamic_cast<SwRenderer*>(RenderInitializer::inst(renderInit));
//We know renderer type, avoid dynamic_cast for performance.
return static_cast<SwRenderer*>(RenderInitializer::inst(renderInit));
}
#endif /* _TVG_SW_RENDERER_CPP_ */

View file

@ -53,9 +53,12 @@ struct Canvas::Impl
assert(renderer);
for (auto paint : paints) {
if (auto scene = dynamic_cast<Scene*>(paint)) {
if (paint->Paint_Id == PAINT_ID_SCENE) {
//We know renderer type, avoid dynamic_cast for performance.
auto scene = static_cast<Scene*>(paint);
if (!SCENE_IMPL->clear(*renderer)) return Result::InsufficientCondition;
} else if (auto shape = dynamic_cast<Shape*>(paint)) {
} else {
auto shape = static_cast<Shape*>(paint);
if (!SHAPE_IMPL->dispose(*shape, *renderer)) return Result::InsufficientCondition;
}
delete(paint);
@ -70,9 +73,12 @@ struct Canvas::Impl
assert(renderer);
for(auto paint: paints) {
if (auto scene = dynamic_cast<Scene*>(paint)) {
if (paint->Paint_Id == PAINT_ID_SCENE) {
//We know renderer type, avoid dynamic_cast for performance.
auto scene = static_cast<Scene*>(paint);
if (!SCENE_IMPL->update(*renderer, nullptr)) return Result::InsufficientCondition;
} else if (auto shape = dynamic_cast<Shape*>(paint)) {
} else {
auto shape = static_cast<Shape*>(paint);
if (!SHAPE_IMPL->update(*shape, *renderer, nullptr)) return Result::InsufficientCondition;
}
}
@ -83,9 +89,12 @@ struct Canvas::Impl
{
assert(renderer);
if (auto scene = dynamic_cast<Scene*>(paint)) {
if (paint->Paint_Id == PAINT_ID_SCENE) {
//We know renderer type, avoid dynamic_cast for performance.
auto scene = static_cast<Scene*>(paint);
if (!SCENE_IMPL->update(*renderer)) return Result::InsufficientCondition;
} else if (auto shape = dynamic_cast<Shape*>(paint)) {
} else {
auto shape = static_cast<Shape*>(paint);
if (!SHAPE_IMPL->update(*shape, *renderer)) return Result::InsufficientCondition;
}
return Result::Success;
@ -99,9 +108,12 @@ struct Canvas::Impl
if (!renderer->clear()) return Result::InsufficientCondition;
for(auto paint: paints) {
if (auto scene = dynamic_cast<Scene*>(paint)) {
if (paint->Paint_Id == PAINT_ID_SCENE) {
//We know renderer type, avoid dynamic_cast for performance.
auto scene = static_cast<Scene*>(paint);
if(!SCENE_IMPL->render(*renderer)) return Result::InsufficientCondition;
} else if (auto shape = dynamic_cast<Shape*>(paint)) {
} else {
auto shape = static_cast<Shape*>(paint);
if(!SHAPE_IMPL->render(*shape, *renderer)) return Result::InsufficientCondition;
}
}

View file

@ -31,6 +31,9 @@ using namespace tvg;
#define SCENE_IMPL scene->pImpl.get()
#define SHAPE_IMPL shape->pImpl.get()
#define PAINT_ID_SHAPE 0
#define PAINT_ID_SCENE 1
#include "tvgRenderCommon.h"
#include "tvgShapePath.h"
#include "tvgShapeImpl.h"

View file

@ -47,7 +47,8 @@ GlCanvas::~GlCanvas()
Result GlCanvas::target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t h) noexcept
{
auto renderer = dynamic_cast<GlRenderer*>(Canvas::pImpl.get()->renderer);
//We know renderer type, avoid dynamic_cast for performance.
auto renderer = static_cast<GlRenderer*>(Canvas::pImpl.get()->renderer);
if (!renderer) return Result::MemoryCorruption;
if (!renderer->target(buffer, stride, w, h)) return Result::Unknown;

View file

@ -25,7 +25,7 @@
Scene::Scene() : pImpl(make_unique<Impl>())
{
Paint_Id = PAINT_ID_SCENE;
}

View file

@ -39,9 +39,12 @@ struct Scene::Impl
bool clear(RenderMethod& renderer)
{
for (auto paint : paints) {
if (auto scene = dynamic_cast<Scene*>(paint)) {
if (paint->Paint_Id == PAINT_ID_SCENE) {
//We know renderer type, avoid dynamic_cast for performance.
auto scene = static_cast<Scene*>(paint);
if (!SCENE_IMPL->clear(renderer)) return false;
} else if (auto shape = dynamic_cast<Shape*>(paint)) {
} else {
auto shape = static_cast<Shape*>(paint);
if (!SHAPE_IMPL->dispose(*shape, renderer)) return false;
}
delete(paint);
@ -54,9 +57,12 @@ struct Scene::Impl
bool updateInternal(RenderMethod &renderer, const RenderTransform* transform, uint32_t flag)
{
for(auto paint: paints) {
if (auto scene = dynamic_cast<Scene*>(paint)) {
if (paint->Paint_Id == PAINT_ID_SCENE) {
//We know renderer type, avoid dynamic_cast for performance.
auto scene = static_cast<Scene*>(paint);
if (!SCENE_IMPL->update(renderer, transform, flag)) return false;
} else if (auto shape = dynamic_cast<Shape*>(paint)) {
} else {
auto shape = static_cast<Shape*>(paint);
if (!SHAPE_IMPL->update(*shape, renderer, transform, flag)) return false;
}
}
@ -91,9 +97,12 @@ struct Scene::Impl
bool render(RenderMethod &renderer)
{
for(auto paint: paints) {
if (auto scene = dynamic_cast<Scene*>(paint)) {
if (paint->Paint_Id == PAINT_ID_SCENE) {
//We know renderer type, avoid dynamic_cast for performance.
auto scene = static_cast<Scene*>(paint);
if(!SCENE_IMPL->render(renderer)) return false;
} else if (auto shape = dynamic_cast<Shape*>(paint)) {
} else {
auto shape = static_cast<Shape*>(paint);
if(!SHAPE_IMPL->render(*shape, renderer)) return false;
}
}
@ -113,9 +122,12 @@ struct Scene::Impl
auto w2 = 0.0f;
auto h2 = 0.0f;
if (auto scene = dynamic_cast<Scene*>(paint)) {
if (paint->Paint_Id == PAINT_ID_SCENE) {
//We know renderer type, avoid dynamic_cast for performance.
auto scene = static_cast<Scene*>(paint);
if (!SCENE_IMPL->bounds(&x2, &y2, &w2, &h2)) return false;
} else if (auto shape = dynamic_cast<Shape*>(paint)) {
} else {
auto shape = static_cast<Shape*>(paint);
if (!SHAPE_IMPL->bounds(&x2, &y2, &w2, &h2)) return false;
}

View file

@ -32,6 +32,7 @@ constexpr auto PATH_KAPPA = 0.552284f;
Shape :: Shape() : pImpl(make_unique<Impl>())
{
Paint_Id = PAINT_ID_SHAPE;
}

View file

@ -47,7 +47,8 @@ SwCanvas::~SwCanvas()
Result SwCanvas::target(uint32_t* buffer, uint32_t stride, uint32_t w, uint32_t h) noexcept
{
auto renderer = dynamic_cast<SwRenderer*>(Canvas::pImpl.get()->renderer);
//We know renderer type, avoid dynamic_cast for performance.
auto renderer = static_cast<SwRenderer*>(Canvas::pImpl.get()->renderer);
if (!renderer) return Result::MemoryCorruption;
if (!renderer->target(buffer, stride, w, h)) return Result::InvalidArguments;